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