DB2 提供三大數據移動命令 —— IMPORT (導入)、EXPORT (導出)、LOAD (裝入),構成異構遷移、備份歸檔、測試數據構建、數據湖入湖的基石。本文系統對比三者的執行機制、事務行為、性能特徵、適用邊界,並給出演進路線圖。
| 維度 | IMPORT | LOAD | EXPORT |
|---|---|---|---|
| 核心機制 | SQL INSERT/INSERT UPDATE/REPLACE 路徑,走引擎完整代碼路徑 | 繞過 SQL 層,直接格式化數據頁寫入容器,極少日誌 | SQL SELECT 查詢結果流式寫入文件 |
| 事務/日誌 | 全記錄日誌 (可配置 COMMITCOUNT 批次提交) | 最小日誌 (僅元數據/分配頁);NONRECOVERABLE 可零日誌 | 無日誌 (純讀操作) |
| 並行度 | 單線程 (可多進程分區並行) | 多線程並行 (CPU 核心數、容器數、ANYORDER) | 單線程 |
| 觸發器/約束 | 全觸發 (RI、Check、Trigger、Generated Column) | 默認不觸發 (可選 CHECK DATA 驗證 RI/Check) | 不涉及 |
| 索引維護 | 逐行實時維護 | 延遲索引構建 (BUILD DEFERRED) → 事後 REORG INDEXES ALL | 不涉及 |
| 可用性影響 | 行級鎖,業務可並發讀寫 (視隔離級別) | 表級排他鎖 (LOAD INSERT 共享鎖);ONLINE LOAD (9.7+) 降低鎖爭用 | 共享鎖,不阻塞業務 |
| 恢復能力 | 標準事務回滾 | LOAD COPY YES + 備份映像 → PITR;LOAD COPY NO → 表置 LOAD PENDING 需重載 | 不適用 |
| 典型速度 (同等硬件) | 基準 1x | 10x ~ 50x (TB 級小時級) | 最快 (純順序讀) |
| 適用數據量 | < 100 萬行 / 增量同步 | > 100 萬行 / 初始裝載 / 大批量刷新 | 任意量 (受限於磁盤/網絡) |
| 文件格式支援 | ASC, DEL, IXF, WSF (僅導入) | ASC, DEL, IXF, CURSOR (管道) | ASC, DEL, IXF, WSF |
# 導出全表至 DEL (CSV)
db2 "EXPORT TO /data/emp.del OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208
SELECT * FROM EMPLOYEE"
# 導出查詢結果至 IXF (含元數據,適合同構遷移)
db2 "EXPORT TO /data/emp.ixf OF IXF
SELECT EMPNO, FIRSTNME, LASTNAME, HIREDATE, SALARY
FROM EMPLOYEE WHERE DEPT='IT'"
關鍵點:EXPORT 幾乎不會失敗;IXF 格式攜帶列定義、索引定義、約束定義,IMPORT ... CREATE INTO 可一鍵重建表結構。
# 追加模式 (默認 INSERT)
db2 "IMPORT FROM /data/emp.del OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208
COMMITCOUNT 1000
INSERT INTO EMPLOYEE"
# 更新/合併模式 (需主鍵/唯一索引)
db2 "IMPORT FROM /data/emp_upd.del OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208
INSERT_UPDATE INTO EMPLOYEE"
# 替換模式 (截斷表再裝載)
db2 "IMPORT FROM /data/emp_full.del OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208
REPLACE INTO EMPLOYEE"
# 從 IXF 重建表結構並導入
db2 "IMPORT FROM /data/emp.ixf OF IXF
CREATE INTO NEW_EMPLOYEE"
COMMITCOUNT:每 N 行提交一次,避免日誌爆滿、鎖升級;建議 500~5000 視行寬度調整。
# 追加模式 (保留現有數據)
db2 "LOAD FROM /data/emp.del OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208 ANYORDER FASTPARSE
INSERT INTO EMPLOYEE
COPY YES USE TSM OPEN 2 SESSIONS
NONRECOVERABLE"
# 替換模式 (截斷表)
db2 "LOAD FROM /data/emp_full.del OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208 ANYORDER
REPLACE INTO EMPLOYEE
COPY YES USE TSM"
# 從游標管道直接裝入 (跨庫零落地)
db2 "DECLARE C1 CURSOR FOR SELECT * FROM SOURCE_DB.EMPLOYEE"
db2 "LOAD FROM C1 OF CURSOR
INSERT INTO TARGET_DB.EMPLOYEE
COPY YES USE TSM"
關鍵參數:
ANYORDER:允許並行插入不保證順序,性能提升 30%+。FASTPARSE:跳過數據驗證 (數值範圍、日期合法性),僅在極高信任度數據源使用。COPY YES/NO:YES 需配合 TSM/備份目錄生成拷貝映像,支持前滾恢復;NO 速度最快但表進入 LOAD PENDING,需 LOAD TERMINATE 或重載才能訪問。NONRECOVERABLE:跳過拷貝映像生成,極速但不可前滾恢復 (需自行備份)。IMPORT (安全、觸發器生效、易調試)。LOAD INSERT/REPLACE + COPY YES + ANYORDER。LOAD ... NONRECOVERABLE (最快,風險自擔)。LOAD FROM CURSOR (源端游標直接推送目標端,避免中間文件 I/O)。EXPORT ... OF DEL/IXF;IXF 保留完整 Schema,DEL 通用性最強。| 陷阱 | 癥狀 | 根因 | 對策 |
|---|---|---|---|
| LOAD 後表處於 LOAD PENDING | SELECT 報 SQL0668N | COPY NO 且未終止/重載 | 執行 LOAD TERMINATE 或 重新 LOAD COPY YES |
| IMPORT 極慢、日誌滿 | SQL0964C / 事務回滾 | 未設置 COMMITCOUNT / 批次過大 | COMMITCOUNT 1000-5000;增大 LOGFILSIZ/LOGPRIMARY |
| IXF 導入索引/約束缺失 | 目標表無主鍵/外鍵 | IMPORT 不自動建立索引/約束 (除 CREATE INTO) | 導出前 db2look -e -t TABLE 導出 DDL 獨立執行 |
| DEL 文件中文亂碼 | 導入後字符損壞 | CODEPAGE 未指定或不匹配 | 顯式 CODEPAGE=1208 (UTF-8) 或 1386 (GBK) |
| FASTPARSE 導入髒數據 | 數值溢出、日期無效卻未報錯 | 驗證被跳過 | 僅用於可信源;生產嚴禁 |
#!/bin/bash
# 每日增量同步模板: EXPORT (源) -> 壓縮傳輸 -> IMPORT (目標)
SRC_DB=SRCDB; TGT_DB=TGTDB; TABLE=EMPLOYEE; DATE_COL=LAST_UPDATED
TS=$(date -d "1 day ago" +%Y-%m-%d)
EXP_FILE="/tmp/${TABLE}_${TS}.del.gz"
# 1. 源端導出 (增量)
db2 connect to $SRC_DB
db2 "EXPORT TO ${EXP_FILE%.gz} OF DEL MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208
SELECT * FROM $TABLE WHERE DATE($DATE_COL) = '$TS'"
gzip ${EXP_FILE%.gz}
# 2. 傳輸 (scp/rsync/s3)
scp $EXP_FILE target_host:/data/incoming/
# 3. 目標端導入
ssh target_host "
db2 connect to $TGT_DB
gunzip -c $EXP_FILE | db2 \"IMPORT FROM /dev/stdin OF DEL
MODIFIED BY CHARDEL\" COLDEL, CODEPAGE=1208 COMMITCOUNT 2000
INSERT_UPDATE INTO $TABLE\"
"
掌握三大命令的機制邊界與參數微調,即可構建從日常增量同步到 TB 級初始化裝載的全譜系數據移動能力,支撐遷移、歸檔、分析、雲上混合等多元業務場景。