下面的示例是分析在线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
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:\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#;
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日志
第一个日志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',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;