六、检查需要回滚的日志,客户要求回滚到6月9日15:30之前:

  1. -rw-r-----    1 oracle   oinstall   48868352 Jun 09 14:53 ARC0000025854_0666465023.0001  
  2. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 15:08 ARC0000025855_0666465023.0001  
  3. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 15:17 ARC0000025856_0666465023.0001  
  4. -rw-r-----    1 oracle   oinstall   48910848 Jun 09 15:42 ARC0000025857_0666465023.0001  
  5. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 16:04 ARC0000025858_0666465023.0001  
  6. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 17:22 ARC0000025859_0666465023.0001  
  7. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 17:27 ARC0000025860_0666465023.0001  
  8. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 17:47 ARC0000025861_0666465023.0001  
  9. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 20:52 ARC0000025862_0666465023.0001  
  10. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 21:17 ARC0000025863_0666465023.0001  
  11. drwxr-xr-x    2 oracle   oinstall        256 Jun 09 23:02 logmnr  
  12. -rw-r-----    1 oracle   oinstall   48863744 Jun 09 23:07 ARC0000025864_0666465023.0001  
  13. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:28 ARC0000025865_0666465023.0001  
  14. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025866_0666465023.0001  
  15. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025867_0666465023.0001  
  16. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025868_0666465023.0001  
  17. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025869_0666465023.0001  
  18. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:30 ARC0000025870_0666465023.0001  
  19. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:30 ARC0000025871_0666465023.0001  
  20. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:30 ARC0000025872_0666465023.0001  
  21. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:31 ARC0000025873_0666465023.0001  
  22. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:31 ARC0000025874_0666465023.0001  
  23. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:31 ARC0000025875_0666465023.0001 

七、添加归档日志

  1. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025854_0666465023.0001',Options=>dbms_logmnr.new);  
  2. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025855_0666465023.0001',Options=>dbms_logmnr.addfile);  
  3. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025856_0666465023.0001',Options=>dbms_logmnr.addfile);  
  4. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025857_0666465023.0001',Options=>dbms_logmnr.addfile);  
  5. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025858_0666465023.0001',Options=>dbms_logmnr.addfile);  
  6. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025859_0666465023.0001',Options=>dbms_logmnr.addfile);  
  7. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025860_0666465023.0001',Options=>dbms_logmnr.addfile);  
  8. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025861_0666465023.0001',Options=>dbms_logmnr.addfile);  
  9. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025862_0666465023.0001',Options=>dbms_logmnr.addfile);  
  10. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025863_0666465023.0001',Options=>dbms_logmnr.addfile);  
  11. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025864_0666465023.0001',Options=>dbms_logmnr.addfile);  
  12. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025865_0666465023.0001',Options=>dbms_logmnr.addfile);  
  13. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025866_0666465023.0001',Options=>dbms_logmnr.addfile);  
  14. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025867_0666465023.0001',Options=>dbms_logmnr.addfile);  
  15. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025868_0666465023.0001',Options=>dbms_logmnr.addfile);  
  16. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025869_0666465023.0001',Options=>dbms_logmnr.addfile);  
  17. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025870_0666465023.0001',Options=>dbms_logmnr.addfile);  
  18. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025871_0666465023.0001',Options=>dbms_logmnr.addfile);  
  19. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025872_0666465023.0001',Options=>dbms_logmnr.addfile);  
  20. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025873_0666465023.0001',Options=>dbms_logmnr.addfile);  
  21. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025874_0666465023.0001',Options=>dbms_logmnr.addfile);  
  22. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025875_0666465023.0001',Options=>dbms_logmnr.addfile); 

八、开始挖日志

  1. exec dbms_logmnr.start_logmnr(dictfilename=>'/prodlog/logmnr/dictionary.ora');  

九、将logmnr的数据暂时保存在一个表里面,免得再次查询时候不用再次添加归档日志

  1. create table hjm_logmnr nologging as select * from v$logmnr_contents where 1=2;    
  2. insert /*+ append */ into hjm_logmnr select * from v$logmnr_contents;    
  3. /*------做这一步之前注意将nls_date_format改成'yyyy-mm-dd hh24:mi:ss',不然泰文乱码,时间会变成问号。------*/  

十、导出脚本,用脚本做回滚,注意SQL_UNDO中的delete语句末尾有rowid,不能直接用,需要用正则表达式替换掉。

  1. spool TA_ABSDOCS_undosql.txt  
  2. select regexp_replace(replace(SQL_UNDO,'"HR_TTM"','"HR_TTM2"'),'and ROWID.+;',';')  
  3. from hjm_logmnr  
  4. WHERE 
  5. SEG_NAME = 'TA_ABSDOCS' AND 
  6. SEG_OWNER = 'HR_TTM'   
  7. order by to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss'desc;  
  8. spool off 
  9.    
  10.    
  11. spool TA_ABSDOC_undosql.txt  
  12. select regexp_replace(replace(SQL_UNDO,'"HR_TTM"','"HR_TTM2"'),'and ROWID.+;',';')  
  13. from hjm_logmnr  
  14. WHERE 
  15. SEG_NAME = 'TA_ABSDOC' AND 
  16. SEG_OWNER = 'HR_TTM'   
  17. order by to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss'desc;  
  18. spool off 

去掉脚本的头部的语句和末尾返回多少多少行的文字,在hr_ttm2下执行这2个脚本,实现数据回滚。

另外,我们来看一下:

  1. SQL> select to_char(max(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss'),to_char(min(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss')  
  2. from hjm_logmnr  
  3. WHERE 
  4. SEG_NAME = 'TA_ABSDOC' AND 
  5. SEG_OWNER = 'HR_TTM'   2    3    4    5    
  6.   6  /  
  7.    
  8. TO_CHAR(MAX(TIMESTA TO_CHAR(MIN(TIMESTA  
  9. ------------------- -------------------  
  10. 2011-06-09 21:20:26 2011-06-09 15:31:54  
  11.    
  12. SQL>   
  13. SQL>   
  14. SQL>   
  15. SQL>   
  16. SQL> l  
  17.   1  select to_char(max(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss'),to_char(min(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss')  
  18.   2  from hjm_logmnr  
  19.   3  WHERE 
  20.   4  SEG_NAME = 'TA_ABSDOC' AND 
  21.   5* SEG_OWNER = 'HR_TTM' 
  22. SQL> l4  
  23.   4* SEG_NAME = 'TA_ABSDOC' AND 
  24. SQL> c/TA_ABSDOC/TA_ABSDOCS  
  25.   4* SEG_NAME = 'TA_ABSDOCS' AND 
  26. SQL>   
  27.    
  28. TO_CHAR(MAX(TIMESTA TO_CHAR(MIN(TIMESTA  
  29. ------------------- -------------------  
  30. 2011-06-09 21:20:26 2011-06-09 15:37:39 

归档日志是从14:53开始,而这2个表的变动,是在15:30之后才有的(min(TIMESTAMP是在15:30之后)。
也就是说从14:53分到15:30之前,这2个表一直是没动过的。因此,可以跟客户说,2个表的数据恢复到15:00的。

抬头一看,东方既白。唉,又熬了个通宵。