『ORACLE』日志挖掘(11g)

来源:互联网 发布:其皆出于此乎句式 编辑:程序博客网 时间:2024/06/13 22:13
1、启动最小补充日志,和无条件主键补充日志,
alter database add supplemental log data;
alter database add supplemental log data (primary key) columns;
2、字典来源:源库日志字典,源库在线数据字典。
   (1)源库日志字典:调用dbms_logmnr_d.build存储过程把LogMiner字典提取到源库的重做日志。
   begin 
    dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);
   End;
/


下面查询日志日志字典存储位置
 Select sequence#,name,dictionary_begin,dictionary_end from v$archived_log where dictionary_begin='YES' or dictionary_end='YES';
    (2)源库在线数据字典作为LogMiner字典时,直接在启动日志挖掘时通过start_logmnr过程的options参数指定。
      如
     begin 
      dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
     end;
 /


做破坏,然后使用日志挖掘修复。

select ename,sal from scott.emp where deptno=30;
update scott.emp set  sal=sal/2 where deptno=30;
commit;
select ename,sal from scott.emp where deptno=30;



3 注册重做日志。
  (1)手动注册。
    begin
     dbms_logmnr.add_logfile(
     logfilename=>’/u01/app/oracle/o1_mf_1_138_3f3303_.arc’,
     options=>dbms_logmnr.addfile);
    end;
 /


反复执行可以增加多个归档日志,如果采用日志字典,则需要注册日志字典所在日志。
  (2)自动注册。
    使用dbms_logmnr.start_logmnr启动挖掘会话时,使用options参数说明即可,比手动注册方便多了。
   如
  a.以时间戳计算时间窗口
begin
  dbms_logmnr.start_logmnr(
   starttime=>to_date(’20170609 09:00:00’,’yyyymmdd hh24:mi:ss’),
   endtime=>to_date(’20170609 09:10:00’,’yyyymmdd hh24:mi:ss’),
   options=> dbms_logmnr.dict_from_online_catalog+dbms_logmnr.continuous_mine);
end;
/
 b.利用以SCN计算时间窗口  
begin
  dbms_logmnr.start_logmnr(
   startscn=>。。。,
   endscn=>。。。,
   options=> dbms_logmnr.dict_from_online_catalog+dbms_logmnr.continuous_mine);
end;
/
 自动注册的限制:挖掘库与源库必须是同一个库。必须指定时间窗口,控制文件内必须具有所需日志记录—可以搜索v$archived_log和v$logfile显示的范围。


4 启动挖掘:此时需要调用dbms_logmnr.start_logmnr,它需要预先知道两件事:如何提供LogMiner字典(源库在线数据字典or日志字典)和是否注册了日志(手动自动)。
  示例1:源库在线数据字典,之前已经手工注册了日志。
 begin
     dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
 end;
/


 示例2 源库在线数据字典  ,日志自动注册。
begin
  dbms_logmnr.start_logmnr(
   startscn=>。。。,
   endscn=>。。。,
   options=> dbms_logmnr.dict_from_online_catalog+dbms_logmnr.continuous_mine);
end;
/


begin
  dbms_logmnr.start_logmnr(
   starttime=>to_date(’20170609 09:00:00’,’yyyymmdd hh24:mi:ss’),
   endtime=>to_date(’20170609 09:10:00’,’yyyymmdd hh24:mi:ss’),
   options=> dbms_logmnr.dict_from_online_catalog+dbms_logmnr.continuous_mine);
end;
/


示例3 日志字典作为LogMiner字典启动挖掘会话,之前已经注册了包含日志字典的日志和需要挖掘的日志。


begin
  dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_redo_logs);
end;
/


示例4 日志字典作为LogMiner字典启动挖掘会话 自动注册。
begin
  dbms_logmnr.start_logmnr(
   startscn=>2121813,
   endscn=>2126140,
   options=> dbms_logmnr.dict_from_redo_logs+dbms_logmnr.continuous_mine);
end;
/




完整示例:
#### manually register redo logfile,maybe need scn related to archived log;
 select name,sequence#,first_change#,last_change# from v$archived_log;
SQL> select group#,first_change#,next_change# ,status from v$log ;


    GROUP# FIRST_CHANGE# NEXT_CHANGE# STATUS
---------- ------------- ------------ ----------------
 1  2245104      2261729 INACTIVE
 2  2261729      2272294 INACTIVE
 3  2272294   2.8147E+14 CURRENT




###find redo record in controlfile through v$archived_log,v$logfile;


begin
  dbms_logmnr.start_logmnr(
   startscn=>。。。,
   endscn=>。。。,
   options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.continuous_mine);
end;
/



### miner redolog
select '('||rownum||')' as sql#,sql_redo from v$logmnr_contents where seg_owner='SCOTT' and seg_name='EMP' and  sql_redo like 'update%';


###find redo_sql and undo_sql 
begin
for rec in
(select sql_undo from v$logmnr_contents where seg_owner='SCOTT' and seg_name='EMP' and  sql_redo like 'update%')
loop 
if rec.sql_undo is not null then
execute immediate substr(rec.sql_undo,1,length(rec.sql_undo)-1);
end if;
end loop;
commit;
end;
/
原创粉丝点击