利用日誌挖掘 oracle 不完全恢復 恢復誤刪除的表/資料/檢視等

tianya_2011發表於2011-07-16
--------------------------  
前提:
  1. 資料庫工作在歸檔模式下;
  2. 有冷備份的資料檔案;
---------------------------

SQL>col script. for a80 
SQL>col SQL_REDO for a80 
 
-- 拼接從哪裡挖的語句  
SQL>select 'exec dbms_logmnr.add_logfile('''||member||''')' as script. from v$logfile; 
 
-- 從哪裡挖  
exec dbms_logmnr.add_logfile('/oracle/oradata/orcl_new/redo03.log');  
exec dbms_logmnr.add_logfile('/oracle/oradata/orcl_new/redo02.log'); 
exec dbms_logmnr.add_logfile('/oracle/oradata/orcl_new/redo01.log'); 
 
 
-- 開始挖  
SQL>exec dbms_logmnr.start_logmnr; 
 
-- 找結果 --&gt 要恢復的語句時的時間戳;  
SQL>select scn, sql_redo from v$logmnr_contents where sql_redo like 'drop table emp%'; 
  
       SCN SQL_REDO 
---------- --------------------------------------------------------------------------------  
   1036547 drop table t1 purge; 
   1037333 drop table scott.emp purge; 
--  1037333 --&gt要恢復的時間戳  
 
-- 關掉DB   
SQL>shutdown abort 
 
-- 複製冷備的檔案 -- *.dbf 到資料檔案目錄下,並進行覆蓋;,因為要利用日誌把 sys,user等表空間的資料,重做一次; 
 
[oracle@Oracle]$ cp *.dbf ../orcl_new/ 
 
-- 啟動到 mount 下;  
SQL>startup mount 
 
-- 恢復到 1037333 drop table scott.emp purge  的時間點;
  
-- 要求:trc   
SQL>recover database until scn 1035742; 
 
-- 啟動DB in resetlogs;  
SQL>alter database open resetlogs; 
 
 
原理 
  1.冷備份的資料檔案 *.dbf比現在要舊,那麼資料檔案的scn肯定就比現在的小; 
  2.使用日誌挖掘方法,在日誌中找出刪表時的scn; 
  3.在資料庫shutdown 的狀態下,用冷備份的資料檔案 *.dbf,覆蓋現在的*.dbf檔案;-- 保證資料檔案完整性  
  4.啟動DB到 mount 下, 恢復到日誌挖掘的時間點(利用日誌對資料檔案重做一次) 
  5.以 resetlog 方式 open --- 以前的日誌就覆蓋了;  
 
PS:資料庫有四種狀態shutdown、nomount、mount、open 
   shutdown  是指關閉狀態 
   nomount   是指根引數檔案已經構造出例項的狀態 
   mount     是指為例項開啟控制檔案,並讀出控制檔案中相關資訊,但並不驗證 
   open      是指對相關檔案進行驗證,如沒有問題,就開啟,讓使用者可以訪問 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25373498/viewspace-752522/,如需轉載,請註明出處,否則將追究法律責任。

相關文章