首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 線上變更頁面大小實戰:零停機遷移表至新表空間

     編輯:DB2 教學

DB2 表建立後無法直接 ALTER 頁面大小。若需將表從 4K 遷移至 8K/16K/32K 頁面大小 (如行寬超過 4K、大量 LOB、資料倉庫掃描優化),可採用線上建新表 → 資料複製 → 切換策略,實現僅在極短暫瞬間 (DROP/RENAME) 不可用,其餘時間全線上服務。

適用場景與前提

  • 目標:變更表所在表空間頁面大小
  • 前提:表無相依物件 (檢視、觸發器、外鍵、MQT、索引延伸等),或可先移除後重建
  • 效果:資料僅在步驟 4-5 之間 (秒級) 不可存取

線上遷移 7 步驟流程

步驟 1:準備目標緩衝池與表空間

# 若不存在所需頁面大小的緩衝池/表空間,先建立
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"

步驟 2:用 db2look 取得原表 DDL

db2look -d MYDB -e -t MYTABLE -o mytable.ddl -i db2inst1 -w password
# -t: 指定表名 | -e: 匯出 DDL | -o: 輸出檔

步驟 3:修改 DDL 建立新表 (不同名、指定新表空間)

編輯 mytable.ddl:

  • 表名改為 MYTABLE_NEW
  • 加入 IN TS_16K 子句
  • 保留所有欄位、索引、約束定義
CREATE TABLE "SCHEMA"."MYTABLE_NEW" (
  "COL1" INTEGER NOT NULL,
  "COL2" VARCHAR(200),
  ...
) IN TS_16K
ORGANIZE BY ROW;

執行建表:

db2 -tvf mytable.ddl

步驟 4:資料複製 (線上、可並行)

db2 "INSERT INTO MYTABLE_NEW SELECT * FROM MYTABLE"
# 大表建議分批:
# db2 "INSERT INTO MYTABLE_NEW SELECT * FROM MYTABLE WHERE PK BETWEEN 1 AND 100000"
# 並行多會話分段複製加速

此步驟原表完全可讀寫,新表僅對遷移會話可見。

步驟 5:刪除原表 (極短暫鎖定)

db2 "DROP TABLE MYTABLE"
# 此瞬間應用無法存取 MYTABLE

步驟 6:重命名新表為原表名

db2 "RENAME TABLE MYTABLE_NEW TO MYTABLE"
# 瞬間完成,應用恢復存取

步驟 7:驗證與恢復應用存取

# 確認頁面大小
db2 "SELECT TBSP_NAME, PAGESIZE FROM SYSCAT.TABLES T 
      JOIN SYSCAT.TABLESPACES S ON T.TBSPACEID = S.TBSPACEID
      WHERE TABNAME = 'MYTABLE'"
# 應顯示 16384 (16K)

有相依物件時的擴充流程

若原表有檢視、觸發器、外鍵、MQT 等相依物件:

  1. db2look -d MYDB -e -t MYTABLE -x 產生含相依物件的 DDL (-x 選項)
  2. 執行前先 DROP 所有相依物件 (順序:MQT → 檢視 → 觸發器 → 外鍵 → 索引)
  3. 完成步驟 1-6 後,按反向順序重建相依物件 (索引 → 外鍵 → 觸發器 → 檢視 → MQT)
  4. 重建統計資訊:RUNSTATS ON TABLE SCHEMA.MYTABLE AND INDEXES ALL

大表優化技巧

替代方案對比

技巧說明
分批 INSERT按主鍵範圍分段,每批 COMMIT,避免長交易鎖定日誌
並行複製多會話並行不同分區範圍,利用 CPU 核心
LOAD FROM CURSORDECLARE 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 減少初始載入日誌 (需謹慎,失敗不可回滾)

ADMIN_MOVE_TABLE 簡化範例 (DB2 9.7+)

CALL SYSPROC.ADMIN_MOVE_TABLE(
  'SCHEMA', 'MYTABLE',      -- 原表
  'TS_16K', '', '',         -- 目標表空間、索引空間、LOB 空間
  '', '', '', '',           -- 其他選項
  'MOVE'                    -- 操作模式
);

優點:自動處理相依物件、索引、授權、統計資訊;缺點:某版本對分區表、MDC、列組織表支援有限。

驗證清單

  • [ ] 新表頁面大小符合預期 (PAGESIZE)
  • [ ] 筆數一致:SELECT COUNT(*) FROM MYTABLE
  • [ ] 索引有效:db2pd -tcbstats -db MYDB 檢查索引統計
  • [ ] 授權保留:SELECT * FROM SYSCAT.TABAUTH WHERE TABNAME='MYTABLE'
  • [ ] 應用連線測試通過
  • [ ] RUNSTATS 已執行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案停機時間複雜度適用場景
本文線上遷移秒級 (DROP/RENAME)中無相依或可重建相依、大表
ADMIN_MOVE_TABLE秒級 (切換階段)低 (單一存儲過程)DB2 9.7+、支援相依自動處理
REORG TABLE ... USE tablespace需離線或 INPLACE 長鎖定低同頁面大小表空間移動
EXPORT/DROP/CREATE/IMPORT全程離線低小表、維護窗口充足