Oracle 11g logminer解析redo日志

下面的示例是分析在线redo日志,分析归档redo日志过程也是如此。Toad 里面也集成了logminer的功能。

SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

1. 用sys账号建立一个logminer的用户,授予sysdba的权限

create user LOGMINER

  identified by "LOGMINER"

  default tablespace LCAM_PUB_TBS --表空间依据当前数据库的情况而定

  temporary tablespace TEMP

  profile DEFAULT;

grant connect to LOGMINER;

grant resource to LOGMINER;

grant sysdba to LOGMINER;

2. 用logminer用户执行两个Oracle脚本,生成一些logminer的package,确保数据库打开辅助日志

SQL> @F:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\dbmslm.sql

SQL> @F:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\dbmslmd.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#;

STATUS           MEMBER

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

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日志
第一个日志options=>dbms_logmnr.new,后面的options=>dbms_logmnr.addfile。

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','yyyy-mm-dd hh24:mi:ss'),DictFileName => '/oracle/oradata/oradb11/LOGMNR/dictionary.ora');

9. 用logminer用户logminer分析处理的结果只有本session能看到,可以先用表把数据记录然后分析

Drop table logminer_t purge;

Create table logminer_t  as select * from V$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

  From logminer_t s

 where s.SEG_OWNER = 'L_PUB'

   and s.table_name = 'TEST'

 order by scn;

我们可以捕获到执行的SQL:

以下是提交事务的SQL,同步的时候可以用到:

with co_scn as(

select start_scn,commit_scn

  from logminer_t s

 where s.start_scn is not null

    and s.commit_scn is not null),

operate_scn as(

Select scn,s.sql_redo  From logminer_t s

 where s.SEG_OWNER = 'L_PUB'

   and s.table_name = 'TEST'

)

Select scn,sql_redo

  From operate_scn s, co_scn co

 where s.scn >= co.start_scn

   and s.scn <= co.commit_scn;

以下是回滚的SQL,同步时可以忽略:

select S.SCN,

       S.TIMESTAMP,

       S.OPERATION,

       S.ROLLBACK,

       S.SEG_OWNER,

       S.SEG_NAME,

       S.TABLE_NAME,

       S.SQL_REDO from logminer_t s where pxid in

(select pxid from logminer_t where rollback=1 and SEG_OWNER = 'LCAM_PUB')

order by scn;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值