利用日誌挖掘 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是指對相關檔案進行驗證,如沒有問題,就開啟,讓使用者可以訪問