6.手工備份恢復--打開數據庫的備份與恢復(練習7、8)
練習7:打開數據庫的完全數據庫恢復
在出現數據庫故障時,可以用打開數據庫備份并應用重做信息,來完全恢復數據庫。
步驟一:破壞數據庫
首先需要將數據庫文件脫機解除操作系統對文件的鎖定,然后進行刪除,如下:
2 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/users01.dbf’ offline;
需要注意的是,在短時間內數據庫不會產生錯誤,因為Oracle將數據塊讀取到內存中。如所需的數據庫實現未在內存,數據庫將從磁盤讀取數據,對于更改過的數據塊也是如此,數據庫會發現文件已經不存在,將會提示如下錯誤信息:
此時切換日志不會產生錯誤,因為這兩個丟失的文件不是聯機的,除非我們將這兩個文件恢復到聯機狀態。
2 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/users01.dbf’ online;
由于數據庫處于變化中,提示如下信息:
如果我們在這時視圖將數據庫關閉,Oracle會提示錯誤,在關閉Oracle進程需要成功完成對所有聯機數據文件的一個檢查點,可以通過數據文件脫機然后關閉數據庫。啟動數據庫,在打開數據庫時遇到錯誤,查看告警日志文件,在這個文件中,可以看到如下錯誤信息:
步驟二:還原丟失的數據文件
使用數據字典,獲取需要恢復的文件,可以通過如下方式進行查看:
2 SQL> SELECT file#,ts#, status,name FROM v$datafile;
打開數據庫備份腳本所使用的備份目的路徑下復制users01.dbf和tools.dbf文件,當把文件復制回他們原來的數據庫位置時,檢查v$recover_file中的內容,該視圖的值已經發生改變,change#列有一個值,這個數字與v$datafile視圖中的checkpoint_change#來的小。
為恢復一個表空間或一個數據文件,首先通過恢復數據文件恢復TOOLS表控件,然后使用RECOVER DATAFILE命令,從歸檔和聯機日志文件實施重做。
可以通過文件號或文件名進行恢復:
對于PRACTICE數據庫,文件5就是tools.dbf文件。恢復命令找出還原文件的檢查點SCN,并將此數值與重做日志文件中的SCN進行比較,確定哪些文件需要恢復,然后該文件將從歸檔目的路徑中讀出并用于數據文件,可以看到類似如下信息:
這里介紹一下指定歸檔路徑的恢復,可以將文件復制到其初始位置或者告訴恢復命令去查看另一個路徑。
對于包含還原文件的整個表空間,可以使用RECOVER命令:
也可以在一個命令中恢復多個數據文件或表空間,在REOVER命令后寫上期望恢復的各個數據文件或表空間并用逗號隔開:
2 DATAFILE ‘D:\oracle\PRACTICE\USERS01.DBF’,
3 ‘D:\oracle\PRACTICE\TOOLS01.DBF’;
步驟四:確認數據庫恢復
恢復數據文件后可使用ALTER DTABASE命令將數據文件置回到聯機狀態,如果數據文件成功置回到聯機狀態表明已經成功地恢復了這些數據文件,因為只有當這些被還原的數據文件與控件文件相匹配時,數據文件才能置回到聯機狀態。
2 SQL> ALTER DATABASE DATAFILE ‘D:/oracle/PRACTICE/users01.dbf’ online;
查詢TINA.DATA_LOG中檢查數據,看是否能達到預期的數據。
練習8:打開數據庫的不完全數據庫恢復
該情況在實際情況將經常使用,所以本練習非常重要。該練習中我們將刪除一個用戶SCOTT的一個表(emp,具體創建請參考“2.Oracle10g備份恢復準備工作”),然后從先前的打開數據庫備份中還原所有文件,并利用備份控制文件恢復數據庫。
步驟一:刪除一個表
向TINA.DATA_LOG插入一筆時間為50年后的數據,切換日志,并從v$datafile中的 change#列中提取數據文件檢查點SCN號,記下這些就可以用DROP命令來刪除表了:
2 SQL> COMMIT;
3 SQL> ALTER SYSTEM SWITCH LOGFILE;
2 SQL> SELECT * FROM tina.date_log;
3 SQL> ALTER SYSTEM SWITCH LOGFILE;
刪除該表后插入一筆時間為8年后數據
2 SQL> COMMIT;
3 SQL> SELECT * FROM tina.date_log;
步驟二:重新命名一個歸檔日志
練習4中不完全恢復是基于時間,本練習中是基于取消的恢復,當某一個歸檔日志文件損壞或丟失時,常使用取消的恢復。
查看歸檔路徑,找出序號小于前面查詢結果返回序號的歸檔日志文件。例如,當前日志文件序號為13,定位D:\oracle\PRACTICE\ARCHIVE文件夾下名為ARC00012_0708077288.001的文件,將這個文件命名為ARC00012_0708077288.001.backup,在步驟5恢復數據庫時,模擬找不到該歸檔文件撤銷恢復。
步驟三:還原數據庫
關閉數據庫,使用刪除表之前所做的拷貝取代所有的數據文件(注意不要把備份的覆蓋當前聯機重做日志),然后把日志應用于所有的數據文件,直到表被刪除的某一時間點。在關閉數據庫之前如果時間允許,則需要實施全數據庫的關閉備份。
步驟四:將數據庫恢復至某一時間點
通過MOUNT方式啟動數據庫,查看v$recover_file的內容,看到所有的數據文件都需要恢復,值得注意的是除了USERS表空間的兩個文件外,所有的文件都擁有不同的更改號,這是因為這些數據文件在打開數據庫備份期間復制的。
前面恢復中使用非缺省路徑,也可以在RECOVER命令之前用SET LOGSOURCE項打開數據庫。
恢復完畢,需使用ALTER DATABASE OPEN命令中制定RESETLOGS,聯機重做日志將以數字1開始。強烈建議數據庫打開后進行備份,因為以前做的備份不能夠使用了。
步驟五:確認恢復
查看SCOTT.EMP表是否存在,從TINA.DATE_LOG中提取數據是否存在刪除表之前插入的數據,是否存在刪除表之后插入的數據。

浙公網安備 33010602011771號