在上一篇文章( DB2 基礎:使用重定向恢復克隆 DB2 數據庫)中,我概述了使用重定向恢復操作恢復另一台機器上的 DB2 數據庫所需執行的步驟。 重定向恢復操作由兩個過程組成,中間還有一個表空間容器定義步驟。使用完整數據庫備份映像來克隆數據庫當然不錯,但是如果數據庫備份映像不足以將數據庫恢復到災難前一刻的狀態,而該數據庫又必須在另一台服務器上進行恢復,那麼情況會是如何呢?
假設您的數據庫服務器在火災中受損,您應該怎麼辦? 如果您已經將備份映像集和日志文件存儲在遠程機器上,其中備份映像集包括完整數據庫備份、聯機增量備份和聯機增量 delta 備份映像,日志文件中記錄了從最後一次進行備份操作時到發生災難時所執行的所有事務,並且您的數據庫支持前滾恢復(將數據庫配置參數 logretain設置為 ON)和增量備份(將數據庫配置參數 trackmod設置為 ON),那您就沒有什麼可擔心的,您完全可以通過下述方法在另外一台機器上重新恢復數據庫。
為了在另一台服務器上恢復該數據庫,您將必須執行 重定向增量數據庫恢復操作,接著執行 數據庫前滾操作。重定向增量恢復操作是對一組增量備份映像進行重定向恢復的操作。 增量備份映像包含了自最後一次 完整備份操作以來所作的所有更改。 增量 delta 備份映像包含了最後一次( 完整或增量)備份操作以來所作的所有更改。在成功完成數據庫恢復操作之後,在數據庫前滾操作期間要對數據庫再次應用某些事務,這些事務沒有記錄在任何數據庫備份映像中,但是記錄在恢復日志中。
以下(Windows)示例為您演示了如何成功地執行重定向增量恢復和前滾操作。為了方便起見,我的恢復操作不是在另一台 服務器上執行,而是在同一台機器上的另外一個 實例中進行的,但其原理和步驟與在另外一台 服務器上進行恢復沒有什麼區別,因為在同一機器上的不同實例在 邏輯上也是完全隔離的。
本示例中的源實例稱為 PROD。目標實例稱為 MYINST。我們打算使用 DB2 所附帶的 SAMPLE 數據庫。本例中的 SAMPLE 數據庫將創建在 D 盤上。
在 PROD 上創建 SAMPLE 數據庫,使之支持前滾恢復和增量備份,然後創建完整數據庫備份映像:
set DB2INSTANCE=PROD
db2start
db2sampl
db2 update db cfg for sample using logretain on
db2 update db cfg for sample using trackmod on
db2 backup db sample
這個映像的時間戳記是 20021022205203 ,該映像位於 D:\SAMPLE.0\PROD\NODE0000\CATN0000\20021022 。DB2 在發出 BACKUP DATABASE 命令的目錄下創建這個子目錄樹。該子目錄名稱如下所示:
<database_alias.backup_type>\<instance_name>\<node_number>\<catalog_node_number>\<date>
在這個子目錄樹內會有個表示實際備份映像的文件( 205203.0 )。文件名表示進行備份的時間。
注:如果您將備份映像重新定位到另一台機器中,請在目標機器上創建上述路徑(用適當的目標實例名替代 PROD)並將該備份映像復制到該目錄。
連接至 SAMPLE 數據庫並對其中一個表(比如 SALES)應用事務,然後調用聯機增量備份操作(聯機備份操作允許其它應用程序並行訪問數據庫)。
db2 connect to sample
db2 insert into sales values ('10/21/2002','GOUNOT','Ontario-South',3)
db2 insert into sales values ('10/23/2002','GOUNOT','Ontario-North',7)
db2 insert into sales values ('10/24/2002','GOUNOT','Quebec',4)
db2 insert into sales values ('10/25/2002','GOUNOT','Manitoba',2)
db2 backup db sample online incremental
這個映像的時間戳記是 20021022205237 。現在子目錄樹內有兩個備份映像。
連接至 SAMPLE 數據庫並對 SALES 表重新應用一些事務,然後調用聯機增量 delta 備份操作:
db2 connect to sample
db2 insert into sales values ('10/28/2002','LEE','Ontario-South',5)
db2 insert into sales values ('10/28/2002','LEE','Ontario-North',1)
db2 backup db sample online incremental delta
這個映像的時間戳記是 20021022205302 。現在子目錄樹內有三個備份映像了(完整備份、增量備份和增量 delta 備份)。
連接至 SAMPLE 數據庫並對 SALES 表再應用一些事務:
db2 connect to sample
db2 insert into sales values ('10/31/2002','LUCCHESSI','Ontario-South',9)
db2 insert into sales values ('10/31/2002','LUCCHESSI','Quebec',2)
db2 insert into sales values ('10/31/2002','LUCCHESSI','Manitoba',7)
db2 connect reset
我們將需用事務日志以及備份映像來恢復 MYINST 上的 SAMPLE 數據庫。如果有必要,請驗證這些日志的位置:
db2 get db cfg for sample
這個命令可以顯示日志文件的存儲路徑(察看logpath參數)。
啟動 MYINST,然後調用重定向恢復操作的第一步。
set DB2INSTANCE=MYINST
db2start
db2 restore db sample incremental automatic from d taken at 20021022205302 to d
redirect
如果 RESTORE DATABASE 命令是從包含備份映像的目錄之外的目錄調用的,那麼必須指定 FROM 參數。TO 參數指定了目標數據庫目錄(只有在 Windows 操作系統上指定驅動器字母)。如果您指定了 AUTOMATIC,就不必對恢復數據庫所必需的(完整和增量)映像組中的每個備份映像發出單獨的 RESTORE DATABASE 命令。
為三個缺省表空間(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)定義新的表空間容器,這三個表空間和恢復的數據庫相關:
db2 set tablespace containers for 0 using (path 'd:\ts0con1')
db2 set tablespace containers for 1 using (path 'd:\ts1con1')
db2 set tablespace containers for 2 using (path 'd:\ts2con1')
您可以使用 LIST TABLESPACES SHOW DETAIL 命令得到源數據庫中所有表空間的信息;這有助您確保已為目標數據庫中的所有表空間都設置了容器。
完成重定向恢復操作:
db2 restore db sample continue
數據庫處於前滾掛起狀態,在可以訪問它之前必須對其進行前滾操作來消除該狀態。
確定 MYINST 上 SAMPLE 數據庫的日志路徑,並將日志從 PROD 上的 SAMPLE 數據庫復制到下面這個位置:
db2 get db cfg for sample
copy PROD\NODE0000\SQL00001\SQLOGDIR\*.* D:\MYINST\NODE0000\SQL00002\SQLOGDIR
GET DATABASE CONFIGURATION 命令的輸出包括了到日志文件的路徑。
通過前滾事務日志,獲取最後一次備份操作後對數據庫所作的所有更改,從而完成數據庫恢復操作:
db2 rollforward db sample to end of logs and stop
驗證:已經正確地為已恢復數據庫編目,您為其定義的表空間容器與已恢復的數據庫真正關聯在了一起,所有針對 PROD 上的 SAMPLE 數據庫的事務都反映在 MYINST 上已恢復數據庫中:
db2 list db directory
db2 connect to sample
db2 list tablespace containers for 0
db2 list tablespace containers for 1
db2 list tablespace containers for 2
db2 select * from sales
db2 connect reset
db2 terminate
db2stop
set DB2INSTANCE=PROD
db2stop