淺談DB2數(shù)據(jù)庫的備份與恢復(fù)(下)
2024-09-06 23:57:58
供稿:網(wǎng)友
二、db2數(shù)據(jù)庫的恢復(fù)
db2數(shù)據(jù)庫提供了三種恢復(fù)類型:
1、崩潰恢復(fù)(crash recovery):崩潰恢復(fù)是用來在失敗后立即進行恢復(fù),把數(shù)據(jù)庫恢復(fù)到一個事務(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):在一個數(shù)據(jù)庫從備份中恢復(fù)了以后,向前恢復(fù)可以重新執(zhí)行那些在備份后才更改了數(shù)據(jù)庫的操作。在這種情況下,數(shù)據(jù)庫可以恢復(fù)到備份和當(dāng)前時間之間的任何時間斷。向前恢復(fù)使用 rollforword 命令執(zhí)行。
崩潰恢復(fù)和備份恢復(fù)對任何數(shù)據(jù)庫都適用,而向前恢復(fù)只有在數(shù)據(jù)庫被指定可以使用此功能是才使用。表一顯示了此功能帶來的影響。
表一 數(shù)據(jù)庫能否進行向前恢復(fù)帶來的影響
如果不允許進行向前恢復(fù)如果允許進行向前恢復(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ù)庫時進行備份(這稱為脫機備份)。
可以在應(yīng)用連接到數(shù)據(jù)庫時和事務(wù)正在處理時進行備份(這稱為聯(lián)機備份)。同樣支持脫機備份。
每一個備份都必須包含整個數(shù)據(jù)庫的當(dāng)前狀態(tài)。
一個備份可能包含整個數(shù)據(jù)庫的當(dāng)前狀態(tài),或者是一個或多個表空間。數(shù)據(jù)庫的表空間可以單獨地備份和恢復(fù)。
可以通過把數(shù)據(jù)庫配置參數(shù) logretain 或 userexit 設(shè)置為 yes 來使向前恢復(fù)生效。日志會由于生成新的文件而不斷增加,并且它們是無限制的。在這種情況下,必須采取一些辦法把舊的日志文件保存到文檔中,以防止文件系統(tǒng)被日志占滿。
1、restart 命令
此命令是當(dāng)一些操作還在處理時發(fā)生斷電或軟件崩潰后要發(fā)出的第一個命令。它建立一個數(shù)據(jù)庫的連接,并使用日志來把數(shù)據(jù)庫恢復(fù)到事務(wù)一致狀態(tài)。所有在失敗發(fā)生前由提交操作所引起的數(shù)據(jù)庫更改都會生效。所有在失敗前被撤消的操作和失敗時正在處理的事務(wù)對數(shù)據(jù)庫進行的更改都被撤消。
下面是 restart 命令的例子:
restart database mydb
2、restore 命令
此命令使用存儲在備份中的內(nèi)容來恢復(fù)數(shù)據(jù)庫的內(nèi)容。restore 命令可以創(chuàng)建一個新的數(shù)據(jù)庫。restore 命令需要 sysadm,sysctrl或sysmaint特權(quán)。restore 命令要使用的備份可能包含整個數(shù)據(jù)庫或一組表空間。恢復(fù)整個數(shù)據(jù)庫必須脫機進行,恢復(fù)表空間可以聯(lián)機進行,也就是在還有應(yīng)用連接到數(shù)據(jù)庫時進行。restore 命令語法為:
restore db 目標(biāo)數(shù)據(jù)庫別名 [tablespace 表空間名] [from 介質(zhì)名] [taken at 時間]
下面是一些 restore 命令的例子:
(1)從一個特定目錄(/backup/mydb)中的備份來恢復(fù) mydb 數(shù)據(jù)庫。如果 mydb 不能夠進行向前恢復(fù),數(shù)據(jù)庫將被恢復(fù)到備份時的狀態(tài),而且可以立即使用。如果能夠進行向前恢復(fù),數(shù)據(jù)庫會被置為向前掛起(pending)狀態(tài),直到它被執(zhí)行向前恢復(fù)命令之后才能被使用。
restore database mydb from /backup/mydb
(2)下面的命令是對數(shù)據(jù)庫 mydb 進行恢復(fù),并且在外部指定不進行向前恢復(fù),數(shù)據(jù)庫可以被立即使用。
restore database mydb from /backup/mydb without rolling forward
(3)下面的例子是從一個指定的目錄(/backup/mydb)中來恢復(fù) mydb 數(shù)據(jù)庫的一個指定的表空間,此恢復(fù)要使用指定的日期和時間:
restore database mydb tablespace online from /backup/mydb taken at 20000926201226
3、rollforward 命令
rollforward 命令是在執(zhí)行了一個 restore 命令之后執(zhí)行的,以便對數(shù)據(jù)庫或它的表空間進行向前恢復(fù)。rollforward 命令需要sysadm,sysctrl 或 sysmaint 特權(quán),并且數(shù)據(jù)庫必須能夠進行向前恢復(fù)。
rollforward 命令可以適用于整個數(shù)據(jù)庫或是一個或多個表空間,它們的狀態(tài)此時都是向前掛起(pending)的。如果向前恢復(fù)整個數(shù)據(jù)庫,此過程必須是脫機的,而且數(shù)據(jù)庫可以被恢復(fù)成備份時間和當(dāng)前時間之中的任何時間段。如果只向前恢復(fù)單獨的表空間,此過程既可以是聯(lián)機的也可以是脫機的,但是必須把表空間向前恢復(fù)到當(dāng)前時間后,再重新執(zhí)行所有引起更改的提交操作,這樣可保證被恢復(fù)的表空間和數(shù)據(jù)庫中的其它部分保持一致。rollforward 命令語法為:
rollforward database 數(shù)據(jù)庫名 [to {時間,end of logs}][tablespace {online,表空間名}]
下面是一些 rollforward 命令的例子:
(1)此例子使 mydb 數(shù)據(jù)庫恢復(fù)到當(dāng)前時刻。字句 and stop 是讓數(shù)據(jù)庫不被置為 rollforward pending 狀態(tài),并且可以被存取:
rollforward database mydb to end of logs and stop
(2)下面的例子向前恢復(fù) mydb 數(shù)據(jù)庫,并重新執(zhí)行在指定日期和時間之前提交的所有事務(wù):
rollforward database mydb to 2000-09-26-10.3059 and stop
(3)下面的例子只把數(shù)據(jù)庫 mydb 中的某一表空間向前恢復(fù)。此命令是在執(zhí)行了一次表空間級別的恢復(fù)后發(fā)出的,它只適用于被恢復(fù)的表空間。此命令指出向前恢復(fù)是聯(lián)機進行的,并且要進行到當(dāng)前時間(日志末尾):
rollforward database mydb to end of logs and stop tablespace online
注:如果數(shù)據(jù)庫中有一些列是 lob 數(shù)據(jù)類型的,并且它們被創(chuàng)建帶有 not logged 選項,那么對這些列進行的更新操作就沒有被記錄到日志中,向前恢復(fù)就不會對這些列進行操作。如果在向前恢復(fù)過程中,遇到了沒有日志的列,它們的值會被置為十六進制的0。