恢復之利用備份在所有控制檔案丟失情況下恢復(一)

zhengbao_jun發表於2009-02-11

如果全部控制檔案丟失,但是包含以前控制檔案的備份,這時可以利用備份的控制檔案進行恢復,不過在恢復後需要以RESETLOGS方式開啟資料庫。

根據聯機重做日誌檔案是否可用和資料檔案是否是最新的可以分為四種不同情況,這篇文章描述的是,聯機重做日誌可用,且資料檔案是最新的情況。


一般重做日誌全部丟失的話,資料庫肯定會馬上關閉。本測試為了模擬聯機日誌中包含待恢復資料的情況,在後臺執行儲存過程插入資料時,在另外的session使用SHUTDOWN ABORT關閉資料庫。

SQL> CONN /@TEST AS SYSDBA
已連線。
SQL> SHUTDOWN ABORT
ORACLE 例程已經關閉。

資料庫關閉後刪除所有控制檔案。

SQL> HOST DEL F:ORACLEORADATATEST*.CTL

然後利用備份的控制檔案進行恢復

SQL> HOST COPY F:ORACLEBACKUPTEST20060215*.CTL F:ORACLEORADATATEST

SQL> STARTUP MOUNT
ORACLE 例程已經啟動。

Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。

利用備份的控制檔案啟動,需要使用USING BACKUP CONTROLFILE語句。

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: 更改 45609576 (在 02/15/2006 19:28:34 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORADATATESTARCHIVEARC00059.001
ORA-00280: 更改 45609576 對於執行緒 1 是按序列 # 59 進行的


指定日誌: {=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00279: 更改 45610708 (在 02/16/2006 01:35:15 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORADATATESTARCHIVEARC00060.001
ORA-00280: 更改 45610708 對於執行緒 1 是按序列 # 60 進行的
ORA-00278: 此恢復不再需要日誌檔案 'F:ORACLEORADATATESTARCHIVEARC00059.001'


ORA-00279: 更改 45610901 (在 02/16/2006 01:36:55 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORADATATESTARCHIVEARC00061.001
ORA-00280: 更改 45610901 對於執行緒 1 是按序列 # 61 進行的
ORA-00278: 此恢復不再需要日誌檔案 'F:ORACLEORADATATESTARCHIVEARC00060.001'


ORA-00279: 更改 45612925 (在 02/16/2006 01:39:10 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORADATATESTARCHIVEARC00062.001
ORA-00280: 更改 45612925 對於執行緒 1 是按序列 # 62 進行的
ORA-00278: 此恢復不再需要日誌檔案 'F:ORACLEORADATATESTARCHIVEARC00061.001'


ORA-00308: 無法開啟存檔日誌 'F:ORACLEORADATATESTARCHIVEARC00062.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。


ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤
ORA-01194: 檔案1需要更多的恢復來保持一致性
ORA-01110: 資料檔案 1: 'F:ORACLEORADATATESTSYSTEM01.DBF'

最後出現的錯誤是由於SHUTDOWN ABORT後,使用備份的控制檔案造成的。Oracle需要應用當前的重做日誌檔案來進行恢復,但是由於使用了備份的控制檔案,備份之後的歸檔日誌資訊丟失,因此,這時需要手工輸入需要恢復的聯機重做日誌檔案。

其實這個時候是可以通過REDO的迴圈使用推斷出最後需要使用的聯機日誌的。

SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;

GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 59 CURRENT
2 57 INACTIVE
3 58 INACTIVE

這時已經可以推斷GROUP2將是60,GROUP3是61,而GROUP1則是62。不過在輸入重做日誌進行恢復時,即使輸入錯檔案也沒有關係,Oracle會提示錯誤。如果輸入正確的重做日誌,則Oracle會完成介質恢復。

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: 更改 45612925 (在 02/16/2006 01:39:10 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORADATATESTARCHIVEARC00062.001
ORA-00280: 更改 45612925 對於執行緒 1 是按序列 # 62 進行的


指定日誌: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATESTREDO03.LOG
ORA-00310: 存檔日誌包含序列 61;要求序列 62
ORA-00334: 歸檔日誌: 'F:ORACLEORADATATESTREDO03.LOG'


ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤
ORA-01194: 檔案1需要更多的恢復來保持一致性
ORA-01110: 資料檔案 1: 'F:ORACLEORADATATESTSYSTEM01.DBF'


SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: 更改 45612925 (在 02/16/2006 01:39:10 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORADATATESTARCHIVEARC00062.001
ORA-00280: 更改 45612925 對於執行緒 1 是按序列 # 62 進行的


指定日誌: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATESTREDO01.LOG
已應用的日誌。
完成介質恢復。
SQL> ALTER DATABASE OPEN RESETLOGS;

資料庫已更改。

恢復到這裡已經完成,現在需要做的是馬上進行資料庫的備份。

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

相關文章