接同事电话,上午十点多,新来的开发人员误删十几个表,并且已经做了插入操作,问能否恢复。
误操作是这样的:“先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期间的所有误删操作的数据恢复。
文章评论
如果不启用supplemental log补充日志,主要会有一些操作日志无法挖掘,主要是update相关的操作。