Oracle 11g logminer解析redo日志
下面的示例是分析在线redo日志,分析归档redo日志过程也是如此。Toad 里面也集成了logminer的功能。 SQL> select * from v$version; 1.用sys账号建立一个logminer的用户,授予sysdba的权限 create user LOGMINER identifiedby "LOGMINER" defaulttablespace LCAM_PUB_TBS--表空间依据当前数据库的情况而定 temporarytablespace TEMP profileDEFAULT; grant connect to LOGMINER; grant resource to LOGMINER; grant sysdba to LOGMINER; 2.用logminer用户执行两个Oracle脚本,生成一些logminer的package,确保数据库打开辅助日志 SQL> @F:appAdministratorproduct11.2.0dbhome_1RDBMSADMINdbmslm.sql SQL> @F:appAdministratorproduct11.2.0dbhome_1RDBMSADMINdbmslmd.sql SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database; SUPPLEME -------- NO SQL> alter database add supplemental log data; SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database; SUPPLEME -------- YES 3.用logminer用户设置utl_file_dir,并且确定有这个目录存在,有必要建一下文件夹LOGMNR alter system set utl_file_dir='/oracle/oradata/oradb11/LOGMNR' scope=spfile; 4. 查看归档redo组 Status为current为当前启用的在线日志,为了试验简洁,我只分析当前的日志。 SQL> select l.STATUS,s.MEMBER from v$log l,v$logfile s where l.GROUP# = s.GROUP#; STATUSMEMBER ---------------- -------------------------------------------------- INACTIVE/oracle/oradata/oradb11/redo04.log CURRENT/oracle/oradata/oradb11/redo05.log INACTIVE/oracle/oradata/oradb11/redo06.log 5. 在L_PUB上执行测试场景的脚本(自行找测试用户) 记录操作开始时间和结束时间。 select sysdate from dual;--2017/3/6 11:00:19 create table test(id number,name varchar2(100)); insert into test values(1,'张三'); insert into test values(2,'李四'); commit; insert into test values(3,'王五'); rollback; insert into test values(4,'赵六'); insert into test values(5,'冯七'); insert into test values(6,'刘八'); insert into test values(7,'廖九'); commit; update test set name='刘八八' where id=6; commit; delete from test where id=7; rollback; delete from test where id=1; commit; select sysdate from dual;--2017/3/6 11:02:05 6.用logminer用户生成数据字典,需要保证dictionary_location所指定的目录存在 execute dbms_logmnr_d.build(dictionary_filename =>'dictionary.ora',dictionary_location =>'/oracle/oradata/oradb11/LOGMNR'); 7. 用logminer用户添加分析的redo日志 exec dbms_logmnr.add_logfile(logfilename=>'/oracle/oradata/oradb11/redo05.log',options=>dbms_logmnr.new); dbms_logmnr.add_logfile(logfilename=>'/oracle/oradata/oradb11/redo06.log',options=>dbms_logmnr.addfile); execute dbms_logmnr.add_logfile(logfilename=>'/oracle/oradata/oradb11/redo06.log',options=>dbms_logmnr.addfile); 8. 用logminer用户启动logminer 启动的方式有多种: 全分析,execute dbms_logmnr.start_logmnr(DictFileName=>'/oracle/oradata/oradb11/LOGMNR/dictionary.ora'); 按时间段来分析,execute dbms_logmnr.start_logmnr(startTime => to_date('2017-03-06 11:00:18','yyyy-mm-dd hh24:mi:ss'),endTime => to_date('2017-03-06 11:02:06',DictFileName => '/oracle/oradata/oradb11/LOGMNR/dictionary.ora'); 9. 用logminer用户logminer分析处理的结果只有本session能看到,可以先用表把数据记录然后分析 Drop table logminer_t purge; Create table logminer_tas select * fromV$LOGMNR_CONTENTS; 10. 用logminer用户分析后释放内存 execute dbms_logmnr.end_logmnr; 11. 用logminer用户可以慢慢分析 Select S.SCN, s.start_scn, S.COMMIT_SCN, S.TIMESTAMP, s.START_TIMESTAMP, S.COMMIT_TIMESTAMP, S.OPERATION, S.ROLLBACK, S.SEG_OWNER, S.SEG_NAME, S.TABLE_NAME, S.TABLE_SPACE, S.SQL_REDO, S.SQL_UNDO Fromlogminer_ts where s.SEG_OWNER = 'L_PUB' ands.table_name = 'TEST' order by scn; 我们可以捕获到执行的SQL:
以下是提交事务的SQL,同步的时候可以用到: with co_scn as( select start_scn,commit_scn fromlogminer_t s where s.start_scn is not null ands.commit_scn is not null), operate_scn as( Select scn,s.sql_redoFrom logminer_t s where s.SEG_OWNER = 'L_PUB' ands.table_name = 'TEST' ) Select scn,sql_redo Fromoperate_scn s,co_scn co where s.scn >= co.start_scn ands.scn <= co.commit_scn;
以下是回滚的SQL,同步时可以忽略: select S.SCN, S.SQL_REDOfrom logminer_t s where pxid in (select pxid from logminer_t where rollback=1 and SEG_OWNER = 'LCAM_PUB') order by scn;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |