IXF (Integrated Exchange Format) 是 DB2 原生的資料交換格式,包含資料結構與資料內容,適合同構環境遷移、備份還原。本文提供建立 UTF-8 資料庫、Shell 腳本批次匯出/匯入 IXF 的完整範例。
# 設定實例程式碼頁 (僅影響後續建立的資料庫)
$ db2set DB2CODEPAGE=1208
# 建立資料庫:UTF-8、中文地區、32K 頁面
$ db2 "CREATE DATABASE wms AUTOMATIC STORAGE YES USING CODESET UTF-8 TERRITORY CN PAGESIZE 32768"
# 若需指定資料庫目錄 (非自動儲存)
$ db2 "CREATE DATABASE xxdb ON /app/dbdata USING CODEPAGE 'GBK' COUNTRY 'ZH_CN'"
關鍵參數:
CODESET UTF-8 / CODEPAGE 1208:支援多國語言。TERRITORY CN:中文排序/日期格式。PAGESIZE 32768 (32K):支援較長列、提升大物件效能。#!/bin/bash
# exportReportData.sh - 批次匯出指定 Schema 下的多張表為 IXF
TO_DIR="/home/cpsinst/bup/"
SCHEMA="ODSUSER"
TABLES="UNTECK_ATTACHMENT_HIS UNTECK_BUSI_LOG UNTECK_DICT_ENTRY UNTECK_DICT_TYPE \
UNTECK_LOGIN_LOG UNTECK_MENU UNTECK_OPERATION UNTECK_ORGANIZATION \
UNTECK_PRIMARYKEY UNTECK_RESOURCE UNTECK_ROLE UNTECK_ROLE_RESOURCE \
UNTECK_USER UNTECK_USER_ROLE"
db2 connect to cpsdb
db2 "SET SCHEMA = '$SCHEMA'"
for TAB in $TABLES; do
echo "Exporting $TAB ..."
db2 "EXPORT TO ${TO_DIR}/${TAB}.IXF OF IXF SELECT * FROM ${TAB}"
if [ $? -ne 0 ]; then
echo "ERROR: Export $TAB failed!" >&2
exit 1
fi
done
db2 connect reset
echo "All tables exported successfully."
使用方式:
chmod +x exportReportData.sh
./exportReportData.sh 2>&1 | tee export.log
db2 connect to myetldb;
db2 SET SCHEMA=odsuser;
db2 "IMPORT FROM ETL_BUSI_TYPE.IXF OF IXF \
MODIFIED BY FORCECREATE COMMITCOUNT 10000 \
REPLACE_CREATE INTO ETL_BUSI_TYPE"
db2 "IMPORT FROM ETL_BUSI_TYPE_TOSEND.IXF OF IXF \
MODIFIED BY FORCECREATE COMMITCOUNT 10000 \
REPLACE_CREATE INTO ETL_BUSI_TYPE_TOSEND"
db2 "IMPORT FROM ETL_CONTACT_PEPOLE.IXF OF IXF \
MODIFIED BY FORCECREATE COMMITCOUNT 10000 \
REPLACE_CREATE INTO ETL_CONTACT_PEPOLE"
關鍵修飾詞說明:
FORCECREATE:目標表不存在時自動依 IXF 定義建立 (含索引、約束)。COMMITCOUNT 10000:每 10,000 列提交一次,避免交易日誌暴增並釋放鎖。REPLACE_CREATE:表存在則截斷資料並重建;不存在則建立。REPLACE:表存在則截斷資料 (保留表結構);不存在則報錯。INSERT:僅插入 (表必須存在),違反主鍵會報錯。| 問題 | 原因 | 解決 |
|---|---|---|
匯入報 SQL3110N (Utility is interrupted) | 磁碟空間不足 / 日誌滿 | 增加檔案系統空間、調大 LOGFILSIZ/LOGPRIMARY |
| 匯入極慢 | 未使用 COMMITCOUNT、索引過多 | 加 COMMITCOUNT、匯入前 DROP INDEX 完再 CREATE INDEX |
| 字元集亂碼 | 來源/目標資料庫 CODEPAGE 不同 | 確保兩端 DB2CODEPAGE 一致,或使用 MODIFIED BY CODEPAGE=1208 |
| IXF 檔案過大 | 大表匯出單一檔案 | 使用 db2move 並行匯出、或分區表並行處理 |
# 匯出 (指定 Schema、表清單)
$ db2move cpsdb EXPORT -sn ODSUSER -tn "TAB1,TAB2,TAB3"
# 匯入 (自動讀取當前目錄 *.ixf, *.msg)
$ db2move myetldb IMPORT -io REPLACE_CREATE
db2move 可多執行緒並行處理多張表,大幅縮短遷移窗口。
掌握 IXF 匯出/匯入與 db2move 並行工具,能滿足多數同構 DB2 環境的資料遷移、備份還原、測試資料製備需求。關鍵在於:統一 CODEPAGE、善用 COMMITCOUNT、大表並行處理。