--創(chuàng)建一個(gè)表來保存提取出來的sql
create table logmnr_content tablespace tools as scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents where 1=0;
--通過dba_objects 查到表對(duì)應(yīng)的 object_id and data_object_id ,用來在log中提取該表相關(guān)的sql_undo
select object_id,data_object_id from dba_objects where object_name = ???
--通過在os中找到的歸檔日志范圍,進(jìn)行聯(lián)機(jī)提取
將undo sql 插入一個(gè)表中,比如我的日志序號(hào)范圍是 5813 到 5850
為了防止臨時(shí)空間不足,一個(gè)一個(gè)歸檔日志文件處理。
begin
for i in 5813..5850 loop
dbms_logmnr.add_logfile(LogFileName=>'/disk2/oradata/arch/crmcn/crmcn_1_'||i||'.arc');
dbms_logmnr.start_logmnr(Options => sys.dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
dbms_logmnr.start_logmnr();
insert into logmnr_content(scn,cscn,TIMESTAMP,sql_undo )
select scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents
where DATA_OBJD# = 67540 ;
commit;
dbms_logmnr.end_logmnr();
end loop;
end;
--將提取出來的sql通過動(dòng)態(tài)sql執(zhí)行插入表
declare
sql_str varchar2(4000);
begin
for c in (select * from logmnr_content) loop
sql_str := replace(c.sql_undo,';','');
execute immediate sql_str;
end loop;
commit;
end;
注意:如果在這段日志中還有其他對(duì)該表的操作的話,可以結(jié)合操作類型 OPERATION 和 提交scn cscn 來判斷 到底是不是該恢復(fù)的這部分?jǐn)?shù)據(jù)。
轉(zhuǎn)自:http://www.itpub.net/thread-324926-1-1.html
posted on 2011-06-19 02:11
三刀流の逆風(fēng) 閱讀(320)
評(píng)論(0) 編輯 收藏 所屬分類:
Oracle