分區資料庫環境 (DPF) 下,備份/恢復/前滾操作的分散式協調是 DBA 必備技能。本文以 4 分區資料庫 SAMPLE (編目分區 0) 為例,詳細說明 db2_all 並行控制語法、聯機備份、跨分區恢復至新資料庫 SAMPNEW、歸檔日誌收集與 OVERFLOW LOG PATH 指定的完整實戰流程。
| 操作 | 作用範圍 | 執行位置 | 關鍵指令 |
|---|---|---|---|
| BACKUP | 單一分區 | 各分區 (可用 db2_all 並行) |
db2 backup db ... ONLINE |
| RESTORE | 單一分區 | 各分區 (可用 db2_all 並行) |
db2 restore db ... INTO ... |
| ROLLFORWARD | 全資料庫 (所有分區) | 僅編目分區 | db2 rollforward db ... TO END OF LOGS AND COMPLETE OVERFLOW LOG PATH (...) |
db2_all "db2 backup db sample online"
db2_all 並行控制語法:
<<+n< : 後續指令僅在分區 n 執行<<-n< : 後續指令在除分區 n 外所有分區執行||<<-n< 或 <<-n<; : 並行在除分區 n 外所有分區執行最佳實踐:先備份編目分區 (獨佔),再並行備份其餘分區
# 步驟 1: 編目分區 0 串行備份 (需獨佔鎖定)
db2_all "<<+0< db2 backup db sample online"
# 步驟 2: 其餘分區 (1,2,3) 並行備份
db2_all "||<<-0< db2 backup db sample online"
# 或等價寫法
db2_all "<<-0<; db2 backup db sample online"
產出:每個分區產生獨立備份映像檔,檔名含分區號、時間戳記。
場景:將 SAMPLE 聯機備份恢復為同實例下新資料庫 SAMPNEW,驗證備份可用性或建立測試環境。
WITHOUT PROMPTING 抑制覆蓋確認)db2_all "db2 restore db sample into sampnew without prompting"
陷阱:Linux 平台上,第 2 個分區恢復時會彈出 SQL2529W 覆蓋確認提示,導致 db2_all 中斷 (rc=4)。解決:所有分區指令均加上 WITHOUT PROMPTING。
# 編目分區 0 先行 (無需 WITHOUT PROMPTING,因首個分區無覆蓋提示)
db2_all "<<+0< db2 restore db sample into sampnew"
# 其餘分區並行恢復 (必加 WITHOUT PROMPTING)
db2_all "||<<-0< db2 restore db sample into sampnew without prompting"
# 或
db2_all "<<-0<; db2 restore db sample into sampnew without prompting"
恢復後狀態:因使用聯機備份映像,資料庫處於 前滾暫止 狀態,必須執行前滾操作才能上線。
OVERFLOW LOG PATH 實戰新資料庫 SAMPNEW 的日誌路徑不含源資料庫 SAMPLE 的歸檔日誌,必須手動收集並透過 OVERFLOW LOG PATH 指定替代路徑。
db2_all "db2 get db cfg for sample" | grep "Path to log files"
# 輸出範例:
# Path to log files = /home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/
# Path to log files = /home/db2inst1/db2inst1/NODE0001/SQL00001/SQLOGDIR/
# ...
假設將 4 個分區的歸檔日誌分別複製至 /sampnew/NODE000x/SQL00001/SQLOGDIR/ 目錄結構。
db2 "rollforward db sampnew to end of logs and complete overflow log path (
/sampnew/NODE0000/SQL00001/SQLOGDIR,
/sampnew/NODE0001/SQL00001/SQLOGDIR on dbpartitionnum 1,
/sampnew/NODE0002/SQL00001/SQLOGDIR on dbpartitionnum 2,
/sampnew/NODE0003/SQL00001/SQLOGDIR on dbpartitionnum 3
)"
on dbpartitionnum 0,否則報 SQL0104N 語法錯誤。TO END OF LOGS AND COMPLETE 表示前滾至日誌尾端並結束前滾暫止狀態,資料庫變為可用。TO 2024-01-15-10.30.00 AND COMPLETE。#!/bin/ksh
# 變數
SRC_DB=SAMPLE
TGT_DB=SAMPNEW
ARCH_ROOT=/sampnew
PARTITIONS="0 1 2 3"
CAT_PART=0
# 1. 備份
db2_all "<<+${CAT_PART}< db2 backup db ${SRC_DB} online"
db2_all "||<<-${CAT_PART}< db2 backup db ${SRC_DB} online"
# 2. 恢復
db2_all "<<+${CAT_PART}< db2 restore db ${SRC_DB} into ${TGT_DB}"
for p in ${PARTITIONS}; do
if [ $p -ne ${CAT_PART} ]; then
db2_all "<<+${p}< db2 restore db ${SRC_DB} into ${TGT_DB} without prompting" &
fi
done
wait
# 3. 收集歸檔日誌 (略,需依實際路徑 cp -r)
# 4. 前滾
OVERFLOW_PATHS="${ARCH_ROOT}/NODE0000/SQL00001/SQLOGDIR"
for p in 1 2 3; do
OVERFLOW_PATHS="${OVERFLOW_PATHS},${ARCH_ROOT}/NODE000${p}/SQL00001/SQLOGDIR on dbpartitionnum ${p}"
done
db2 "rollforward db ${TGT_DB} to end of logs and complete overflow log path (${OVERFLOW_PATHS})"
echo "Rollforward completed. Database ${TGT_DB} is now available."
總結:分區資料庫前滾恢復的關鍵在於 備份並行化 (db2_all 控制語法)、恢復抑制提示 (WITHOUT PROMPTING)、歸檔日誌集中化 (OVERFLOW LOG PATH)、編目分區單點前滾 四大要素。掌握此流程,即可支援 DPF 環境下的 PITR、異機恢復、測試環境快速刷新等核心運維場景。