若無特殊說明,以下數據庫備份與恢復的試驗環境均為 Windows XP + IBM DB2 V9 企業版,同樣的語句也在 AIX 5.2 + IBM DB2 V8.2 上驗證通過。
一、 數據庫備份的重要性
在信息日趨發達的時代,數據顯得尤其重要。如何保障數據的完整性和安全性呢?如何避免數據災難事故的發生呢?數據庫備份作為數據安全和完整最有利保障手段的重要性就不言而喻了。
數據庫備份的重要性主要體現在:
1、提高系統的高可用性和災難可恢復性;(在數據庫系統崩潰的時候,沒有數據庫備份怎麼辦!?)
2、使用數據庫備份還原數據庫是數據庫系統崩潰時提供數據恢復最小代價的最優方案;(總不能讓客戶重新填報數據吧!?)
3、沒有數據就沒有一切,數據庫備份就是一種防范災難於未然的強力手段;(沒有了數據,應用再花哨也是鏡中花水中月)
4、對於DBA來說,最首要也是最重要的任務就是數據庫備份。
二、 DB2 數據庫備份的方式與分類
1、按照數據庫備份對數據庫的使用影響來劃分
A、聯機備份(也稱熱備份或在線備份)
B、脫機備份(也稱冷備份或離線備份)
說明:聯機備份和脫機備份最大的不同在於:聯機備份數據庫時,數據庫仍然可以供用戶使用,而脫機備份數據庫則不行。脫機備份數據庫時,必須斷開所有與數據庫有連接的應用後才能進行。
2、按照數據庫的數據備份范圍來劃分
A、完全備份
B、增量備份
說明:完全備份數據庫是指備份數據庫中的所有數據,而增量備份只是備份數據庫中的部分數據。至於增量備份到底備份哪些數據,稍候會提到。
3、增量備份的兩種實現方式
A、增量備份(也稱累計備份)
B、delta備份
說明:這兩種備份方式的嚴格定義如下,
增量備份是自最近成功的完全備份以來所有更改的數據的備份。
delta 備份則是上一次成功的完全、增量或 delta 備份以後所做更改的數據的備份。
這裡請讀者們仔細的看上面兩個增量備份方式的定義,注意這兩種備份方式的細微差別。這裡我們舉一個例子來說明。
假設有一個數據庫,它每天都有部分數據在發生變化。我們星期一晚上對該數據庫做了一次完全備份,星期二晚上對該數據庫做了一次增量備份A(注:這裡的增量備份是指累計備份,下同),星期三晚上又做了一次增量備份B,星期四則做了一次delta 備份。
那麼,我們可以得出以下結論:
•星期一的數據庫備份包含了所有的數據。
•星期二沒有變動過的數據沒有發生備份,在星期二變動過的數據會備份,並且備份到增量備份A中。
•星期三的備份中含有自星期一完全備份以來發生過變動的所有數據,包含了星期二和星期三發生過變動的數據。顯然,增量備份A 被 增量備份 B 包含。
•星期四做的是delta備份,注意,它會也只會備份自星期三備份之後變動過的數據。
三、 DB2 備份文件的結構介紹
在不同的操作系統下,DB2 的備份文件的結構是不同的,這裡概要地介紹一下。
1、 Windows 操作系統下的數據庫備份文件結構:
說明:Windows 操作系統下的數據庫備份文件是嵌套在一系列文件夾之下的特殊結構。上例中,D:DB2_Train 是指備份目錄,TESTDB.0 是指數據庫名稱為 TESTDB,DB2 是指實例名稱,NODE0000 是指節點名稱,CATN0000 是指編目名稱,20070801 是指備份發生的年月日,形如YYYYMMDD,181241是指備份發生的時間,精確到秒,也就是指 18 點 12 分 41 秒,形如HHMMSS,最後的 001 則是備份文件的一個序列號。
2、 Unix 操作系統下的數據庫備份文件結構:
說明:Unix 操作系統下的數據庫備份文件就是一個文件。上例中,HTDC 是指數據庫名稱,db2inst1 是指實例名稱,NODE0000 是指節點名稱,CATN0000 是指編目名稱,20070310002357 是指備份發生的具體時間,形如YYYYMMDDHHMMSS,同樣地,它的時間精確到秒,也就是指 2007年3月10日0點23分57秒發生備份,最後的 001 則是備份文件的一個序列號。
四、 DB2 數據庫備份實驗(附完整命令腳本清單)
4.1 DB2 數據庫實驗准備工作
(1)、Step1:創建測試數據庫 TestDB
腳本清單
CREATEDATABASETestDB
ON'D:'
USINGCODESETGBKTERRITORYCN
WITH'Pjj''sTestDB';
}
(2)、Step2:創建數據庫管理表空間 Data_SP(注意路徑,如果沒有請創建)
腳本清單
CREATEREGULARTABLESPACEData_SP
PAGESIZE4K
MANAGEDBYDATABASE
USING(FILE'D:DB2ContainerTestDBUserDataUserData'2560)
BUFFERPOOLIBMDEFAULTBP;
說明:上面的腳本創建了一個名為 Data_SP 的數據庫管理表空間,該表空間使用的緩沖池為 IBMDEFAULTBP,存儲路徑為 D:DB2ContainerTestDBUserData,存儲文件名為 UserData,大小為 2560 * 4K = 10M,頁大小為 4K。
(3)、Step3:創建測試表 TestTable 並插入測試數據
腳本清單
CREATETABLETestTable
(
IDINTEGERNOTNULLGENERATEDALWAYSASIDENTITY(STARTWITH0,INCREMENTBY1,NOCACHE),
MessageVARCHAR(100),
PRIMARYKEY(ID)
)INData_SP;
--插入測試數據 INSERT INTO TestTable(Message) VALUES('測試表建立成功');
說明:建立測試表並插入數據是為了稍候驗證數據庫恢復的時候用的。
(4)、Step3:創建測試表 TestTable 並插入測試數據
腳本清單
CREATETABLETestTable
(
IDINTEGERNOTNULLGENERATEDALWAYSASIDENTITY(STARTWITH0,INCREMENTBY1,NOCACHE),
MessageVARCHAR(100),
PRIMARYKEY(ID)
)INData_SP;
--插入測試數據
INSERT INTO TestTable(Message)
VALUES('測試表建立成功');
4.2 DB2 數據庫脫機備份與恢復實驗
腳本清單
--Step1:完全備份數據庫(脫機,備份時間戳記為 20071121152940)
db2 backup db TestDB to D:DB2_Train
--Step2:模擬災難,強制刪除數據庫
db2 drop db TestDB
--Step3:根據該數據庫完全備份還原數據庫
db2 restore db TestDB from D:DB2_Train taken at 20071121152940
4.3 DB2 數據庫增量備份與恢復實驗
腳本清單
--數據庫增量備份以及還原實驗
--修改數據庫參數 TrackMod ,使之支持數據庫進行增量備份
db2 update db cfg using TrackMod YES
--更改參數後必須完全離線備份數據庫(脫機,備份時間戳記為 20071121153818)
db2 backup db TestDB to D:DB2_Train
--插入測試數據
INSERT INTO TestTable(Message)
VALUES('開始增量數據庫備份測試');
--開始增量備份(脫機,備份時間戳記為 20071121154006)
db2 backup db TestDB incremental to D:DB2_Train
--刪除數據庫,模擬數據災難
db2 drop db TestDB
--首先還原至完全離線備份狀態
db2 restore db TestDB from D:DB2_Train taken at 20071121153818
--還原至增量離線備份狀態
db2 restore db TestDB incremental automatic from D:DB2_Train taken at 20071121154006
--注意:上述語句中,有一個 automatic ,它表示無論有多少個增量備份,系統將全自動檢索恢復數據庫的順序並自動恢復數據庫。如果沒有 automatic ,則需要多次手動恢復數據庫,很麻煩而且容易出錯。
--Step3:根據該數據庫完全備份還原數據庫
db2 restore db TestDB from D:DB2_Train taken at 20071121152940
--還原數據庫後查詢測試表數據檢驗數據是否恢復成功
4.4 DB2 數據庫聯機機備份與恢復實驗
說明:聯機備份數據庫可以使數據庫在備份的同時仍然保持在可用狀態。要讓數據庫支持聯機備份,必須更改數據庫的日志歸檔方式。在脫機備份模式下,數據庫采用循環日志方式記錄數據庫日志,在聯機備份模式下,數據庫則采用歸檔日志的方式備份數據庫日志。另外,對於聯機備份的數據庫來說,活動日志和歸檔日志就很重要了,一定要經常備份、保存。
腳本清單
--數據庫聯機備份以及還原實驗
--連接至數據庫並插入測試數據
db2 connect to TestDB
--插入測試數據
INSERT INTO TestTable(Message)
VALUES('開始聯機數據庫備份測試--完全備份');
--修改數據庫參數,使之支持在線聯機備份
db2 update db cfg for TestDB using logretain on trackmod on
--執行增量、在線備份之前必須執行離線全備份一次,否則數據庫將處於備份暫掛的不可用狀態
--(聯機完全備份,時間戳記:20071121160548)
db2 backup db TestDB
--連接至數據庫並插入測試數據
db2 connect to TestDB
--插入測試數據
INSERT INTO TestTable(Message)
VALUES('開始聯機數據庫備份測試--增量備份');
--執行聯機備份,備份同時再打開一個會話,模擬應用在線(聯機增量備份,時間戳記:20071121152922)
db2 backup db TestDB online incremental to D:DB2_Train
--模擬災難,刪除數據庫!
--重要,此前一定要將活動日志文件備份至另一個路徑,保存好,本例中,活動日志保存在 C:db2admin 下。
db2 drop db TestDB
--根據在線完全備份恢復數據庫
db2 restore db TestDB from D:DB2_Train taken at 20071121160548
--根據在線增量備份恢復數據庫
db2 restore db TestDB incremental automatic from D:DB2_Train taken at 20071121152922
--恢復後的數據庫處於前滾暫掛的不可用狀態
db2 connect to TestDB
--前滾數據庫,並指定歸檔日志位置,重要!
db2 ROLLFORWARD DATABASE TESTDB TO END OF LOGS AND COMPLETE OVERFLOW LOG PATH ("C:db2admin")
五. 綜述
對於數據庫管理人員或者維護人員來說,怎麼強調數據庫備份的重要性都不為過。
希望本文能拋磚引玉,能讓大家對 IBM DB2 UDB 的數據庫備份與恢復有一些深入的認識。也希望大家能在本機上按照本文的腳本認真的做一次實驗,這樣,你的認識會更加深刻。
數據庫崩潰和災難並不可怕,可怕的是在發生數據庫崩潰和災難的時候沒有數據庫備份。這句話與各位數據庫愛好者共勉。