備份測試數據庫
現在我們來備份測試數據庫,好方便我們在下面的例子中可以恢復到此時的狀態,如清單10所示。
--清單 10.備份數據庫
BACKUP DATABASE DB2TEST1 TO /db2/databases/backup/
命令執行完後,顯示如下:
備份成功。此備份映像的時間戳記是:20070911175125
創建示例表
接下來我們創建示例表,在/home/db2inst1/目錄下我們編寫腳本employee.sql,內容如清單11所示。
--清單 11. employee.sql內容
CREATE TABLE "DB2INST1"."EMPLOYEE" (
"EMPNO" CHAR(6) NOT NULL ,
"FIRSTNME" CHAR(12) NOT NULL ,
"MIDINIT" CHAR(1) ,
"LASTNAME" CHAR(15) NOT NULL ,
"PHOTO" BLOB (10 M ) NOT NULL LOGGED NOT COMPACT,
"WORKDEPT" CHAR(3) ,
"PHONENO" CHAR(4) ,
"HIREDATE" DATE ,
"JOB" CHAR(8) ,
"EDLEVEL" SMALLINT NOT NULL ,
"SEX" CHAR(1) ,
"BIRTHDATE" DATE ,
"SALARY" DECIMAL(9,2) ,
"BONUS" DECIMAL(9,2) ,
"COMM" DECIMAL(9,2) )
IN "TABLESPACE1" LONG IN "TABLESPACE2";
接下來執行employee.sql腳本:
$db2 –tvf /home/db2inst1/employee.sql
執行成功後,表DB2INST1.EMPLOYEE的用戶數據存放在TABLESPACE1,大型字段存放在TABLESPACE2中,其中TABLESPACE1是使用自動存儲器,TABLESPACE2是使用的非自動存儲器。
再次備份測試數據庫
現在我們來再次備份測試數據庫,好方便我們在下面的例子中可以恢復到此時的狀態,如清單12所示。
--清單 12.備份數據庫
BACKUP DATABASE DB2TEST1 TO /db2/databases/backup/
命令執行完後,顯示如下:
備份成功。此備份映像的時間戳記是:20070911175656
利用全量備份還原測試數據庫
使用RESTORE DATABASE 命令來在發生問題(例如介質或存儲器故障、斷電或者應用程序故障)後恢復數據庫或表空間。如果已經備份了數據庫或各個表空間,則可以在它們由於某種原因損壞時重新創建它們。
需要注意的是,我們的備份介質中所包含的自動存儲路徑在我們要復原的環境中必須存在,這次還原我們將利用第一次全量備份的備份文件,時間戳為20070911175125,通過DB2命令行發出RESTORE DATABASE命令,具體如清單13所示。
--清單 13.還原數據庫
RESTORE DATABASE DB2TEST1 FROM /db2/databases/backup/ TAKEN AT 20070911175125
由於DB2TEST1數據庫存在並且在發出RESTORE DATABASE命令時將被替換,所以會返回一個提示消息,內容如下:
SQL2539W 警告!正在復原至與備份映像數據庫相同的現有數據庫。數據庫文件將被刪除。
要繼續嗎?(y/n)
我們指定y,將完成還原操作。
數據庫還原操作需要一個獨占連接:啟動任務後,restore實用程序會防止其他應用程序訪問數據庫,直到還原操作成功完成,所以不能再對該數據庫運行任何應用程序,但表空間還原操作可以聯機完成,前提是該數據庫是歸檔數據庫。
命令成功後,連接數據庫,會報數據庫處於ROLL-FORWARD PENDING狀態,這是因為歸檔數據庫執行完還原後,需要進行前滾恢復,具體返回消息如下:
SQL1117N 由於 ROLL-FORWARD PENDING,不能連接或激活數據庫 "DB2TEST1"。SQLSTATE=57019
接下來我們對DB2TEST1繼續進行前滾恢復,發出ROLLFORWARD命令,具體見清單14所示。
--清單 14.前滾恢復數據庫
ROLLFORWARD DATABASE DB2TEST1 TO END OF LOGS AND STOP
執行成功後,就可以正常訪問數據庫了,從返回的消息可以看到已處理的日志文件有兩個S0000001.LOG、S0000002.LOG兩個,此時具體的消息如清單15所示下。
清單 15.前滾恢復數據庫返回消息
前滾狀態
輸入數據庫別名 = DB2TEST1
節點數已返回狀態 = 1
節點號 = 0
前滾狀態 = 未暫掛
下一個要讀取的日志文件 =
已處理的日志文件 = S0000001.LOG - S0000002.LOG
上次落實的事務 = 2007-09-11-09.56.54.000000 UTC
DB20000I ROLLFORWARD命令成功完成。
非增量重定向還原測試數據庫
以上介紹了如何對數據庫進行還原和前滾恢復,接下來看一下如何對不允許增量備份的數據庫進行非增量重定向還原。
在數據庫備份操作期間,保留了一個記錄,它記錄了與正在備份的表空間相關的所有表空間容器。在還原操作期間,會檢查備份映像中列示的所有容器,以確定它們是否存在並可訪問。若這些容器中的一個或多個由於介質故障(或由於任何其他原因)而不可訪問,還原操作將失敗。在這種情況下,還原操作需要重定向至不同的容器。
可以通過調用RESTORE DATABASE命令並指定REDIRECT參數來重新定義表空間容器,需要注意的是對使用自動存儲功能的表空間需要重新指定自動存儲路徑,而不是重定向至不同的容器。在重定向還原操作期間,如果目錄和文件容器不存在,將自動創建。數據庫管理器不會自動創建設備容器。容器重定向為管理表空間容器提供了相當大的靈活性。
我們使用時間戳記為20070911175656的全備備份映像進行重定向還原,首先,連接上DB2TEST1數據庫(如果要還原的是另外的機器,可以在其上面建立一個名稱為DB2TEST1的數據庫,再連接上),發出RESTORE DATABASE命令,使用REDIRECT選項,如清單16所示。
--清單 16.重定向還原數據庫第一步
RESTORE DATABASE DB2TEST1 TAKEN AT 20070911175656 ON /db2/databases/new_db2test1/auto_storage DBPATH ON /db2/databases/new_db2test1 REPLACE EXISTING REDIRECT
我們此次重定向還原數據庫,通過ON和DBPATH ON參數將數據庫路徑和自動存儲器路徑都做了更改,即把數據庫路徑由/db2/databases/db2test1改成了/db2/databases/new_db2test1,把自動存儲器路徑由/db2/databases/db2test1/auto_storage改成了/db2/databases/new_db2test1/auto_storage。
DBPATH ON參數表示目標數據庫目錄。如果實用程序還原到一個現有數據庫,將忽略次參數。知道的驅動器和目錄必須是本地的。如果備份映像包括啟用了自動存儲器的數據庫,且未指定ON參數,則此參數與TO參數是同義詞,且僅數據庫目錄被更改,而與數據庫關聯的存儲路徑不更改。
TO target-directory參數我們這裡沒有使用,簡單介紹一下這個參數,因為在實際應用過程中,也會經常用到。此參數表示目標數據庫目錄,如果實用程序還原到一個現有數據庫,將忽略此參數。指定的驅動器和目錄必須是本地的。如果備份映像包括啟用了自動存儲器的數據庫,則僅數據庫目錄被更改,而與數據庫關聯的存儲路徑不更改。
ON參數重新定義與自動存儲區數據庫相關聯的存儲路徑。此參數只能用在啟用了自動存儲器的數據庫上,如果將此參數與未啟用自動存儲器的數據庫將導致錯誤(SQL20321N)。使用此參數後, 不再使用備份映像中定義的現有存儲路徑,自動存儲器表空間自動重定向至新路徑。如果沒有為自動存儲器數據庫指定此參數,則存儲器路徑仍為備份映像中定義的路徑,此時,備份映像中定義的路徑在我們要還原的服務器上要真實存在,否則整個重定向最終會失敗。
可以指定一個或多個路徑,各個路徑之間用逗號分隔。每個路徑必須有絕對路徑名稱且該路徑必須在本地。如果磁盤上尚沒有該數據庫,且未指定DBPATH ON參數,則第一個路徑用作目標數據庫目錄。
對不使用自動存儲,且需要重新定義其容器的表空間TABLESPACE2發出SET TABLESPACE CONTAINERS命令。對TABLESPACE2的表空間標識可以通過LIST TABLESPACES SHOW DETAIL得到。表空間TABLESPACE1、SYSCATSPACE、TEMPSPACE1和USERSPACE1,都是使用自動存儲管理,所以不需要發出SET TABLESPACE CONTAINERS命令。如清單17所示。
--清單 17.重定向還原數據庫第二步
SET TABLESPACE CONTAINERS FOR 4 USING (FILE /databases/tablespace1/tablespace_32k 640)
成功後完成了第一步和第二步之後,發出RESTORE DATABASE DB2TEST1 CONTINUE命令,如清單18所示。
--清單 18.重定向還原數據庫第三步
RESTORE DATABASE DB2TEST1 CONTINUE
如果第三步失敗,或者如果已異常終止了還原操作,則可以從第一步重啟啟動重定向的還原。
命令成功後,連接數據庫,會報數據庫處於ROLL-FORWARD PENDING狀態,這是因為歸檔數據庫執行完還原後,需要進行前滾恢復,具體返回消息如下:
SQL1117N 由於 ROLL-FORWARD PENDING,不能連接或激活數據庫 "DB2TEST1"。SQLSTATE=57019
接下來我們對DB2TEST1繼續進行前滾恢復,發出ROLLFORWARD命令,具體見清單19所示。
--清單 19.前滾恢復數據庫
ROLLFORWARD DATABASE DB2TEST1 TO END OF LOGS AND STOP
執行成功後,就可以正常訪問數據庫了,從返回的消息可以看到已處理的日志文件有S0000003.LOG,此時具體的消息如清單20所示下。
清單 20.前滾恢復數據庫返回消息
前滾狀態
輸入數據庫別名 = DB2TEST1
節點數已返回狀態 = 1
節點號 = 0
前滾狀態 = 未暫掛
下一個要讀取的日志文件 =
已處理的日志文件 = S0000003.LOG - S0000003.LOG
上次落實的事務 = 2007