DB2 表建立後無法直接 ALTER 頁面大小。若需將表從 4K 遷移至 8K/16K/32K 頁面大小 (如行寬超過 4K、大量 LOB、資料倉庫掃描優化),可採用線上建新表 → 資料複製 → 切換策略,實現僅在極短暫瞬間 (DROP/RENAME) 不可用,其餘時間全線上服務。
# 若不存在所需頁面大小的緩衝池/表空間,先建立
db2 "CREATE BUFFERPOOL BP16K SIZE 50000 PAGESIZE 16K"
db2stop force && db2start # 緩衝池需重啟生效
db2 "CREATE REGULAR TABLESPACE TS_16K PAGESIZE 16K
MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP16K"
db2look -d MYDB -e -t MYTABLE -o mytable.ddl -i db2inst1 -w password
# -t: 指定表名 | -e: 匯出 DDL | -o: 輸出檔
編輯 mytable.ddl:
MYTABLE_NEWIN TS_16K 子句CREATE TABLE "SCHEMA"."MYTABLE_NEW" (
"COL1" INTEGER NOT NULL,
"COL2" VARCHAR(200),
...
) IN TS_16K
ORGANIZE BY ROW;
執行建表:
db2 -tvf mytable.ddl
db2 "INSERT INTO MYTABLE_NEW SELECT * FROM MYTABLE"
# 大表建議分批:
# db2 "INSERT INTO MYTABLE_NEW SELECT * FROM MYTABLE WHERE PK BETWEEN 1 AND 100000"
# 並行多會話分段複製加速
此步驟原表完全可讀寫,新表僅對遷移會話可見。
db2 "DROP TABLE MYTABLE"
# 此瞬間應用無法存取 MYTABLE
db2 "RENAME TABLE MYTABLE_NEW TO MYTABLE"
# 瞬間完成,應用恢復存取
# 確認頁面大小
db2 "SELECT TBSP_NAME, PAGESIZE FROM SYSCAT.TABLES T
JOIN SYSCAT.TABLESPACES S ON T.TBSPACEID = S.TBSPACEID
WHERE TABNAME = 'MYTABLE'"
# 應顯示 16384 (16K)
若原表有檢視、觸發器、外鍵、MQT 等相依物件:
db2look -d MYDB -e -t MYTABLE -x 產生含相依物件的 DDL (-x 選項)DROP 所有相依物件 (順序:MQT → 檢視 → 觸發器 → 外鍵 → 索引)RUNSTATS ON TABLE SCHEMA.MYTABLE AND INDEXES ALL| 技巧 | 說明 | ||
|---|---|---|---|
| 分批 INSERT | 按主鍵範圍分段,每批 COMMIT,避免長交易鎖定日誌 | ||
| 並行複製 | 多會話並行不同分區範圍,利用 CPU 核心 | ||
| LOAD FROM CURSOR | DECLARE C1 CURSOR FOR SELECT * FROM MYTABLE; LOAD FROM C1 OF CURSOR INSERT INTO MYTABLE_NEW 比 INSERT 快 3-5 倍 | ||
| INCLUDE LONGLOBS | 含 LOB 欄位時加選項避免 LOB 另存檔案 | ||
| NOT LOGGED INITIALLY | 建新表時加 NOT LOGGED INITIALLY 減少初始載入日誌 (需謹慎,失敗不可回滾) |
| 方案 | 停機時間 | 複雜度 | 適用場景 |
|---|---|---|---|
| 本文線上遷移 | 秒級 (DROP/RENAME) | 中 | 無相依或可重建相依、大表 |
| ADMIN_MOVE_TABLE | 秒級 (切換階段) | 低 (單一存儲過程) | DB2 9.7+、支援相依自動處理 |
| REORG TABLE ... USE tablespace | 需離線或 INPLACE 長鎖定 | 低 | 同頁面大小表空間移動 |
| EXPORT/DROP/CREATE/IMPORT | 全程離線 | 低 | 小表、維護窗口充足 |