跨版本、跨平台 (AIX→Linux / Windows→Linux) 遷移 DB2 數據庫,核心挑戰在於DDL完整提取、大數據量高速傳輸、自增列語義保持、PHP應用適配。本文基於 DB2 v8.1 → v9.7 實戰,提供標準化工具鏈與腳本庫。
源端 (DB2 v8.1, AIX) 目標端 (DB2 v9.7+, Linux) ┌──────────────────┐ ┌──────────────────┐ │ DB2LOOK (v8.2+) │──DDL──→ │ 執行DDL創建對象 │ │ 遠程編目源庫 │ │ (自動存儲/32K) │ ├──────────────────┤ ├──────────────────┤ │ Shell腳本生成 │ │ │ │ EXPORT腳本 │──IXF──→ │ LOAD 載入數據 │ │ LOAD腳本 │ 文件 │ (並行/無提示) │ ├──────────────────┤ ├──────────────────┤ │ 自增列識別 │──參數──→ │ IDENTITYOVERRIDE │ │ 修改LOAD命令 │ │ 保持主鍵值不變 │ └──────────────────┘ └──────────────────┘
DB2 v8.1 自帶 db2look 不支援提取 Stored Procedure/Trigger/UDF/BufferPool 等對象。解決方案:從 v8.2+ 客戶端遠程編目源庫,再執行 db2look。
# 在 v9.7 客戶端機器執行
db2 "CATALOG TCPIP NODE SRC_NODE REMOTE SERVER "
db2 "CATALOG DATABASE SRCDB AS SRCDB AT NODE SRC_NODE"
db2 terminate
# 完整提取 (含 SP/Trigger/UDF/BP/Nodegroup 等)
db2look -d SRCDB -e -o srcdb_ddl.sql -a -i src_user -w src_pwd
# -e: 提取DDL, -o: 輸出文件, -a: 所有對象, -i/-w: 遠程認證
IN tablespace 修改為目標自動存儲或預建表空間名。NODEGROUP / PARTITIONING MAP (非DPF目標)。CODESET/TERRITORY 一致性。db2 -tvf srcdb_ddl.sql#!/bin/bash
# gen_export.sh - 生成所有用戶表的 EXPORT 命令
db2 -x "SELECT 'EXPORT TO ' || RTRIM(TABNAME) || '.ixf OF IXF SELECT * FROM ' || RTRIM(TABSCHEMA) || '.' || RTRIM(TABNAME) || ';'
FROM SYSCAT.TABLES
WHERE TABSCHEMA IN ('APP_SCHEMA','DB2INST1') AND TYPE='T'
ORDER BY TABSCHEMA, TABNAME" > srcdb_export.sql
# 編輯 srcdb_export.sql: 刪除頭尾統計信息,保留純 EXPORT 語句
# 執行導出 (源端)
db2 -tvf srcdb_export.sql
# 產生: TABLE1.ixf, TABLE2.ixf ... 文件
#!/bin/bash
# gen_load.sh - 生成 LOAD 命令,含自增列處理
db2 -x "SELECT 'LOAD FROM ' || RTRIM(TABNAME) || '.ixf OF IXF '
|| CASE WHEN COLCOUNT > 0 AND IDENTITY = 'Y' THEN 'MODIFIED BY IDENTITYOVERRIDE ' ELSE '' END
|| 'REPLACE INTO ' || RTRIM(TABSCHEMA) || '.' || RTRIM(TABNAME) || ' COPY NO WITHOUT PROMPTING;'
FROM SYSCAT.TABLES
WHERE TABSCHEMA IN ('APP_SCHEMA','DB2INST1') AND TYPE='T'
ORDER BY TABSCHEMA, TABNAME" > srcdb_load.sql
# 關鍵: IDENTITYOVERRIDE 保持源端自增主鍵值不變
# 執行載入 (目標端)
db2 -tvf srcdb_load.sql
| 模式 | 適用場景 | LOAD參數 | 行為 |
|---|---|---|---|
| IDENTITYOVERRIDE | 遷移/同步,需保持主鍵值完全一致 | MODIFIED BY IDENTITYOVERRIDE |
使用數據文件中的自增值,忽略目標自增計數器 |
| IDENTITYIGNORE | 重新生成主鍵,源值不重要 | MODIFIED BY IDENTITYIGNORE |
忽略文件中自增值,目標自動生成新值 |
| IDENTITYMISSING | 源文件無自增列 (如手工構建IXF) | MODIFIED BY IDENTITYMISSING |
目標自動生成自增值 |
COUNT(*)、SUM(pk)、MIN/MAX(date_col) 雙端一致。db2 "CALL SYSPROC.ADMIN_CMD('RUNSTATS ON TABLE ... AND INDEXES ALL')"ibm_db2 (PECL) 或 PDO_IBM / PDO_ODBCibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=mydb;HOSTNAME=linux-db2;PORT=50000;PROTOCOL=TCPIP;UID=phpuser;PWD=****ini_set('ibm_db2.i5_dbcs_alloc', '1') 或連接屬性 SQL_ATTR_INFO_ACCTSTR 設置 UTF-8。LIMIT/OFFSET → FETCH FIRST n ROWS ONLY、SYSDATE → CURRENT TIMESTAMP、NVL → COALESCE、日期運算函數。stages:
- extract_ddl
- generate_scripts
- export_data
- transfer_files # rsync/scp 並行傳輸 IXF
- load_data
- validate
- app_smoke_test
# 每階段腳本調用上述 .sh / .sql,制品庫存儲 IXF 文件 (大文件用 LFS/MinIO)
DB2跨平台遷移,**DDL提取用高版本 db2look、數據傳輸用 IXF+LOAD、自增列用 IDENTITYOVERRIDE、應用適配驗證 SQL 方言**。將上述腳本庫納入版本控制,配合 CI/CD 流水線,實現「可重複、可審計、可回滾」的企業級遷移標準。