利用logmnr恢复大量误删除数据

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

logmnr其实是非常有用的一个恢复数据的工具,今天有人提到恢复700万的数据,我也做过几万条财务数据的恢复,借此小结一下。

--创建一个表来保存提取出来的sql

create table logmnr_content tablespace tools as scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents where 1=0;

--通过dba_objects 查到表对应的 object_id and data_object_id ,用来在log中提取该表相关的sql_undo

select object_id,data_object_id from dba_objects where object_name = ???

--通过在os中找到的归档日志范围,进行联机提取

将undo sql 插入一个表中,比如我的日志序号范围是 5813 到 5850

为了防止临时空间不足,一个一个归档日志文件处理。

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通过动态sql执行插入表

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;

注重:假如在这段日志中还有其他对该表的操作的话,可以结合操作类型 OPERATION 和 提交scn cscn 来判定 到底是不是该恢复的这部分数据。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航