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