本文將介紹如何利用表空間的備份快速恢復(fù)IBM DB2數(shù)據(jù)庫,包括利用表空間備份重建數(shù)據(jù)庫和錯誤的數(shù)據(jù)庫恢復(fù)方法。
當我們的 DB2 數(shù)據(jù)庫由于一些嚴重錯誤 ( 如存儲損壞等 ) 而導(dǎo)致數(shù)據(jù)庫庫損壞時,我們通常需要在修復(fù)相關(guān)錯誤后,通過 Restore 命令來進行數(shù)據(jù)庫的恢復(fù) (DB2 目前也支持通過 HADR 等多機容錯機制實現(xiàn)系統(tǒng)高可用,本文僅對單機數(shù)據(jù)庫損壞,需要進行數(shù)據(jù)庫恢復(fù)的情況進行探討 )。一般的做法是通過以前的數(shù)據(jù)庫全備份來進行整庫恢復(fù),然后通過日志對數(shù)據(jù)庫進行前滾 (RollForward),從而使數(shù)據(jù)庫恢復(fù)到接近災(zāi)難點的時間。但當我們數(shù)據(jù)庫的數(shù)據(jù)量較大時,數(shù)據(jù)庫的全備份和整庫恢復(fù)都會很是非常消耗時間的。
場景1:利用表空間備份來重建整個 DB2 數(shù)據(jù)庫
在進行數(shù)據(jù)庫重建時,DB2 V9 現(xiàn)在能夠支持通過表空間一級的備份來重建整個數(shù)據(jù)庫,而不需要整個數(shù)據(jù)庫的全備份。DB2 的此項能力使得我們對核心系統(tǒng)的重要數(shù)據(jù)進行快速備份和恢復(fù)成為可能。讓我們首先看以下的一個例子:
假設(shè)我們有一個數(shù)據(jù)庫 TEST,該數(shù)據(jù)庫采用歸檔日志。某天,系統(tǒng)突然掉電,導(dǎo)致數(shù)據(jù)庫存放的磁盤損壞了。這時,數(shù)據(jù)庫將處于不可用的狀態(tài),作為 DBA,我們需要迅速對數(shù)據(jù)庫進行恢復(fù)。假如該數(shù)據(jù)庫有以下的表空間
◆SYSCATSPACE ( 系統(tǒng)表空間 )
◆USERSPACE1 ( 用戶數(shù)據(jù)表空間 1)
◆USERSPACE2 ( 用戶數(shù)據(jù)表空間 2)
◆USERSPACE3 ( 用戶數(shù)據(jù)表空間 3)
你手頭可用于進行數(shù)據(jù)庫恢復(fù)的數(shù)據(jù)包括 :
所有數(shù)據(jù)庫日志文件由于日志被存放在另外的磁盤上 ( 而且很多時,我們還會對日志進行鏡像,因為它們實在太重要了 ),因此它們沒有損壞。
你沒有數(shù)據(jù)庫的全備份,但是你有以下的表空間備份:
◆TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 - SYSCATSPACE 和 USERSPACE 1 表空間在 2006051513504 7 時間點的備份;
◆TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 - USERSPACE 2 和 USERSPACE 3 表空間在 2006051613513 6 時間點的備份;
◆TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 - USERSPACE 3 表空間在 2006051713520 8 時間點的備份。
對于傳統(tǒng)的 Restore 和 Rollforward 的 DB2 恢復(fù)策略,我們需要一個數(shù)據(jù)庫的全備份影像來進行數(shù)據(jù)庫恢復(fù)然后利用日志來進行數(shù)據(jù)庫的前滾 (Rollforward) 操作,但不幸的是,在本例中,我們并沒有數(shù)據(jù)庫的全備份,而只有不同時間做的表空間備份。
錯誤的數(shù)據(jù)庫恢復(fù)方法
如果我們試圖直接用表空間備份來恢復(fù)整個數(shù)據(jù)庫,我們會得到以下的錯誤提示:
清單1 :直接用表空間備份來恢復(fù)整個數(shù)據(jù)庫的錯誤提示
db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database
for a restore from a table space level backup.
上述命令支持完整數(shù)據(jù)庫備份的數(shù)據(jù)庫恢復(fù),不支持表空間級別的數(shù)據(jù)庫恢復(fù)。
利用表空間備份恢復(fù)數(shù)據(jù)庫
在 DB2 V9 中,提供了一個新的功能,就是通過表空間備份和日志來快速重建整個 DB2 數(shù)據(jù)庫,這個功能是通過在 RESTORE DATABASE 命令中加入 REBUILD 選項來實現(xiàn)的。
以下的步驟幫助我們通過 REBUILD 選項來利用表空間備份恢復(fù) TEST 數(shù)據(jù)庫:
第一步,我們利用表空間備份執(zhí)行帶 REBUILD 選項的 RESTORE DATABASE 命令恢復(fù)數(shù)據(jù)庫。
清單2:通過 REBUILD 選項來利用表空間備份恢復(fù) TEST 數(shù)據(jù)庫
db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
這一步我們是從已有的幾個表空間備份影像中選取一個備份來進行數(shù)據(jù)庫恢復(fù)。一般,我們會選取最近備份的表空間影像,這個備份影像我們稱之為“目標影像”(Target Image),因為它包含了我們用于恢復(fù) TEST 數(shù)據(jù)庫所需的最新的表空間備份、數(shù)據(jù)庫配置參數(shù)、日志序列等重要信息。實際上,這個“目標影像”可以是任何一種備份 ( 全備份、表空間備份、增量備份、在線或離線的備份 )。在本例中,最近的一個備份影像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我們就選取它作為我們進行數(shù)據(jù)庫恢復(fù)的“目標影像”。
當我們執(zhí)行完上述 RESTORE 命令之后,TEST 數(shù)據(jù)庫的結(jié)構(gòu)將被重建和恢復(fù)。我們可以得到數(shù)據(jù)庫的參數(shù)和其備份歷史之類的信息。如果我們發(fā)出 LIST HISTORY 命令 ( 如:LIST HISTORY ALL FOR TEST),我們將得到以下的輸出(參照清單 3) 。
清單3 :使用 LIST HISTORY查詢數(shù)據(jù)庫備份歷史信息
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
– — —————— —- — ———— ———— ————–
R D 20060519121107001 F 20060517135208
—————————————————————————
Contains 1 tablespace(s):
00001 USERSPACE3
—————————————————————————
Comment: RESTORE TEST WITH RF
Start Time: 20060519121107
End Time: 20060519121108
Status: A
—————————————————————————
EID: 7 Location:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
– — —————— —- — ———— ———— ————–
R P 20060519121108001 F 20060515135047
—————————————————————————
Contains 2 tablespace(s):
00001 USERSPACE1
00002 SYSCATSPACE
—————————————————————————
Comment: RESTORE TEST WITH RF
Start Time: 20060519121108
End Time: 20060519121113
Status: A
—————————————————————————
EID: 8 Location:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
– — —————— —- — ———— ———— ————–
R P 20060519121113001 F 20060516135136
—————————————————————————
Contains 1 tablespace(s):
00001 USERSPACE2
—————————————————————————
Comment: RESTORE TEST WITH RF
Start Time: 20060519121113
End Time: 20060519121114
Status: A
—————————————————————————
EID: 9 Location:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
– — —————— —- — ———— ———— ————–
R D 20060519121107 R S0000001.LOG S0000003.LOG 20060518135208
—————————————————————————
Contains 4 tablespace(s):
00001 USERSPACE3
00002 USERSPACE2
00003 USERSPACE1
00004 SYSCATSPACE
—————————————————————————
Comment: REBUILD TEST WITH RF
Start Time: 20060519121107
End Time: 20060519121115
Status: A
—————————————————————————
EID: 10 Location:
如上,LIST HISTORY 命令產(chǎn)生了 4 條輸出條目 (EID 7 – EID 10),它們都和我們數(shù)據(jù)庫的恢復(fù)有關(guān)。第一個條目,EID 7,包含了在 20060517135208 時間點做的備份影像,該備份影像中我們只對 USERSPACE3 做了備份。然而,回顧我們進行數(shù)據(jù)庫恢復(fù)時發(fā)出的命令,參照清單 4。
清單4:使用 ALL TABLESPACES 參數(shù)恢復(fù)數(shù)據(jù)庫
db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
我們使用了 ALL TABLESPACES 參數(shù)要求恢復(fù)所有的表空間,所以 DB2 會利用 LIST HISTORY 中所看到的其它備份影像來恢復(fù)數(shù)據(jù)庫其它的表空間 ( 注意,在使用 TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 備份影像進行恢復(fù)時 EID=9,雖然該影像包括 USERSPACE2 和 USERSPACE3 的備份,但 DB2 只恢復(fù)了 USERSPACE2,因為 USERSPACE3 已經(jīng)通過更新的備份影像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 完成恢復(fù)了 )。在完成上述恢復(fù)后,表空間將處于 ROLL-FORWARD 狀態(tài)。通過 LIST HISTORY 命令,我們可以看到表空間都被置成了 WITH RF 標志,表明這些表空間處于 ROLL-FORWARD 狀態(tài)。另外,為了使該恢復(fù)順利完成,所有備份影像都需要放在 HISTORY FILE 所表明的備份路徑下,否則 DB2 將會給出一個無法找到備份影像的錯誤提示。
第二步,通過 ROLLFORWARD DATABASE 命令及 TO END OF LOGS 選項來前滾數(shù)據(jù)庫 TEST,使其恢復(fù)到最近的一個同步時間點 (Point in Time)。
清單5 :前滾數(shù)據(jù)庫到最近的一個同步時間點
db2 rollforward db test to end of logs
當所有表空間恢復(fù)完畢,它們將處于 rollforward pending 的狀態(tài),我們需要通過數(shù)據(jù)庫日志和 rollforward 命令來對數(shù)據(jù)庫進行前滾操作,從而將數(shù)據(jù)庫置為正常 (Normal) 狀態(tài)。
為了順利完成前滾操作,從上述備份影像最早一個時間點到最近一個時間點之間的數(shù)據(jù)庫日志必須存在,以用于將上述通過不同時間點備份影像進行恢復(fù)的表空間前滾到同一時間點上。本例中,從 20060515135047 到 20060517135208 時間點的日志必須存在,我們才可以將表空間同步到同一個時間點。如果我們還想繼續(xù)前滾數(shù)據(jù)庫,則我們還需要從 20060517135208 時間點往后的日志文件。
在本例中,我們假設(shè)這些日志文件都能夠在 LOGPATH 數(shù)據(jù)庫配置參數(shù)所指定的目錄中找到,如果它們被移動了位置,則我們還需要在 ROLLFORWARD 命令中通過 OVERFLOW LOG PATH 選項來指定這些日志文件的新位置。
第三步,通過執(zhí)行 ROLLFORWARD DATABASE 命令來結(jié)束數(shù)據(jù)庫前滾的狀態(tài)。
清單6:結(jié)束數(shù)據(jù)庫前滾的命令
db2 rollforward db test stop
該命令執(zhí)行完畢后,TEST 數(shù)據(jù)庫就恢復(fù)到 NORMAL 狀態(tài),這樣您就可以正常使用它了。
場景2:通過表空間備份快速重建數(shù)據(jù)庫,恢復(fù)重要數(shù)據(jù)
通過上面的例子,我們知道 DB2 V9 現(xiàn)在支持通過不同時間做的不同表空間的備份來重建和恢復(fù)整個數(shù)據(jù)庫,這個強大的新特性無疑給我們考慮備份 / 恢復(fù)策略時帶來了很多新的啟發(fā)。
下面我們將進一步對這個特性進行探討。讓再我們回到上一個例子,我們假設(shè) TEST 數(shù)據(jù)庫是一個重要的記錄在線交易的數(shù)據(jù)庫,其中,USERSPACE1 和 USERSPACE2 表空間存放了在線交易所需要的全部重要數(shù)據(jù),而 USERSPACE3 表空間存放的則是部分歷史數(shù)據(jù),主要用于歷史查詢,數(shù)據(jù)量較大,而其重要性相對較低。
恢復(fù)表空間 USERSPACE1 和 USERSPACE2 的數(shù)據(jù)
一旦我們的數(shù)據(jù)庫系統(tǒng)發(fā)生故障,如果我們需要恢復(fù)全部 3 個表空間,則由于 USERSPACE3 數(shù)據(jù)量較大,導(dǎo)致恢復(fù)速度緩慢。我們所希望的是,首先能夠快速恢復(fù) USERSPACE1 和 USERSPACE2 表空間的數(shù)據(jù),快速恢復(fù)在線交易;然后我們再在合適的時機,恢復(fù) USERSPACE3 表空間的歷史數(shù)據(jù)。下面,讓我們看看如何實現(xiàn)我們的想法。
第一步,通過發(fā)出 RESTORE DATABASE 命令和 REBUILD 選項,告訴 DB2 首先恢復(fù) USERSPACE1 和 USERSPACE2 表空間。
清單7 :恢復(fù)表空間 USERSPACE1 和 USERSPACE2 方法一
db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2)
taken at 20060516135136
盡管我們希望只恢復(fù) USERSPACE1 和 USERSPACE2 表空間,但 SYSCATSPACE 系統(tǒng)表空間是必須的,否則 DB2 無法正常工作。上述命令中指定的“目標影像”TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 包含了 USERSPACE2 和 USERSPACE3 表空間的備份。這是我們所有備份影像中最近的包含 USERSPACE2 和 USERSPACE3 表空間備份的影像。需要注意的是,盡管 20060517135208 才是時間最近的一個備份影像,但它不包括 USERSPACE1, USERSPACE2, 或 SYSCATSPACE 表空間備份,因此我們不會用它來進行恢復(fù)。
以下的命令可以達到同樣的效果。
清單8: 恢復(fù)表空間 USERSPACE1 和 USERSPACE2方法二
第二步,執(zhí)行 ROLLFORWARD DATABASE 命令和 TO END OF LOGS 選項來前滾數(shù)據(jù)庫到最近的一個同步時間點。
清單9:前滾數(shù)據(jù)庫
db2 rollforward db test to end of logs
第三步,發(fā)出 ROLLFORWARD DATABASE 命令和 STOP 選項來停止前滾 。
清單10:停止數(shù)據(jù)庫前滾
db2 rollforward db test stop
當然,你也可以選擇將數(shù)據(jù)庫前滾到某個時間點,而不是日志的末尾,但該時間點必須是你備份影像時間點之后的某個時間點。上述命令執(zhí)行完畢后,數(shù)據(jù)庫就可以正常使用,而且 USERSPACE1 和 USERSPACE2 也可以正常訪問了。USERSPACE3 仍然處于 RESTORE PENDING 狀態(tài),你可以選擇遲一點的某個時間來恢復(fù)它。
恢復(fù)表空間 USERSPACE3的數(shù)據(jù)
第一步,執(zhí)行 RESTORE DATABASE 命令來恢復(fù)表空間 USERSPACE3 的數(shù)據(jù)。
清單11 :恢復(fù)表空間USERSPACE3
db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
第二部,執(zhí)行 ROLLFORWARD DATABASE 和 TO END OF LOGS 選項來前滾 USERSPACE3 表空間。
清單12 :前滾表空間 USERSPACE3
db2 rollforward db test to end of logs tablespace (USERSPACE3)
第三步, 發(fā)出 ROLLFORWARD DATABASE 命令和 STOP 選項結(jié)束 USERSPACE3 的前滾。
清單13:結(jié)束表空間 USERSPACE3 的前滾
db2 rollforward db test stop
現(xiàn)在,TEST 數(shù)據(jù)庫的所有 4 個表空間都可以正常使用了。
通過上面的兩個例子,我們學(xué)習(xí)了如何通過部分或全部表空間級的備份來重建和恢復(fù)整個數(shù)據(jù)庫,或根據(jù)數(shù)據(jù)的重要性和優(yōu)先級來分步重建和恢復(fù)數(shù)據(jù)庫。
這個特性可以有效的減小我們數(shù)據(jù)備份的時間,我們可以按照不同頻率來有選擇的備份不同重要性的表空間,而不是整個數(shù)據(jù)庫。這個特性同樣可以縮短我們進行系統(tǒng)恢復(fù)的時間,我們可以根據(jù)數(shù)據(jù)的重要性,分步來恢復(fù)數(shù)據(jù)庫,而不需要一次恢復(fù)整個數(shù)據(jù)庫。最后,值得提醒的是,為了使用這個很好的特性,數(shù)據(jù)庫的日志和 SYSCATSPACE 系統(tǒng)表空間的備份仍然是至關(guān)重要不可缺少的。
【編輯推薦】
- DB2備份恢復(fù)數(shù)據(jù)庫步驟
- Oracle數(shù)據(jù)庫文件恢復(fù)與備份思路
- MySQL備份恢復(fù)數(shù)據(jù)的一般步