數據庫作為企業核心數據載體,恢復能力至關重要。DB2 提供四種恢復方式:崩潰恢復(保護數據一致性)、高可用災難恢復 HADR(數據複製防災難丟失)、版本恢復(恢復備份介質,restore 命令)、前滾恢復(備份後發生新事務時,restore 後用 rollforward 修復)。本文聚焦 rollforward 實戰應用,基於 DB2 V9.7 實例演示。
僅支持 recoverable 狀態數據庫(歸檔日誌模式,logarchmeth1/2 非 OFF)。設置參數並離線備份使數據庫可用:
db2 "update db cfg for $db using logfilsiz 4 LOGARCHMETH1 disk:$archivePath"
db2 "backup db $db to $backupPath"
執行事務操作後,恢復數據庫(不指定 WITHOUT ROLLING FORWARD 參數),使數據庫進入 rollforward-pending 狀態:
db2 "restore db $db from $backdir without prompting"
Point-in-time 前滾在所有分區執行;END OF LOGS 指定 ON DATABASE PARTITION 參數時僅在指定分區運行,否則全部分區生效;end of backup 影響所有分區。
數據庫級:需 restore 進入 rollforward-pending,執行期間禁止其他連接。
表空間級:不只 restore 導致該狀態,斷電等也可觸發。可指定表空間,未指定則處理所有該狀態表空間。備份後重命名表空間需用新名稱。執行期間可選擇允許其他操作(ONLINE)。
注意:進行中的 rollforward 不可取消,僅可在完成後用 cancel 取消未 stop 的操作;已 stop 則不可 cancel。
大數據量場景下,表空間備份恢復更高效。備份三個表空間 tbs1/tbs2/tbs3,創建表插入數據後恢復三表空間,分別前滾 tbs1 到日誌末尾(ONLINE),tbs2/tbs3 到日誌末尾並 STOP(ONLINE),驗證查詢成功。
db2 "rollforward db test to end of logs tablespace(tbs1) online"
db2 "rollforward db test to end of logs and stop tablespace(tbs2, tbs3) online"
查詢已前滾日誌文件、下一所需歸檔日誌、最近提交事務時間戳:
db2 "rollforward db test query status"
執行 END OF LOGS 後 CANCEL,所有前滾回滾,數據庫進入 restore-pending,連接被拒。重新 restore 後進入 rollforward-pending,再次前滾恢復。
前滾到日誌最後(遍歷所有歸檔與活動日誌),完成恢復:
db2 "rollforward db test to end of logs and complete"
前滾過程中 Ctrl+C 中斷,再次執行 END OF LOGS AND STOP 會接著上次中斷點繼續至完成,數據庫連接恢復正常。
noretrieve 參數指示不取回歸檔日誌,若前滾需要歸檔日誌則因缺失而失敗:
db2 "rollforward db test to end of logs and stop noretrieve"
參數覆蓋先前設置的 overflowlogpath,執行過程可見新目錄下日誌文件生成:
db2 "rollforward db test to end of logs and complete overflow log path ($overflowPath2)"