今天学习了一下oracle日志挖掘,搞了大半天终于完成了
安装包位置:
[oracle@oracle ~]$ ls /u01/11g/rdbms/admin/dbmslm*
/u01/11g/rdbms/admin/dbmslmd.sql /u01/11g/rdbms/admin/dbmslms.sql
/u01/11g/rdbms/admin/dbmslm.sql
归档日志挖掘:
第一步查看utl_file_dir参数
show parameter utl_file_dir
SQL> show parameter utl_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir string /u01/dblog
路径为/u01/dblog
如果没有路径执行:
alter system set utl_file_dir='/u01/dblog' scope=spfile;
shutdown immediate
startup
第二步:查看归档日志
执行一堆dml,ddl语句
切换日志,让他归档
alter system switch logfile;
查看日志文件
select * from v$logfile;
查看日志文件
select name from v$archived_log;
第三步:创建日志挖掘的数据字典
execute dbms_logmnr_d.build(dictionary_filename=>'log.ora',dictionary_location=>'/u01/dblog',options=>dbms_logmnr_d.store_in_flat_file);
添加归档日志
第一个:new
exec dbms_logmnr.add_logfile('/u01/dblog/1_125_900858419.dbf',dbms_logmnr.new);
第二个:add
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_4_cl5x243j_.arc',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_5_cl5xyvsd_.arc',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_6_cl5ylh6p_.arc',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_7_cl5ylls4_.arc',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_8_cl5z4mq9_.arc',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_9_cl5z4of1_.arc',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/u01/oracle/fast_recovery_area/PU/archivelog/2016_04_29/o1_mf_1_10_cl60ym0m_.arc',dbms_logmnr.addfile);
第四步:开启日志挖掘
exec dbms_logmnr.start_logmnr(dictfilename=>'/u01/dblog/dict.ora');
第五步:查询
select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where seg_name='CRF_P2P_ACCOUNT_INFO' and seg_owner='CLSPUSER';
第六步:关闭日志挖掘
create table log_list as select * from v$logmnr_contents;(选作)
exec dbms_logmnr.end_logmnr;
第7步:关闭参数
alter system reset utl_file_dir scope=spfile sid='*';
redo日志挖掘:(可以采用第一种方法)
参数设置同上
第一步:dml,ddl语句操作
第二步:查看日志和日志组
select * from v$log;
select member from v$logfile;
第三步:开启日志挖掘
execute dbms_logmnr.add_logfile('/u01/oracle/oradata/pu/redo03.log');
execute dbms_logmnr.add_logfile('/u01/oracle/oradata/pu/redo02.log');
execute dbms_logmnr.add_logfile('/u01/oracle/oradata/pu/redo01.log');
第四步:进行挖掘
execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
第五步:找出日志
select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where seg_name='CRF_P2P_ACCOUNT_INFO'
第六步:关闭日志挖掘
create table log_redo as select * from v$logmnr_contents;(选作);
exec dbms_logmnr.end_logmnr;
看到itpub一篇帖子说用log mnr做基于日志同步,想了下这个还是很靠谱的,和我开始想到的trigger异曲同工之处
execute dbms_logmnr.add_logfile(LogFileName=>'/u01/oracle/fast_recovery_area/PU/archivelog/2016_05_04/o1_mf_1_37_clmgbzyl_.arc', options=>dbms_logmnr.new); -- 需要分析的log
execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.COMMITTED_DATA_ONLY+DBMS_LOGMNR.NO_ROWID_IN_STMT); --读取在线的字典,只有commit的语句才读出来,不要ROWID
set feedback off
set heading off
spool spool.tmp
SELECT sql_redo FROM v$logmnr_contents where seg_name ='TEST1'; --需要找些什么样的table就看自己了,条件自己把握。
execute dbms_logmnr.end_logmnr;
spool off
exit;
目前还在想如何实现,思路是这样的