使用LogMiner抢救误删数据

2019年7月9日 1786点热度 0人点赞 1条评论

接同事电话,上午十点多,新来的开发人员误删十几个表,并且已经做了插入操作,问能否恢复。
误操作是这样的:“先delete清空表里面的数据,然后insert一份其他的数据;大概十几个表”
给他们flashback恢复语句:
CREATE TABLE tmpMytable AS SELECT * FROM test AS OF TIMESTAMP to_timestamp('20190418 15:40:00', 'yyyymmdd hh24:mi:ss');
答复说使用这个办法,只恢复了3个表的数据,“UNISEQUENC、T_EOM_CITY、T_EOM_DISTRICT”,其他表在恢复时提示“01555快照过旧错误”。
问有无其他办法,于是想到了这个一直没有试过的LogMiner。
先确认了数据库不是归档模式,那么就需确认onlinelog是否还没有覆盖,幸运的是,当初配置的redolog文件够大,每个2G,有3组,还未覆盖,于是通过LogMiner恢复就有了可能。借此也熟悉一下具体的操作步骤,记录如下。

■安装LogMiner
@?/rdbms/admin/dbmslm.sql
@?/rdbms/admin/dbmslmd.sql

■配置LogMiner文件夹
CREATE DIRECTORY utlfile AS '/home/oracle/logmnr';
alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;

■重启数据库

■创建字典文件
dba用户登陆,执行:
EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'/home/oracle/logmnr');

■加入需分析的日志文件
Oracle的LogMiner可以分析在线(online)和归档(offline)两种日志文件,
加入分析日志文件使用dbms_logmnr.add_logfile过程,第一个文件使用dbms_logmnr.NEW参数,后面文件使用dbms_logmnr.ADDFILE参数。

BEGIN
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/hebeicnc/redo01a.log',options=>dbms_logmnr.NEW);
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/hebeicnc/redo02a.log',options=>dbms_logmnr.ADDFILE);
END;
/

■使用LogMiner进行日志分析
Oracle的LogMiner分析时分为无限制条件和限制条件两种,无限制条件中分析所有加入到分析列表日志文件,限制条件根据限制条件分析指定范围日志文件。
execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dictionary.ora');
OR
execute dbms_logmnr.start_logmnr(options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.committed_data_only);
OR 提取特定时间的日志
execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dictionary.ora', starttime=>to_date('2019-07-09 10:25:00','YYYY-MM-DD HH24:MI:SS'), endtime=>to_date('2019-07-09 10:45:59','YYYY-MM-DD HH24:MI:SS'))

select sql_redo from v$logmnr_contents t where t.seg_name ='T_EOM_DISPATCH_TABLE';
select sql_redo from v$logmnr_contents t where t.seg_name ='T_EOM_GENERAL_INFO';
select sql_redo from v$logmnr_contents t where t.seg_name ='T_EOM_FEEDBACK_TABLE';

select sql_redo from v$logmnr_contents t where lower(sql_redo) like '%delete from t_eom_dispatch_table%';
select sql_redo from v$logmnr_contents t where lower(sql_redo) like '%delete from t_eom_general_info%';

■结束日志挖掘
exec dbms_logmnr.end_logmnr; 

使用如上步骤,将最后的查询结果输出到spool临时文件,在后续处理后,执行这些得到的SQL语句重新插入到数据库,即完成了10:25-10:45期间的所有误删操作的数据恢复。

liking

这个人很懒,什么都没留下

文章评论

  • liking

    如果不启用supplemental log补充日志,主要会有一些操作日志无法挖掘,主要是update相关的操作。

    2019年12月24日