利用日誌挖掘 oracle 不完全恢復 恢復誤刪除的表/數據/視圖等

/* --------------------------
前題: 
  1. DB工作在歸檔模式下;
  2. 有冷準備份的數據文件;
---------------------------*/
col script for a80
col SQL_REDO for a80

-- 拼接從哪裏挖的語句
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');


-- 開始挖
exec dbms_logmnr.start_logmnr;

-- 找結果 --> 要恢復的語句時的時間戳;
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 -->要恢復的時間戳

-- 關掉DB 
shutdown abort

-- 拷貝冷備的文件 -- *.dbf 到數據文件目錄下,並進行覆蓋;,因爲要利用日誌把 sys,user等表空間的數據,重做一次;
[oracle@OracleWeblogic orcl_new_bk]$ cp *.dbf ../orcl_new/

-- 啓動到 mount 下;
startup mount

-- 恢復到 1037333 drop table scott.emp purge  的時間點;
-- 要求:trc 
recover database until change 1035742;

-- 啓動DB in resetlogs;
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是指對相關文件進行驗證,如沒有問題,就打開,讓用戶可以訪問


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章