DB2 備份 恢復 詳細測試
本文測試環境:Windows XP、IBM DB2 Express V9.5、 DB2 Quest Center V9.5
在這裡舉個應用場景以說明資料庫恢復備份的思路:
那麼假設我們週一晚上做了一個數據庫的備份,週二中午12
點資料庫儲存介質出現了故障。如何能夠實現恢復呢
?
那麼首先是把資料庫恢復到我們備份的那個時刻(週一晚上),但是備份之後和週二
12
點之間對資料庫已經做的交易(事物)怎麼辦呢?這就需要用到資料庫日誌,因為一旦交易提交,我們對資料庫做的
SQL
(
insert
、
update
、
delete
等)都會記錄到資料庫日誌中。所以我們就用資料庫日誌(前提是資料庫日誌沒有受到損壞)把備份之後和資料庫崩潰之前的所有
1、DB2資料備份和恢復實驗準備工作
Step1:建立測試資料庫TestDB
2 ON ' E: ' 3 USING CODESET GBK TERRITORY CN
4 WITH ' DEMO TestDB ' ;
結果:
*** SCRIPT START: Connection: LENOVO-MILO-DB2-TOOLSDB (db2admin) Jul-09-2009 14:34:49 ***
CREATE DATABASE TestDB
ON 'E:'
USING CODESET GBK TERRITORY CN
WITH 'DEMO TestDB';
completed successfully.
DB20000I CREATE DATABASE命令成功完成。
Statement processed successfully in 32.42 secs.
*** SCRIPT END : Connection: NONE Jul-09-2009 14:35:21 ***
Step2:建立資料庫管理表區間Data_SP(要先設定好路徑和檔案)
此處的路徑為:E:/DB2_Train/TestDB/UserData
檔名設定為:TestDB.UserData
2
3 PAGESIZE 4K
4
5 MANAGED BY DATABASE 6
7 USING( FILE
8
9 BUFFERPOOL IBMDEFAULTBP;
這裡設定了初始化為4K * 2560 = 10MB的表空間
結果:TableSpace裡面多了一個名為Data_SP表空間
Step3:建立測試表TestTable
2 (
3 ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0 , INCREMENT BY 1 , NO CACHE),
4 Message VARCHAR ( 100 ),
5 PRIMARY KEY (ID)
6 ) IN Data_SP;
結果:
:
Step4:在TestTable下面插入測試資料
2 VALUES ( ' 測試表建立成功 ' )
--說明:建立測試表並插入資料是為了稍後驗證資料庫恢復的時候用的--
結果:
或者可以使用
2 db2start
3 db2 connect to TestDB
4 db2 select * from TestTable
Step5:DB2資料庫離線備份和恢復實驗
說明:我將離線備份的檔案放在了以下路徑中:E:/DB2_Train/Offline
1、完全離線備份資料庫
2 db2start
3
4 db2 connect to TestDB
5 // 指定當前活動的資料庫為TestDB
6
7 db2 backup db TestDB to "E:/DB2_Train/Offline"
8 // 完全備份資料庫,(離線,備份時間戳為20090709152004)
9
10
2、模擬災難現場,強制刪除TestDB資料庫
3、根據資料庫完全備份恢復資料庫
2 db2 restore db TestDB from "E:/DB2_Train/Offline" taken at 20090709152004
4、查詢表TestTable裡面內容,這一塊要重點關注,因為它涉及三種備份方式的區別
2 db2start
3
4 db2 connect to TestDB
5
6 db2 select * from TestTable
Step6、DB2資料庫增量備份和恢復實驗
1、檢視資料庫配置檔案
2 db2 get db cfg for TestDB
2、修改資料庫配置引數TRACKMOD,使之資料庫進行增量備份
2 db2 update db cfg for TestDB USING TRACKMOD YES
3、更改引數後,必須需要完全離線全備份資料庫
2 db2 backup db TestDB to "E:/DB2_Train/Online"
3、檢視TestTable表的內容
4、插入測試資料
這裡我要說明一下為什麼要在表這裡插入測試據?
狀態 | TestTable表裡MESSAGE的值 | 備註 |
全備份 | 測試表建立成功 | |
插入資料 |
測試表建立成功 開始增量資料庫備份測試 |
|
增量備份 |
測試表建立成功 開始增量資料庫備份測試 |
|
還原全備份 |
測試表建立成功 |
|
還原增量備份 |
測試表建立成功 開始增量資料庫備份測試 |
3 VALUES ( ' 開始增量資料庫備份測試 ' )
5、開始增量備份(離線備份)
2 db2 backup db TestDB incremental to "E:/DB2_Train/Online"
6、模擬災難,強制刪除資料庫
2 db2 drop db TestDB
7、恢復資料庫
首先還原至完全離線備份狀態,然後還原至增量離線備份狀態
7.1、還原至完全離線備份狀態
2 db2 restore db TestDB from "E:/DB2_Train/Online" taken at 20090709163256
這裡要注意還原完全備份後TestTable表裡Message的值,也是為什麼要加入測試資料的原因
7.2、還原至增量離線備份狀態
4
Step7、DB2聯機備份和恢復實驗
聯
機備份資料庫可以使資料庫在備份的同時仍然保持在可用狀態。要讓資料庫支援聯機備份,必須更改資料庫的日誌歸檔方式。在離線備份模式下,資料庫採用迴圈日
志方式記錄資料庫日誌,在聯機備份模式下,資料庫則採用歸檔日誌的方式備份資料庫日誌。另外,對於聯機備份的資料庫來說,
活動日誌和歸檔日誌就很重要了,一定要經常備份、儲存,像銀行多數使用的是歸檔日誌的方式,因為銀行的資料關乎到民生的生活,哪怕是突然間斷電了,資料庫崩潰了,但是每一筆的銀行交易都需要時時刻刻把交易記錄儲存下來,所以這裡的聯機備份模式就很適合這類的應用場景
1、實驗開始之前,最好先重新啟動資料庫例項,並且連線到需要做聯機備份的資料庫,此例資料庫為TestDB
2 db2start
3 db2 connect to TestDB
2、開始插入測試資料,此處為“開始聯機備份恢復的測試”
3 VALUES ( ' 開始聯機備份恢復測試 ' )
3、修改資料庫配置檔案引數,以啟動聯機備份模式
2 db2 get db cfg for TestDB
主要測試的引數為
引數名 | 修改前 | 修改後 |
TRACKMOD | ON | ON |
MIRRORLOGPATH | NULL | E:/DB2_Train/Logs |
LOGRETAIN | OFF | ON |
USEREXIT | OFF | ON |
2 // 參 數MIRRORLOGPATH設定為E:/DB2_Train/Logs,還有一點需要補充的是,當刪除資料庫的時候,它會根據資料庫配置檔案來自動搜尋 相關的檔案,因此這個資料夾下面的資料庫日誌檔案同樣也會被刪除,所以需要將它複製一份放到別的路徑下,此例放在了E:/DB2_Train /Logs_Backup,一定要注意另外儲存歸檔好這些資料庫日誌檔案
3 // 引數LOGRETAIN設定為ON
4 // 引數USEREXIT設定為ON
5 db2 update db cfg for TestDB USING TRACKMOD ON MIRRORLOGPATH E:/DB2_Train/Logs LOGRETAIN ON USEREXIT ON 6
7 // 更新配置檔案引數好,最好重新啟動一下資料庫,以使引數設定成功
8 db2stop force
9 db2start
10 db2 connect to TestDB
11
12 // 每當更改為聯機備份模式的時候,系統會要求你強制離線完全備份一次資料庫
4、執行離線完全備份(離線,時間戳為20090710113202)
2 db2 backup db TestDB to "E:/DB2_Train/Online"
5、插入測試資料
3 VALUES ( ' 開始聯機備份恢復測試--開始增量備份 ' )
6、執行聯機線上增量備份,模擬應用線上(聯機增量備份,時間戳為20090710115930)
2 db2 backup db TestDB online incremental to "E:/DB2_Train/Online"
7、插入測試資料
這裡模擬發生了一個應用場景,假設我早上11點鐘做了離線完全備份,12點鐘做了線上增量備份,但是1點鐘突然間發生了不可預見的災難性事故,資料庫崩潰了,在12點鐘備份後到1點鐘這個時間段我做了一個插入資料“開始聯機備份恢復測試-資料庫日誌”
3 VALUES ( ' 開始聯機備份恢復測試-資料庫日誌 ' )
這裡列出所有備份所對應的TestTable表裡Message欄位的值
名稱 |
ID |
TestTable表裡Message欄位的值 |
離線完全備份 |
0 測試表建立成功 |
|
線上增量備份 |
0 測試表建立成功 |
|
資料庫日誌 |
0 測試表建立成功 |
8、儲存歸檔好資料庫日誌檔案
系統預設的資料庫日誌檔案存放位置,此路徑由引數MIRRORLOGPATH設定,這裡為E:/DB2_Train/Logs
說
明:Windows作業系統下的資料庫備份檔案是巢狀在一系列資料夾之下的特殊結構。上例中,D:/DB2_Train
是指備份目錄,TESTDB.0是指資料庫名稱為 TESTDB,DB2 是指例項名稱,NODE0000 是指節點名稱,CATN0000
是指編目名稱,20070801是指備份發生的年月日,形如YYYYMMDD,181241是指備份發生的時間,精確到秒,也就是指 18 點 12
分 41秒,形如HHMMSS,最後的 001 則是備份檔案的一個序列號。
9、本例資料庫日誌歸檔整理後的檔案組織結構
10、模擬災難現場,強制刪除資料庫
2 db2stop force
3 db2start
4 // 強制刪除資料庫
5 db2 drop db TestDB
11、根據離線完全備份恢復資料庫
2 db2 restore db TestDB from "E:/DB2_Train/Online" taken at 20090710113202
12、根據線上增量備份恢復資料庫
2 db2 restore db TestDB incremental automatic from "E:/DB2_Train/Online" taken at 20090710115930 3 // 然後根據系統提示,輸入y確認恢復
13、前滾恢復資料庫,並指定歸檔日誌位置
2 db2 ROLLFORWARD DATABASE TestDB TO END OF LOGS AND COMPLETE OVERFLOW LOG PATH("E:/DB2_Train/Logs_Backup/TestDB. 0 /DB2/NODE0000/CATN0000/ 20090710 / 115930.001 ")
14、檢視資料完整性
2 db2 " select * from TestTable"
15、總結及展望
這
個教程花了我兩天的時間來整理和撰寫,但是還是感覺到對文章組織結構、邏輯推理方面還遠遠不夠,這篇教程的用意是為了讓自己更加深刻的理解DB2資料庫的
各種備份和恢復型別,也作為一個知識字典,下次忘記語句了,還可以過來查詢,希望自己更加的努力學習DB2資料庫,它的魅力實在太大了。