遷移背景與核心變化
DB2 8.x 將 XML 作為 CLOB/BLOB 或拆解到關係表存儲,應用層負責解析/序列化。DB2 9 引入 pureXML 原生存儲,消除解析開銷,提供 XQuery/SQL/XML 查詢、XML 索引、XML Schema 驗證。遷移可顯著提升性能、簡化代碼、增強數據完整性。
遷移評估清單
- 識別所有 XML 相關對象:表 (CLOB/BLOB/XML 列)、視圖、存儲過程、UDF、觸發器、索引、應用代碼 (JDBC/CLI/.NET/PHP)、ETL 腳本。
- 分析 XML 文檔特徵:大小分佈、結構複雜度、Schema 穩定性、訪問模式 (整文檔讀寫 vs 節點級查詢/更新)。
- 評估 Schema 驗證需求:是否需要強制 Schema,註冊 XML Schema 到 DB2 Schema Repository (XSR)。
數據遷移策略
方案 A:原地轉換 (適合中小表、停機窗口充足)
- ALTER TABLE 添加新 XML 列。
- UPDATE 表 SET xml_col = XMLPARSE(DOCUMENT clob_col) WHERE clob_col IS NOT NULL; (批量分批提交)。
- 驗證數據完整性,創建 XML 索引,切換應用指向新列,刪除舊列。
方案 B:新表載入 (適合大表、需零停機)
- 創建新表 (含 XML 列)、索引、約束。
- 使用 LOAD FROM CURSOR 或 EXPORT/IMPORT 配合 XMLPARSE 並行載入。
- 雙寫期:應用同時寫新舊表,或使用觸發器同步。
- 驗證後切換讀流量,最後下線舊表。
應用代碼改造要點
- 插入/更新:PreparedStatement.setSQLXML / setBinaryStream (XMLPARSE 隱式) 替換 setClob/setString。
- 查詢:將應用層 DOM/SAX/XPath 解析改為 XMLQUERY/XMLEXISTS/XMLTABLE 下推數據庫。
- 結果集處理:ResultSet.getSQLXML() 返回 java.sql.SQLXML,使用 StAX/DOM/SAX Source 讀取,避免 getString() 序列化開銷。
- 存儲過程:SQL PL 中使用 XML 類型參數、XMLQUERY、XMLMODIFY (9.7+),簡化邏輯。
- Schema 驗證:INSERT 時指定 XMLVALIDATE(? ACCORDING TO XMLSCHEMA ID ...) 或表級 XML 型約束。
性能驗證與調優
- 對比遷移前後關鍵查詢響應時間、CPU、I/O。
- 運行 RUNSTATS 收集 XML 列統計,分析 EXPLAIN 計劃確認 XML 索引使用。
- 調整緩衝池 (XML 數據佔用)、日誌空間 (XML 更新產生較大日誌)。
- 監控 XML 解析/序列化開銷 (MON_GET_XML_PARSE_SUMMARY)。
常見問題與解決
| 問題 | 原因 | 解決 |
| XMLPARSE 失敗 | 文檔不合格 (未閉合標籤、非法字符、編碼聲明缺失) | 預處理清洗、指定 XMLPARSE(DOCUMENT ... STRIP WHITESPACE)、檢查編碼一致性 |
| 查詢無索引使用 | 路徑表達式不匹配索引定義、統計信息缺失 | 對齊 XMLPATTERN、RUNSTATS、重寫查詢使用索引友好路徑 |
| 應用報 ClassCastException | 驅動版本不支持 SQLXML、JDBC 4.0+ 必需 | 升級 db2jcc4.jar、確保 JVM 1.6+ |
| 存儲過程編譯錯誤 | SQL PL 不支持舊版 XML 函數語法 | 參考 DB2 9 SQL PL 參考手冊調整語法 |
驗收標準與上線清單
- 功能測試 100% 通過 (含邊界、異常、Schema 驗證)。
- 性能基準達標 (核心查詢 ≤ 原 50% 響應時間)。
- 備份/恢復、HADR、複製驗證 XML 列完整性。
- 文檔更新:數據字典、API 文檔、運維手冊。
- 回滾方案就緒 (保留舊表/列 1 個月)。
總結
DB2 8.x 到 9 的 XML 遷移是從「應用層管理 XML」向「數據庫原生管理 XML」的架構升級。通過分階段評估、數據遷移、代碼重構、性能驗證,可平滑過渡並獲得顯著收益。