恢復之非歸檔模式下資料庫非正常關閉的備份與恢復

zhengbao_jun發表於2009-02-11

產品資料庫不會處於非歸檔模式下。而且冷備份的前提是資料庫正常關閉,因此,一般不會存在使用非正常關閉的備份來進行資料庫的恢復。

本文只是對這種特殊的情況進行一下測試,在實際中應該不會碰到這種情況。


首先,在另一個SESSION迴圈插入資料,然後非正常關閉資料庫,並在這種情況下備份資料庫:

SQL> CONN /@TEST1 AS SYSDBA
已連線。
SQL> SHUTDOWN ABORT
ORACLE 例程已經關閉。
SQL> HOST COPY F:ORACLEORADATATEST1* F:ORACLEBACKUPTEST120060305

Oracle文件並不推薦備份聯機日誌檔案,但是對於非歸檔模式下,非正常關閉的資料庫來說,備份了聯機日誌檔案至少可以保證資料庫可以一致性開啟。

開啟資料庫,進行資料的修改:

SQL> STARTUP
ORACLE 例程已經啟動。

Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> SELECT COUNT(*) FROM YANGTK.TEST;

COUNT(*)
----------
20001

SQL> DELETE YANGTK.TEST WHERE ID > 1;

已刪除19000行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系統已更改。

下面利用剛才生成的備份進行資料庫的恢復,由於資料庫只進行了少量的操作,備份之後所有的操作都存在於聯機日誌檔案中,且聯機日誌檔案還沒有被重用。

這個時候的恢復可以選擇是否恢復備份的聯機日誌檔案。如果不恢復備份的聯機日誌檔案,資料庫是可以不丟失資料開啟的:

SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.CTL F:ORACLEORADATATEST1

SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.DBF F:ORACLEORADATATEST1

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
資料庫裝載完畢。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 對於執行緒 1 是按序列 # 1042 進行的


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


SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 對於執行緒 1 是按序列 # 1042 進行的


指定日誌: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO03.LOG
ORA-00279: 更改 36724400 (在 03/06/2006 00:57:42 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORACLE920RDBMSARC01043.001
ORA-00280: 更改 36724400 對於執行緒 1 是按序列 # 1043 進行的
ORA-00278: 此恢復不再需要日誌檔案 'F:ORACLEORADATATEST1REDO03.LOG'


指定日誌: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO01.LOG
ORA-00279: 更改 36724695 (在 03/06/2006 00:59:07 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORACLE920RDBMSARC01044.001
ORA-00280: 更改 36724695 對於執行緒 1 是按序列 # 1044 進行的
ORA-00278: 此恢復不再需要日誌檔案 'F:ORACLEORADATATEST1REDO01.LOG'


指定日誌: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATEST1REDO02.LOG
已應用的日誌。
完成介質恢復。

SQL> ALTER DATABASE OPEN RESETLOGS;

資料庫已更改。

查詢YANGTK.TEST表就可以發現,資料庫資料並未丟失:

SQL> SELECT COUNT(*) FROM YANGTK.TEST;

COUNT(*)
----------
1001

如果採用恢復聯機日誌檔案的方式,則資料庫可以正常開啟,但是會丟失備份之後所有的修改:

SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> HOST COPY F:ORACLEBACKUPTEST120060305* F:ORACLEORADATATEST1

SQL> STARTUP
ORACLE 例程已經啟動。

Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> SELECT COUNT(*) FROM YANGTK.TEST;

COUNT(*)
----------
20001

如果是資料庫已經執行一段時間,用於將SHUTDOWN ABORT正常開啟的聯機日誌檔案已經被重用的情況:

SQL> DELETE YANGTK.TEST WHERE ID > 15;

已刪除5000行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系統已更改。

SQL> DELETE YANGTK.TEST WHERE ID > 10;

已刪除5000行。

SQL> COMMIT;

提交完成。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系統已更改。

這個時候的恢復如果將聯機日誌檔案恢復,則和剛才的恢復操作沒有區別,資料庫恢復到備份的時刻,並利用備份時刻的聯機日誌檔案將資料庫一致性開啟。如果不恢復聯機日誌檔案,或者沒有備份當時的聯機日誌檔案:

SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.CTL F:ORACLEORADATATEST1

SQL> HOST COPY F:ORACLEBACKUPTEST120060305*.DBF F:ORACLEORADATATEST1

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
資料庫裝載完畢。
SQL> RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 對於執行緒 1 是按序列 # 1042 進行的


指定日誌: {=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤
ORA-01194: 檔案1需要更多的恢復來保持一致性
ORA-01110: 資料檔案 1: 'F:ORACLEORADATATEST1SYSTEM01.DBF'


ORA-01112: 未啟動介質恢復

這個時候資料庫已經無法正常的開啟了,這是由於在非正常關閉情況下進行的備份。這時候或者利用更早的備份進行不完整恢復,或者提供備份時刻備份的聯機重做日誌。

SQL> RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE
ORA-00279: 更改 36693083 (在 03/05/2006 10:28:00 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: F:ORACLEORACLE920RDBMSARC01042.001
ORA-00280: 更改 36693083 對於執行緒 1 是按序列 # 1042 進行的


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

資料庫已更改。

SQL> SELECT COUNT(*) FROM YANGTK.TEST;

COUNT(*)
----------
20001

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

相關文章