二、DB2數據庫的恢復
DB2數據庫提供了三種恢復類型:
1、崩潰恢復(crash recovery):崩潰恢復是用來在失敗后立即進行恢復,把數據庫恢復到一個事務一致狀態,此狀態的所有更改只有在執行提交事務后才生效。崩潰恢復使用命令 RESTART 執行。
2、備份恢復(restore recovery):備份恢復可從上一次所作的備份中恢復數據庫的內容。備份恢復使用 RESTORE 命令執行。
3、向前恢復(forward recovery):在一個數據庫從備份中恢復了以后,向前恢復可以重新執行那些在備份后才更改了數據庫的操作。在這種情況下,數據庫可以恢復到備份和當前時間之間的任何時間斷。向前恢復使用 ROLLFORWORD 命令執行。
崩潰恢復和備份恢復對任何數據庫都適用,而向前恢復只有在數據庫被指定可以使用此功能是才使用。表一顯示了此功能帶來的影響。
表一 數據庫能否進行向前恢復帶來的影響
如果不允許進行向前恢復 |
如果允許進行向前恢復 |
在發生失敗后,可以把數據庫恢復到失敗前與最后一次事務一致的狀態。
|
同樣,也支持恢復到與最后一次事務一致的狀態。
|
可以把數據庫恢復到任何有效的備份狀態,但是不能重新執行發生在備份之后的事務。
|
可以把數據庫恢復到任何有效的備份狀態,并且可以重新執行從發生失敗到當前為止提交的事務。
|
只能在沒有任何應用連接到數據庫時進行備份(這稱為脫機備份)。
|
可以在應用連接到數據庫時和事務正在處理時進行備份(這稱為聯機備份)。同樣支持脫機備份。
|
每一個備份都必須包含整個數據庫的當前狀態。
|
一個備份可能包含整個數據庫的當前狀態,或者是一個或多個表空間。數據庫的表空間可以單獨地備份和恢復。
|
可以通過把數據庫配置參數 LOGRETAIN 或 USEREXIT 設置為 YES 來使向前恢復生效。日志會由于生成新的文件而不斷增加,并且它們是無限制的。在這種情況下,必須采取一些辦法把舊的日志文件保存到文檔中,以防止文件系統被日志占滿。
1、RESTART 命令
此命令是當一些操作還在處理時發生斷電或軟件崩潰后要發出的第一個命令。它建立一個數據庫的連接,并使用日志來把數據庫恢復到事務一致狀態。所有在失敗發生前由提交操作所引起的數據庫更改都會生效。所有在失敗前被撤消的操作和失敗時正在處理的事務對數據庫進行的更改都被撤消。
下面是 RESTART 命令的例子:
RESTART DATABASE mydb
2、RESTORE 命令
此命令使用存儲在備份中的內容來恢復數據庫的內容。RESTORE 命令可以創建一個新的數據庫。RESTORE 命令需要 SYSADM,SYSCTRL或SYSMAINT特權。RESTORE 命令要使用的備份可能包含整個數據庫或一組表空間。恢復整個數據庫必須脫機進行,恢復表空間可以聯機進行,也就是在還有應用連接到數據庫時進行。RESTORE 命令語法為:
RESTORE DB 目標數據庫別名 [TABLESPACE 表空間名] [FROM 介質名] [TAKEN AT 時間]
下面是一些 RESTORE 命令的例子:
(1)從一個特定目錄(/backup/mydb)中的備份來恢復 mydb 數據庫。如果 mydb 不能夠進行向前恢復,數據庫將被恢復到備份時的狀態,而且可以立即使用。如果能夠進行向前恢復,數據庫會被置為向前掛起(pending)狀態,直到它被執行向前恢復命令之后才能被使用。
RESTORE DATABASE mydb FROM /backup/mydb
(2)下面的命令是對數據庫 mydb 進行恢復,并且在外部指定不進行向前恢復,數據庫可以被立即使用。
RESTORE DATABASE mydb FROM /backup/mydb WITHOUT ROLLING FORWARD
(3)下面的例子是從一個指定的目錄(/backup/mydb)中來恢復 mydb 數據庫的一個指定的表空間,此恢復要使用指定的日期和時間:
RESTORE DATABASE mydb TABLESPACE ONLINE FROM /backup/mydb TAKEN AT 20000926201226
3、ROLLFORWARD 命令
ROLLFORWARD 命令是在執行了一個 RESTORE 命令之后執行的,以便對數據庫或它的表空間進行向前恢復。ROLLFORWARD 命令需要SYSADM,SYSCTRL 或 SYSMAINT 特權,并且數據庫必須能夠進行向前恢復。
ROLLFORWARD 命令可以適用于整個數據庫或是一個或多個表空間,它們的狀態此時都是向前掛起(pending)的。如果向前恢復整個數據庫,此過程必須是脫機的,而且數據庫可以被恢復成備份時間和當前時間之中的任何時間段。如果只向前恢復單獨的表空間,此過程既可以是聯機的也可以是脫機的,但是必須把表空間向前恢復到當前時間后,再重新執行所有引起更改的提交操作,這樣可保證被恢復的表空間和數據庫中的其它部分保持一致。ROLLFORWARD 命令語法為:
ROLLFORWARD DATABASE 數據庫名 [TO {時間,END OF LOGS}][TABLESPACE {ONLINE,表空間名}]
下面是一些 ROLLFORWARD 命令的例子:
(1)此例子使 mydb 數據庫恢復到當前時刻。字句 AND STOP 是讓數據庫不被置為 ROLLFORWARD PENDING 狀態,并且可以被存取:
ROLLFORWARD DATABASE mydb TO END OF LOGS AND STOP
(2)下面的例子向前恢復 mydb 數據庫,并重新執行在指定日期和時間之前提交的所有事務:
ROLLFORWARD DATABASE mydb TO 2000-09-26-10.3059 AND STOP
(3)下面的例子只把數據庫 mydb 中的某一表空間向前恢復。此命令是在執行了一次表空間級別的恢復后發出的,它只適用于被恢復的表空間。此命令指出向前恢復是聯機進行的,并且要進行到當前時間(日志末尾):
ROLLFORWARD DATABASE mydb TO END OF LOGS AND STOP TABLESPACE ONLINE
注:如果數據庫中有一些列是 LOB 數據類型的,并且它們被創建帶有 NOT LOGGED 選項,那么對這些列進行的更新操作就沒有被記錄到日志中,向前恢復就不會對這些列進行操作。如果在向前恢復過程中,遇到了沒有日志的列,它們的值會被置為十六進制的0。
posted on 2006-09-14 09:40
水煮三國 閱讀(245)
評論(0) 編輯 收藏 所屬分類:
Database