腳本功能與適用場景
- 自動連線指定資料庫,列出所有用戶表。
- 逐表執行
EXPORT TO table.del OF DEL SELECT * FROM table。
- 備份檔按日期目錄歸檔(
~/backup/YYYYMMDD/)。
- 互動式確認,防止誤覆蓋當日備份。
- 輸出備份統計(表數量、耗時)。
適用平台:Linux/UNIX/AIX(Windows 需改用 PowerShell/批次檔)。
備份格式:DEL(分隔符文本),適合跨平台遷移、外部工具導入。
完整腳本 backup_all_tables.sh
#!/bin/ksh
# ==========================================
# DB2 全庫表資料備份腳本
# 作者: fubs | 日期: $(date +%Y-%m-%d)
# ==========================================
# --- 設定區 ---
DB_NAME="abbs" # 目標資料庫
BK_ROOT="$HOME/personal/fubs/bak" # 備份根目錄
# ----------------
clear
# 1. 連線資料庫(靜默模式)
db2 connect to "$DB_NAME" >/dev/null
if [ $? -ne 0 ]; then
echo "ERROR: 無法連線資料庫 $DB_NAME"
exit 1
fi
# 2. 獲取用戶表清單(排除系統表、標題行)
TB_LIST=$(db2 "list tables" | grep -v "Record" | awk 'NR>3 && length($1)>0 {print $1}')
# 3. 日期變數
S_DATE=$(date '+%Y-%m-%d,%H:%M:%S')
V_DATE=$(date '+%Y%m%d')
BK_PATH="$BK_ROOT/$V_DATE"
# 4. 目錄存在性檢查與互動確認
if [ ! -d "$BK_PATH" ]; then
mkdir -p "$BK_PATH"
echo "備份所有資料,確認嗎?(y/n)\c"
else
echo "當天已備份,是否覆蓋?(y/n)\c"
fi
read YN
if [ -z "$YN" -o "$YN" != "y" ]; then
echo "放棄操作!"
db2 connect reset >/dev/null
db2 terminate >/dev/null
exit 0
fi
# 5. 進入備份目錄執行逐表 EXPORT
cd "$BK_PATH"
NUM=0
for TAB in $TB_LIST; do
echo "正在備份 $TAB ..."
db2 "EXPORT TO ${TAB}.del OF DEL SELECT * FROM $TAB"
if [ $? -eq 0 ]; then
NUM=$((NUM + 1))
else
echo "WARN: $TAB 備份失敗,跳過"
fi
done
# 6. 清理連線並輸出結果
db2 connect reset >/dev/null
db2 terminate >/dev/null
echo "備份資料成功,共備份[$NUM]個庫表!"
echo "備份目錄: $BK_PATH"
echo "開始時間: $S_DATE"
echo "結束時間: $(date '+%Y-%m-%d,%H:%M:%S')"
關鍵技術點解析
| 環節 | 說明 |
| 列表獲取 | db2 "list tables" 輸出含標題/分隔行,用 awk 'NR>3' 跳過前 3 行,grep -v Record 過濾統計行。 |
| EXPORT 語法 | OF DEL 產生 CSV 風格分隔檔(預設逗號),LOB 欄位會另存檔(需 LOBSINFILE 修飾符)。 |
| 錯誤容忍 | 單表失敗不中斷整體流程,記錄 WARN 繼續下一張表。 |
| 權限需求 | 執行腳本的用戶需具備 SELECT 權限及目標目錄寫入權限。 |
進階增強建議
- 並行化:使用
xargs -P N 或 GNU Parallel 並發 EXPORT,利用多核心加速。
- 壓縮:管道接
gzip 即時壓縮 db2 "EXPORT TO ... | gzip > ${TAB}.del.gz"(需 DB2 支援管道導出)。
- Schema 區分:
db2 "list tables for schema PROD" 限定 Schema,避免誤導出 SYS 表。
- 日誌記錄:重導向標準輸出/錯誤至
backup_${V_DATE}.log 供稽核。
- 恢復驗證:定期抽樣
IMPORT FROM ... INSERT INTO ... 驗證備份可用性。
對應恢復命令範例
# 單表恢復(清空後導入)
db2 "IMPORT FROM /backup/20240520/EMPLOYEE.del OF DEL REPLACE INTO EMPLOYEE"
# 多表批次恢復腳本同理迴圈處理