程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2數據庫的備份與恢復

DB2數據庫的備份與恢復

編輯:DB2教程

所謂數據備份,就是保留一套備用系統,當運行系統出現故障時,能夠以最小的時間恢復原來的數據。數據庫的備份,可以是整個數據庫的拷貝,也可以是其中一部分數據的拷貝一個或多個表空間)。數據備份一般有兩個層次:
硬件級備份:用冗余的硬件來保證系統的連續運行,比如雙機容錯、硬盤鏡像等方式。如果主硬件損壞,後備硬件能夠立刻接替其工作。
軟件級備份:將系統數據保存到其他可以移動的介質上,如磁帶、軟盤、光盤等。當系統出現故障後,可以將系統恢復到備份時的狀態。本文主要討論的是數據庫的軟件級備份。

一、DB2數據庫的備份

DB2數據庫可以備份整個數據庫,也可以備份其中的一個或多個表空間;可以在應用連接到數據庫時和事務正在處理時進行備份這稱為聯機備份),也可以在沒有任何應用連接到數據庫時進行備份這稱為脫機備份)。(見表一)
DB2數據庫使用命令BACKUP來備份。BACKUP命令需要SYSADM,SYSCTRL或SYSMAINT的權限,其命令語法為:BACKUP DATABASE 數據庫別名 TO 介質名
或者
BACKUP DATABASE 數據庫別名 TABLESPACE 表空間名 [ONLINE} TO 介質名

其中介質名一般指定為介質的絕對路徑,在 AIX 中不回轉的磁帶機設備名為 /dev/rmt0,回轉的磁帶機設備名為 /dev/rmt0.n 。也可將數據備份在硬盤上,介質名即為其絕對路徑。BACKUP命令在指定的介質上生成一個或多個備份文件,以下顯示了在 AIX 4.3 for RS/6000 上生成的文件名結構:
以下是 BACKUP 命令的一些例子:
(1)此例子是在指定的服務器目錄 /backup/mydb 下給 mydb 數據庫創建一個完整的備份:
BACKUP DATABASE mydb TO /backup/mydb
(2)此例子是給 mydb 數據庫中指定的表空間 myspace1 進行聯機備份,在進行備份時,應用可繼續更新數據庫:
BACKUP DATABASE mydb TABLESPACE myspace1 ONLINE TO /backup/mydb

表一 數據庫能否進行向前恢復帶來的影響

如果不允許進行向前恢復

如果允許進行向前恢復

在發生失敗後,可以把數據庫恢復到失敗前與最後一次事務一致的狀態。

同樣,也支持恢復到與最後一次事務一致的狀態。

可以把數據庫恢復到任何有效的備份狀態,但是不能重新執行發生在備份之後的事務。

可以把數據庫恢復到任何有效的備份狀態,並且可以重新執行從發生失敗到當前為止提交的事務。

只能在沒有任何應用連接到數據庫時進行備份這稱為脫機備份)。

可以在應用連接到數據庫時和事務正在處理時進行備份這稱為聯機備份)。同樣支持脫機備份。

每一個備份都必須包含整個數據庫的當前狀態。

一個備份可能包含整個數據庫的當前狀態,或者是一個或多個表空間。數據庫的表空間可以單獨地備份和恢復。

二、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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved