logminer恢复某电信误删除的700万条数据

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
早知道8i 以后oracle就有logmnr这个东西,一直没机会尝试,这次终于逮着机会用了一下,真是挺管用!
背景:solaris2.6oracle817 管理员误操作删除了电信缴费的700万条数据,有两天前的rman全备及之后的所有归档日志,但是从来没进行过恢复测试,而且系统没有多余空间用于复制数据库。
方案:利用logminer找出删除操作的倒退操作,将删除的数据重新插入表中。
优点:对现有的数据库没有破坏,无后顾之忧。
实施:几乎所有的oracle教材中都有介绍,照做就是。
结果:所有被误删的数据都恢复。
总结:oracle自带的工具我们都应该尝试一下,其实有些很有用而且并不困难,只是我们没去尝试而已。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
呵呵,偶当初也是恢复过几万条财务数据
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
700万条记录,用LOGMNR的时候一定很痛苦。


回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
这个工作量还是比较大的。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
不过恭喜了,做了这个应当给个特殊奖金.
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
其实工作量说不上什么,写一个 pl/sql ,只要给定了日志范围,逐个分析,取出undo 的insert的sql 插入一个表中,然后从这个表中读出数据当做动态sql运行。
时间稍微长一点,工作量倒不大
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
我恢复过房产局的几万条信息。挺好用的。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 biti_rainy 发布
[B]其实工作量说不上什么,写一个 pl/sql ,只要给定了日志范围,逐个分析,取出undo 的insert的sql 插入一个表中,然后从这个表中读出数据当做动态sql运行。
时间稍微长一点,工作量倒不大 [/B]

这个没有做过这么多的,试验只有几条数据,都是手工去恢复的,下在是整批的,不知道怎么来实现动态化???
老大,能不能具体说一下这个PL/SQL怎么写,?? 还有分析的时候怎么来做????
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
--创建一个表来保存提取出来的sql
create table logmnr_content tablespace tools asscn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents where 1=0;
--通过dba_objects 查到表对应的 object_idand data_object_id ,用来在log中提取该表相关的sql_undo
select object_id,data_object_id from dba_objects where object_name = ???
--通过在os中找到的归档日志范围,进行联机提取
将undosql 插入一个表中,比如我的日志序号范围是 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和 提交scncscn 来判断 到底是不是该恢复的这部分数据。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
麻烦问一下logminer是oracle8i以后需要额外付费的么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行