在企業級 DB2 環境中,因業務增長或架構調整,往往面臨「更換表空間類型」或「整庫遷移至新實例」的需求。本文基於實測環境(IBM x346、雙核 3.2GHz、4GB 內存、RAID 1、DB2 V8.2.4、Windows 2000 Advanced Server、DMS 表空間),整理出一套經驗證的標準化操作流程,實測載入速度可達 60–100 萬行/分鐘,供 DBA 團隊直接參考執行。
使用 db2cc 控制中心勾選源庫所有表 → 右鍵「生成 DDL」→ 保存為 schema.ddl。
建議同時導出:表、索引、外鍵、檢查約束、視圖、觸發器、序列、權限授予語句。
使用編輯器全局替換或手動修改:
• 表空間子句改為目標表空間(如 IN GATHER)
• 移除不再需要的分區鍵、壓縮屬性等
• 若目標庫 Schema 名不同,同步修改 CREATOR/SCHEMA 限定符
CREATE DATABASE TARGETDB AUTOMATIC STORAGE NO;
CONNECT TO TARGETDB;
CREATE LARGE TABLESPACE GATHER PAGESIZE 32 K
MANAGED BY DATABASE
USING (FILE '/db2data/GATHER_01' 2G, FILE '/db2data/GATHER_02' 2G)
EXTENTSIZE 32 PREFETCHSIZE 64 BUFFERPOOL IBMDEFAULTBP;
db2 -tvf schema.ddl -z ddl.log
執行後檢查日誌,確認無「SQL0601N 對象已存在」等阻斷性錯誤;非阻斷警告可後續處理。
為避免手工逐表編寫,提供兩段 Java 參考代碼,分別查詢 SYSIBM.SYSTABLES 生成批量命令文件。
public void createExportFile(Connection conn, String creator, String filePath) throws Exception {
String sql = "SELECT NAME FROM SYSIBM.SYSTABLES WHERE CREATOR = '" + creator + "' AND TYPE = 'T'";
List tables = new ArrayList<>();
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql)) {
while (rs.next()) tables.add(rs.getString(1));
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tables.size(); i++) {
sb.append("db2 \"EXPORT TO aa").append(i + 1).append(".ixf OF IXF SELECT * FROM ")
.append(tables.get(i)).append("\"\r\n");
}
Files.write(Paths.get(filePath), sb.toString().getBytes());
}
public void createLoadFile(Connection conn, String creator, String filePath) throws Exception {
String sql = "SELECT NAME FROM SYSIBM.SYSTABLES WHERE CREATOR = '" + creator + "' AND TYPE = 'T'";
List tables = new ArrayList<>();
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql)) {
while (rs.next()) tables.add(rs.getString(1));
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tables.size(); i++) {
sb.append("db2 \"LOAD FROM aa").append(i + 1).append(".ixf OF IXF REPLACE INTO ")
.append(tables.get(i)).append(" COPY NO WITHOUT PROMPTING\"\r\n");
}
Files.write(Paths.get(filePath), sb.toString().getBytes());
}
db2 connect to SRCDB user src_user using src_pwd
db2 -tvf export_all.sql -z export.log
db2 connect reset
生成的 aa1.ixf、aa2.ixf… 依序對應各表,IXF 格式自帶列定義,跨平台遷移最穩健。
db2 connect to TARGETDB user tgt_user using tgt_pwd
db2 -tvf load_all.sql -z load.log
db2 connect reset
關鍵參數說明:
• REPLACE:清空表後裝載(避免主鍵衝突)
• COPY NO:不做備份映像,適合初始裝載窗口
• WITHOUT PROMPTING:無人值守批量執行
| 指標 | 實測值 | 優化方向 |
|---|---|---|
| 單表導出速度 | 80–120 萬行/分 | 並行多會話導出不同表 |
| 單表 LOAD 速度 | 60–100 萬行/分 | 調大 UTIL_HEAP_SZ、使用多容器表空間、啟用 PARALLELISM |
| 端到端遷移 1 億行 | 約 2.5–4 小時 | 分批提交、預建索引後載入、載入後 RUNSTATS |
SET INTEGRITY IMMEDIATE CHECKED。IDENTITYOVERRIDE 或載入後 ALTER TABLE ALTER COL RESTART WITH …。LOB 大對象:若含 LOB,建議改用 CURSOR 方式 LOAD FROM CURSOR 避免中間文件膨脹。CODEPAGE 參數,必要時在 EXPORT 指定 MODIFIED BY CODEPAGE=1386。SELECT COUNT(*) FROM src.tab MINUS SELECT COUNT(*) FROM tgt.tabMD5 或 CHECKSUM 一致性RUNSTATS ON TABLE schema.tab AND INDEXES ALLSYSCAT.TABAUTH、COLAUTH 並補授本文提供的「DDL 先行 → IXF 中轉 → LOAD 批量」模式,兼顧了結構精確復刻與大數據吞吐效率,適合停機窗口較長的傳統遷移場景。若業務要求「近零停機」,請改用 DB2 HADR + 表空間滾動轉發 或 IBM InfoSphere CDC/Replication 異構同步方案。