1. 程式人生 > >DB2 備份 恢復 詳細測試

DB2 備份 恢復 詳細測試

本文測試環境:Windows  XP、IBM  DB2  Express V9.5、 DB2  Quest  Center  V9.5

在這裡舉個應用場景以說明資料庫恢復備份的思路:

那麼假設我們週一晚上做了一個數據庫的備份,週二中午12 點資料庫儲存介質出現了故障。如何能夠實現恢復呢 ? 那麼首先是把資料庫恢復到我們備份的那個時刻(週一晚上),但是備份之後和週二 12 點之間對資料庫已經做的交易(事物)怎麼辦呢?這就需要用到資料庫日誌,因為一旦交易提交,我們對資料庫做的 SQL insert update delete 等)都會記錄到資料庫日誌中。所以我們就用資料庫日誌(前提是資料庫日誌沒有受到損壞)把備份之後和資料庫崩潰之前的所有

SQL 操作重做( redo )一遍,。這就是資料庫備份恢復的原理。

1、DB2資料備份和恢復實驗準備工作

Step1:建立測試資料庫TestDB

1 CREATE DATABASE  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


1 CREATE  REGULAR TABLESPACE Data_SP
2
3 PAGESIZE 4K
4
5 MANAGED  BY DATABASE 6
7 USING( FILE
' E:/DB2_Train/TestDB/UserData/TestDB.UserData ' 2560 )
8
9 BUFFERPOOL IBMDEFAULTBP;


這裡設定了初始化為4K * 2560 = 10MB的表空間

結果:TableSpace裡面多了一個名為Data_SP表空間

 

Step3:建立測試表TestTable

1 CREATE TABLE  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下面插入測試資料

1 INSERT INTO  TestTable(Message) 
2 VALUES ( ' 測試表建立成功 ' )

--說明:建立測試表並插入資料是為了稍後驗證資料庫恢復的時候用的--

結果:


或者可以使用

1 db2stop force
2 db2start
3 db2 connect  to  TestDB
4 db2  select * from  TestTable




Step5:DB2資料庫離線備份和恢復實驗

說明:我將離線備份的檔案放在了以下路徑中:E:/DB2_Train/Offline

1、完全離線備份資料庫

 1 db2stop force     // 停止及啟動DB2例項
 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資料庫

1 db2  drop  db TestDB




3、根據資料庫完全備份恢復資料庫

1 // 利用離線完全備份恢復資料庫
2 db2  restore  db TestDB  from  "E:/DB2_Train/Offline" taken at  20090709152004





4、查詢表TestTable裡面內容,這一塊要重點關注,因為它涉及三種備份方式的區別

1 db2stop force
2 db2start
3
4 db2 connect  to  TestDB
5
6 db2  select * from  TestTable






Step6、DB2資料庫增量備份和恢復實驗

1、檢視資料庫配置檔案

1 // 查詢資料庫配置檔案裡的引數TRACKMOD的狀態,預設為OFF
2 db2 get db cfg  for  TestDB




2、修改資料庫配置引數TRACKMOD,使之資料庫進行增量備份

1 // 設定引數TRACKMOD為YES,使之資料庫可以進行增量備份
2 db2  update  db cfg  for  TestDB USING TRACKMOD YES




3、更改引數後,必須需要完全離線全備份資料庫

1 // 修改引數後需要全備份資料庫,離線,時間戳為20090709163256
2 db2  backup  db TestDB  to  "E:/DB2_Train/Online"




3、檢視TestTable表的內容



4、插入測試資料

這裡我要說明一下為什麼要在表這裡插入測試據?

狀態 TestTable表裡MESSAGE的值 備註
 全備份 測試表建立成功
插入資料

測試表建立成功

開始增量資料庫備份測試

增量備份

測試表建立成功

開始增量資料庫備份測試

還原全備份

測試表建立成功

還原增量備份

測試表建立成功

開始增量資料庫備份測試

1 -- 插入資料 開始增量資料庫備份測試-- 2 INSERT INTO  TestTable(Message)
3 VALUES ( ' 開始增量資料庫備份測試 ' )




5、開始增量備份(離線備份)

1 // 增量備份資料庫,離線,時間戳為20090709170956
2 db2  backup  db TestDB incremental  to  "E:/DB2_Train/Online"




6、模擬災難,強制刪除資料庫

1 // 強制刪除資料庫,模擬災難現場
2 db2  drop  db TestDB




7、恢復資料庫

首先還原至完全離線備份狀態,然後還原至增量離線備份狀態

7.1、還原至完全離線備份狀態

1 // 還原離線完全備份資料庫,離線,時間戳為20090709163256
2 db2  restore  db TestDB  from  "E:/DB2_Train/Online" taken at  20090709163256




這裡要注意還原完全備份後TestTable表裡Message的值,也是為什麼要加入測試資料的原因



7.2、還原至增量離線備份狀態

1 // -- 注意:下述語句中,有一個 automatic ,它表示無論有多少個增量備份,系統將全自動檢索恢復資料庫的順序並自動恢復資料庫。如果沒有 automatic ,則需要多次手動恢復資料庫,很麻煩而且容易出錯 2 db2  restore  db TestDB incremental automatic  from  "E:/DB2_Train/Online" taken at  20090709170956 3 // 然後提示想繼續嗎y  OR  n,然後點選y進行恢復
4







Step7、DB2聯機備份和恢復實驗

聯 機備份資料庫可以使資料庫在備份的同時仍然保持在可用狀態。要讓資料庫支援聯機備份,必須更改資料庫的日誌歸檔方式。在離線備份模式下,資料庫採用迴圈日 志方式記錄資料庫日誌,在聯機備份模式下,資料庫則採用歸檔日誌的方式備份資料庫日誌。另外,對於聯機備份的資料庫來說, 活動日誌和歸檔日誌就很重要了,一定要經常備份、儲存,像銀行多數使用的是歸檔日誌的方式,因為銀行的資料關乎到民生的生活,哪怕是突然間斷電了,資料庫崩潰了,但是每一筆的銀行交易都需要時時刻刻把交易記錄儲存下來,所以這裡的聯機備份模式就很適合這類的應用場景

1、實驗開始之前,最好先重新啟動資料庫例項,並且連線到需要做聯機備份的資料庫,此例資料庫為TestDB

1 db2stop force
2 db2start
3 db2 connect  to  TestDB


2、開始插入測試資料,此處為“開始聯機備份恢復的測試”

1 -- 開始聯機備份恢復測試-- 2 INSERT INTO  TestTable(Message)
3 VALUES ( ' 開始聯機備份恢復測試 ' )




3、修改資料庫配置檔案引數,以啟動聯機備份模式

1 // 查詢資料庫配置檔案
2 db2 get db cfg  for  TestDB


主要測試的引數為

引數名 修改前 修改後
TRACKMOD ON ON
MIRRORLOGPATH NULL E:/DB2_Train/Logs
LOGRETAIN OFF ON
USEREXIT OFF ON




 1 // 引數TRACKMOD設定為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)

1 // 執行聯機模式備份之前必須執行離線完全備份一次,否則資料庫處於備份暫掛的不可用狀態
2 db2  backup  db TestDB  to  "E:/DB2_Train/Online"






5、插入測試資料

1 -- 開始聯機備份恢復測試--開始增量備份-- 2 INSERT INTO  TestTable(Message)
3 VALUES ( ' 開始聯機備份恢復測試--開始增量備份 ' )




6、執行聯機線上增量備份,模擬應用線上(聯機增量備份,時間戳為20090710115930)

1 // 這裡不需要重新斷開應用程式連線,就可線上增量備份
2 db2  backup  db TestDB online incremental  to  "E:/DB2_Train/Online"






7、插入測試資料

這裡模擬發生了一個應用場景,假設我早上11點鐘做了離線完全備份,12點鐘做了線上增量備份,但是1點鐘突然間發生了不可預見的災難性事故,資料庫崩潰了,在12點鐘備份後到1點鐘這個時間段我做了一個插入資料“開始聯機備份恢復測試-資料庫日誌”

1 -- 開始聯機備份恢復測試-資料庫日誌-- 2 INSERT INTO  TestTable(Message)
3 VALUES ( ' 開始聯機備份恢復測試-資料庫日誌 ' )




這裡列出所有備份所對應的TestTable表裡Message欄位的值

名稱

ID

TestTable表裡Message欄位的值

離線完全備份

0  測試表建立成功
1  開始增量資料庫備份測試
2  開始聯機備份恢復測試

線上增量備份

0  測試表建立成功
1  開始增量資料庫備份測試
2  開始聯機備份恢復測試
3開始聯機備份恢復測試-開始增量備份

資料庫日誌

0  測試表建立成功
1  開始增量資料庫備份測試
2  開始聯機備份恢復測試
3  開始聯機備份恢復測試-開始增量備份
4  開始聯機備份恢復測試-資料庫日誌



8、儲存歸檔好資料庫日誌檔案

系統預設的資料庫日誌檔案存放位置,此路徑由引數MIRRORLOGPATH設定,這裡為E:/DB2_Train/Logs

1 // 一定要注意將資料庫日誌檔案複製一份放置到另一個路徑上,此處為E:/DB2_Train/Logs_Backup,並且把它歸檔好,歸檔的方法下面所述




說 明:Windows作業系統下的資料庫備份檔案是巢狀在一系列資料夾之下的特殊結構。上例中,D:/DB2_Train 是指備份目錄,TESTDB.0是指資料庫名稱為 TESTDB,DB2 是指例項名稱,NODE0000 是指節點名稱,CATN0000 是指編目名稱,20070801是指備份發生的年月日,形如YYYYMMDD,181241是指備份發生的時間,精確到秒,也就是指 18 點 12 分 41秒,形如HHMMSS,最後的 001 則是備份檔案的一個序列號。
 
9、本例資料庫日誌歸檔整理後的檔案組織結構

1 // 日誌檔案最好和資料庫備份檔案對應起來,這樣子到時候比較好查詢




10、模擬災難現場,強制刪除資料庫

1 // 刪除資料庫之前,最好先重啟一下DB2例項,以斷開應用程式和資料庫的連線
2 db2stop force
3 db2start
4 // 強制刪除資料庫
5 db2  drop  db TestDB


11、根據離線完全備份恢復資料庫

1 // 離線完全備份恢復資料庫
2 db2  restore  db TestDB  from  "E:/DB2_Train/Online" taken at  20090710113202




12、根據線上增量備份恢復資料庫

1 // 線上增量備份恢復資料庫,記得加上automatic,系統會自動尋找相關的增量備份檔案
2 db2  restore  db TestDB incremental automatic  from  "E:/DB2_Train/Online" taken at  20090710115930 3 // 然後根據系統提示,輸入y確認恢復




13、前滾恢復資料庫,並指定歸檔日誌位置

1 // 前滾恢復資料庫,最大程度的保留了資料
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、檢視資料完整性

1 // 查詢TestTable表的內容,檢查資料的完整性
2 db2 " select * from  TestTable"




15、總結及展望

這 個教程花了我兩天的時間來整理和撰寫,但是還是感覺到對文章組織結構、邏輯推理方面還遠遠不夠,這篇教程的用意是為了讓自己更加深刻的理解DB2資料庫的 各種備份和恢復型別,也作為一個知識字典,下次忘記語句了,還可以過來查詢,希望自己更加的努力學習DB2資料庫,它的魅力實在太大了。