Oracle資料庫線上重做日誌被刪除的幾種恢複方法
Oracle資料庫的線上重做日誌中包含了資料庫中所有資料的操作記錄,我們可以利用重做日誌做很多的操作,例如日誌挖掘。
有時候,因為種種原因,我們的線上日誌被人誤刪除或者意外損壞掉,我們應該如何進行恢複呢,其實很簡單,看下面內容:
我們通過刪除線上日誌類比日誌被誤刪除的情況:
[oracle@test orcl]$ rm redo*
[oracle@test orcl]$ ls -l redo*
ls: 無法訪問redo*: 沒有那個檔案或目錄
[oracle@test orcl]$ sqlplus / as sysdba
SQL> startup mount
ORACLE 常式已經啟動。
。。。
資料庫裝載完畢。
因為我們只是缺失線上重做日誌,所以資料庫是可以啟動到mount狀態的,mount狀態的資料庫只會開啟控制檔案,並不會去校正每個資料檔案的狀態,校正動作會在open階段進行。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-03113: 通訊通道的檔案結尾
進程 ID: 4607
會話 ID: 125 序號: 5
開啟資料庫的話,會報錯,並且資料庫會強行關閉
下面我們使用resetlogs的方法嘗試開啟資料庫:
SQL> recover database until cancel;
完成介質恢複。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項
SQL> alter database open resetlogs;
資料庫已更改。
resetlogs開啟資料庫必須在資料庫不完全恢複之後才可以用,而且在不完全恢複後必須使用 RESETLOGS 或 NORESETLOGS 選項
除了這種方法以外,我們還可以通過清除logfile的方法進行開啟資料庫,如下:
首先將資料庫啟動到mount狀態
查詢v$log視圖:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ -------------------
1 1 1 134217728 5121 NO CURRENT 984719 2015-09-16 16:04:30 2.8147E+14
3 1 0 134217728 5121 YES UNUSED 0 0
2 1 0 134217728 5121 YES UNUSED 0 0
如果ARCHIVED欄位是YES的話,我們可以通過
alter database clear logfile 命令進行清除,如果是No的話,我們可以通過
alter database clear unarchived logfile 進行強行清除
SQL> alter database clear logfile group 2;
資料庫已更改。
SQL> alter database clear logfile group 3;
資料庫已更改。
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
第 1 行出現錯誤:
ORA-01624: 日誌 1 是緊急恢複執行個體 orcl (線程 1) 所必需的
ORA-00312: 聯機日誌 1 線程 1: '/app/oradata/orcl/redo01.log'
但是由於group 1是當前的線上日誌,再加上之前我是使用的 shutdown abort進行關閉的資料庫
資料檔案狀態不一致,需要使用當前日誌進行執行個體恢複,所以無法通過清除日誌命令進行清除
如果資料庫檔案狀態一致,做到這裡我們就可以通過 alter database open命令開啟資料庫了,但是如果碰到這樣的不一致的情況,還需要通過 resetlogs開啟資料庫,如下:
SQL> recover database until cancel;
ORA-00279: 更改 984722 (在 09/16/2015 16:04:43 產生) 對於線程 1 是必需的
ORA-00289: 建議: /app/archivelog/orcl_1_1_890582670.dbf
ORA-00280: 更改 984722 (用於線程 1) 在序列 #1 中
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00308: cannot open archived log '/app/archivelog/orcl_1_1_890582670.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-00308: cannot open archived log '/app/archivelog/orcl_1_1_890582670.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/app/oradata/orcl/system01.dbf'
SQL> recover database until cancel
ORA-00279: 更改 984722 (在 09/16/2015 16:04:43 產生) 對於線程 1 是必需的
ORA-00289: 建議: /app/archivelog/orcl_1_1_890582670.dbf
ORA-00280: 更改 984722 (用於線程 1) 在序列 #1 中
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/app/oradata/orcl/system01.dbf'
ORA-01112: 未啟動介質恢複
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出現錯誤:
ORA-01194: 檔案 1 需要更多的恢複來保持一致性
ORA-01110: 資料檔案 1: '/app/oradata/orcl/system01.dbf'
但是我們發現,不完全恢複是失敗的,這個時候通過 resetlogs開啟資料庫也是不可能的,那麼我們只能通過應用隱含參數,通過隱含參數使狀態不一致的資料庫開啟,如下:
SQL> create pfile='/home/oracle/p2.ora' from spfile;
在pfile裡面增加*._allow_resetlogs_corruption=TRUE
echo "*._allow_resetlogs_corruption=TRUE">>p2.ora
然後通過我們建立的pfile開啟資料庫到mount狀態:
SQL> startup mount pfile='/home/oracle/p2.ora'
ORACLE 常式已經啟動。
Total System Global Area 334036992 bytes
Fixed Size 2253024 bytes
Variable Size 171970336 bytes
Database Buffers 155189248 bytes
Redo Buffers 4624384 bytes
資料庫裝載完畢。
然後通過 resetlogs的方法開啟資料庫
SQL> alter database open resetlogs;
資料庫已更改。
因為我們是用我們臨時產生的pfile進行啟動的,所以還要完成最後一步,重啟資料庫即可
好了,資料庫開啟了,但是因為我們的資料庫從異常情況下恢複過來,可能是會有問題的,所以建議做好備份,以防資料丟失。