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;
/
(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;
/
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;
/
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;
(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;
/
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;
/