接續上篇規劃,本文 (中篇) 聚焦遷移實施的核心技術環節:數據轉換腳本、並行載入優化、完整性驗證方法、應用代碼改造模式、性能基準測試與預演環境全流程演練。
-- 添加 XML 列
ALTER TABLE orders ADD COLUMN details_xml XML;
-- 分批轉換 (每批 10000 行,提交避免日誌爆發)
BEGIN
DECLARE v_start BIGINT DEFAULT 1;
DECLARE v_batch INT DEFAULT 10000;
WHILE v_start <= (SELECT COUNT(*) FROM orders WHERE details_xml IS NULL) DO
UPDATE orders
SET details_xml = XMLPARSE(DOCUMENT details_clob STRIP WHITESPACE)
WHERE id BETWEEN v_start AND v_start + v_batch - 1
AND details_clob IS NOT NULL
AND details_xml IS NULL;
COMMIT;
SET v_start = v_start + v_batch;
END WHILE;
END@
關鍵點:`STRIP WHITESPACE` 減小存儲、`PRESERVE WHITESPACE` 保留格式化需業務確認;異常捕獲 `SQLSTATE 2200M` (非合格 XML) 寫入異常表人工處理。
-- 1. 創建目標表 (含 XML 列、索引、約束)
CREATE TABLE orders_new (LIKE orders INCLUDING DEFAULTS INCLUDING IDENTITY)
IN USERSPACE1;
ALTER TABLE orders_new ADD COLUMN details_xml XML;
CREATE INDEX idx_orders_xml_cust ON orders_new(details_xml)
GENERATE KEY USING XMLPATTERN '/order/customer/@id' AS SQL VARCHAR(20);
-- 2. 聲明游標
DECLARE c1 CURSOR FOR
SELECT id, customer_id, order_date, total_amt,
XMLPARSE(DOCUMENT details_clob STRIP WHITESPACE) AS details_xml
FROM orders WHERE details_clob IS NOT NULL;
-- 3. 並行 LOAD (多個分區/節點)
LOAD FROM c1 OF CURSOR
MESSAGES /tmp/load_orders.msg
REPLACE INTO orders_new
NONRECOVERABLE -- 初始載入不記錄日誌,載入後 BACKUP
INDEXING MODE AUTOSELECT
STATISTICS YES PROFILE; -- 同步收集統計
優勢:繞過 SQL 引擎直接寫頁面、並行度可控、不產生海量日誌、自動建索引統計。
| 舊模式 (DB2 8.x) | 新模式 (DB2 9 pureXML) | 關鍵變更 | |
|---|---|---|---|
| PreparedStatement.setClob()/setString() 寫入 XML | setSQLXML() / setBinaryStream() 綁定 XML 類型 | 驅動需 JDBC 4.0+ (db2jcc4.jar),參數類型 DB2_XML | |
| ResultSet.getClob()/getString() 讀取 XML | getSQLXML() 返回 java.sql.SQLXML,getSource() 獲取 StAX/DOM/SAX | 避免全量字符串內存,流式處理大文檔 | |
| 應用層 XPath (DOM/XPath/XQuery 引擎) 查詢 | SQL/XML: XMLQUERY, XMLEXISTS, XMLTABLE 下推數據庫 | 利用 XML 索引、統計信息、並行執行 | |
| 應用層組裝 XML (StringBuilder/DOM) 返回前端 | SQL/XML 發布函數 (XMLELEMENT, XMLFOREST, XMLAGG, XMLSERIALIZE) 數據庫生成 | 減少網絡傳輸、集中邏輯、類型安全 | |
| 存儲過程中拼接 XML 字符串 | SQL PL 直接操作 XML 類型變量、XMLQUERY、XMLMODIFY (9.7+) | 類型安全、性能更高、可創建 XML 索引 |
| 指標 | 基準 (DB2 8.x) | 目標 (DB2 9) | 測試工具 |
|---|---|---|---|
| 核心查詢 P99 延遲 | 800 ms | ≤ 200 ms | JMeter / 自製負載腳本 |
| 吞吐量 (QPS) | 500 | ≥ 2000 | 同 |
| CPU 利用率 (查詢高峰) | 85% | ≤ 60% | db2top / vmstat |
| 存儲空間 (XML 數據) | 500 GB (CLOB) | ≤ 300 GB (壓縮後) | db2pd -tablespaces |
| 備份時間 | 4 h | ≤ 2 h (壓縮並行) | BACKUP 命令計時 |