日志挖掘概念:

结论如下:执行日志挖掘操作的可以使用DBA用户或SYSDBA用户,不能使用普通用户。


日志挖掘可以查看到当前用户自己的操作,也可以查看到其它用户的操作。


其它用户已经执行但未提交的操作,也可以查到。


可以挖掘到其它DBA用户或SYSDBA用户的操作。


-----有些语句的返回提示如下面一句连接后的“Connected.”这种为节约篇幅,删了。不要质疑哈哈。


对于DDL操作

:对于执行DDL前的操作无法挖掘,但是不报错。只显示DDL语句及DDL之后的DML操作。见:

logmnr挖掘中间有DDL的操作示例


BYS@ bys001>conn scott/tiger


Connected.


SCOTT@ bys001>desc v$logmnr_contents


ERROR:


ORA-04043: object "SYS"."V_$LOGMNR_CONTENTS" does not exist


证明普通用户不能使用日志挖掘,连这个视图都看不到的。


##############################################


实验1:使用SYSDBA用户对SYS用户进行日志挖掘


在SYSDBA用户下建表插入数据进行日志挖掘。


SCOTT@ bys001>conn / as sysdba


Connected.


SYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


             

  14390465


SYS@ bys001>create table t(a number);


SYS@ bys001>insert into t values(1);


SYS@ bys001>commit;


SYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


  14390508

可以直接使用这样一条语句:select a.group#,a.member,b.status from v$logfile a,v$log b where a.group#=b.group#;

SYS@ bys001>select group#,status from v$log;


    GROUP# STATUS


---------- ----------------


         1 INACTIVE


         2 INACTIVE


         3 CURRENT


SYS@ bys001>col member for a50

SYS@ bys001>select group#,member,type from v$logfile;



    GROUP# MEMBER                                            TYPE


---------- -------------------------------------------------- -------


       

 3 /u01/app/oracle/oradata/bys001/redo03.log         ONLINE


         2 /u01/app/oracle/oradata/bys001/redo02.log         ONLINE


         1 /u01/app/oracle/oradata/bys001/redo01.log         ONLINE


         1 /u01/app/oracle/oradata/bys001/redo01a.log        ONLINE


SYS@ bys001>execute dbms_logmnr.add_logfile(LogFileName => '/u01/app/oracle/oradata/bys001/redo03.log',Options => dbms_logmnr.new);


PL/SQL procedure successfully completed.


SYS@ bys001>execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog,startscn =>14390465,endscn =>14390508);


PL/SQL procedure successfully completed.


SYS@ bys001>select operation,sql_redo,sql_undo from v$logmnr_contents where table_name='T';


OPERATION


--------------------------------


SQL_REDO


----------------------------------------------------------------------------------------------------


SQL_UNDO


----------------------------------------------------------------------------------------------------


DDL


create table t(a number);



INSERT


insert into "SYS"."T"("A") values ('1');

delete from "SYS"."T" where "A" = '1' and ROWID = 'AAASuWAABAAAVS5AAA';


#########################################################


实验二:使用SYSDBA用户对普通用户SCOTT下的操作进行挖掘

SYS@ bys001>conn scott/tiger


Connected.


SCOTT@ bys001>create table test(a number);


SCOTT@ bys001>select dbms_flashback.get_system_change_number from dual;


select dbms_flashback.get_system_change_number from dual


       *


ERROR at line 1:


ORA-00904: : invalid identifier    ---普通用户不能查询当前SCN


SCOTT@ bys001>conn / as sysdba


Connected.


SYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


               

14390661


开始插入一条数据。


SYS@ bys001>conn scott/tiger


Connected.


SCOTT@ bys001>insert into test values(3);


SCOTT@ bys001>commit;


SCOTT@ bys001>conn / as sysdba


Connected.


SYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


               

14390688


SYS@ bys001>execute dbms_logmnr.add_logfile(LogFileName =>

'/u01/app/oracle/oradata/bys001/redo03.log',Options => dbms_logmnr.new);


PL/SQL procedure successfully completed.


SYS@ bys001>execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog,

startscn =>14390661,endscn =>14390688);


PL/SQL procedure successfully completed.


SYS@ bys001>select operation,sql_redo,sql_undo from v$logmnr_contents where table_name='TEST';


OPERATION


--------------------------------


SQL_REDO


----------------------------------------------------------------------------------------------------


SQL_UNDO


----------------------------------------------------------------------------------------------------


INSERT


insert into "SCOTT"."TEST"("A") values ('3');

delete from "SCOTT"."TEST" where "A" = '3' and ROWID = 'AAASuXAAEAAAAlGAAA';


####################################################



实验三:使用SYSDBA,SCOTT用户插入数据不提交,可以挖掘到相应日志————也证明了commit和写日志的无关性。


这里需要使用两个会话,因为在同一个SQLPLUS会话下,切换用户会引起COMMIT。-----实验得出

会话一:查询出当前SCN


SYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


                14391177


会话二:使用SCOTT用户插入一条记录


SCOTT@ bys001>insert into test values(99);


SCOTT@ bys001>select * from test;


         A


----------


         3


       333


        99


会话一:记录当前SCN


SYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


                14391194


SYS@ bys001>execute dbms_logmnr.add_logfile(LogFileName => '/u01/app/oracle/oradata/bys001/redo03.log',Options => dbms_logmnr.new);


PL/SQL procedure successfully completed.


SYS@ bys001>execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog,startscn =>14391177,endscn =>14391194);


PL/SQL procedure successfully completed.


SYS@ bys001>select operation,sql_redo,sql_undo from v$logmnr_contents where table_name='TEST';


OPERATION


--------------------------------


SQL_REDO


----------------------------------------------------------------------------------------------------


SQL_UNDO


----------------------------------------------------------------------------------------------------


INSERT


insert into "SCOTT"."TEST"("A") values ('99');

delete from "SCOTT"."TEST" where "A" = '99' and ROWID = 'AAASuXAAEAAAAlGAAC';



会话二:回滚之前的插入,证明之前的插入确实是未提交的。


SCOTT@ bys001>rollback;


Rollback complete.


SCOTT@ bys001>select * from test;


         A


----------


         3


       333


##########################################################


实验四:使用普通DBA用户可以挖掘出SYS用户的操作

SYS@ bys001>conn bys/bys


Connected.


BYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


               

14391461


BYS@ bys001>conn / as sysdba


SYS@ bys001>insert into t values(9);


SYS@ bys001>commit;


SYS@ bys001>conn bys/bys


BYS@ bys001>select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER


------------------------


               

14391482


BYS@ bys001>execute dbms_logmnr.add_logfile

(LogFileName => '/u01/app/oracle/oradata/bys001/redo03.log',Options => dbms_logmnr.new);


PL/SQL procedure successfully completed.


BYS@ bys001>execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog

,startscn =>14391461,endscn =>14391482);


PL/SQL procedure successfully completed.


BYS@ bys001>select operation,

sql_redo,sql_undo from v$logmnr_contents where table_name='T';


OPERATION


--------------------------------


SQL_REDO


----------------------------------------------------------------------------------------------------


SQL_UNDO


----------------------------------------------------------------------------------------------------


INSERT


insert into "SYS"."T"("A") values ('9');


delete from "SYS"."T" where "A" = '9' and ROWID = 'AAASuWAABAAAVS5AAB';