Oracle 無 ALTER TABLE ... PARTITION 直接轉換命令,必須通過重建實現。本文深度對比三大主流方案 — CTAS 重建、Exchange Partition、線上重定義 — 的操作流程、優缺點、適用邊界與實戰選型決策樹,助 DBA 根據業務約束做出最優決策。
-- 1. 建立分區表 (CTAS 直接載入數據並分區)
CREATE TABLE t_new (id, time)
PARTITION BY RANGE (time) (
PARTITION p1 VALUES LESS THAN (TO_DATE('2024-07-01','YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD')),
PARTITION p3 VALUES LESS THAN (TO_DATE('2025-07-01','YYYY-MM-DD')),
PARTITION p4 VALUES LESS THAN (MAXVALUE)
) AS SELECT id, time FROM t;
-- 2. 重命名切換 (需獨占鎖,業務報錯)
RENAME t TO t_old;
RENAME t_new TO t;
| 優點 | 缺點/風險 |
|---|---|
| • DDL 操作,極少 UNDO/REDO,速度最快 • 數據載入即完成分區分布,無額外遷移 • 語法簡單,易腳本化 | • 需停機:RENAME 間隙業務全報錯 (ORA-00942) • 一致性風險:CTAS 與 RENAME 間的 DML 變更丟失,無鎖機制保護 • 大表 CTAS 耗時長,維護窗口壓力大 • 索引/約束/權限/觸發器需手動重建 |
-- 1. 建立分區表 (空表,預建分區結構)
CREATE TABLE t_new (id NUMBER PRIMARY KEY, time DATE)
PARTITION BY RANGE (time) (
PARTITION p1 VALUES LESS THAN (TO_DATE('2025-07-01','YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (MAXVALUE)
);
-- 2. 交換分區:原表數據瞬間變為分區 p1 (僅字典更新,零數據移動)
ALTER TABLE t_new EXCHANGE PARTITION p1 WITH TABLE t;
-- 3. 重命名切換
RENAME t TO t_old;
RENAME t_new TO t;
-- 4. (可選) 分區拆分:若需多個分區
ALTER TABLE t SPLIT PARTITION p2 AT (TO_DATE('2025-01-01','YYYY-MM-DD')) INTO (PARTITION p2, PARTITION p3);
| 優點 | 缺點/風險 |
|---|---|
| • 極快:Exchange 僅更新數據字典,無數據複製 • 交換後可檢查 t_old 是否有新數據,若有可 INSERT 回 t (補救一致性) • 適合「大表歸檔為單一歷史分區」場景 | • 仍需停機:RENAME 間隙業務報錯 • 單分區限制:一次僅能交換一個分區,多級分區需後續 SPLIT (產生 REDO/UNDO、鎖) • 索引/約束/權限需手動重建 • 數據分布僅在單分區,查詢剪枝效果有限 |
-- 1. 可行性檢查
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCHEMA', 'T', DBMS_REDEFINITION.CONS_USE_PK);
-- 2. 建立中間分區表 (目標結構)
CREATE TABLE t_new (id NUMBER PRIMARY KEY, time DATE)
PARTITION BY RANGE (time) (
PARTITION p1 VALUES LESS THAN (TO_DATE('2024-07-01','YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD')),
PARTITION p3 VALUES LESS THAN (TO_DATE('2025-07-01','YYYY-MM-DD')),
PARTITION p4 VALUES LESS THAN (MAXVALUE)
);
-- 3. 啟動重定義 (指定欄位映射)
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCHEMA', 'T', 'T_NEW', 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);
-- 4. 中間表建立索引/約束/觸發器/權限 (DISABLE 狀態)
-- 5. (可選) 同步增量 — 減少最終切換鎖時間
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCHEMA', 'T', 'T_NEW');
-- 6. 完成切換 (極短獨占鎖)
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCHEMA', 'T', 'T_NEW');
-- 7. 完成:原表變為分區表,中間表變為舊表備份
| 優點 | 缺點/風險 |
|---|---|
| • 零停機:全程原表可正常 DML,僅 FINISH 瞬間極短獨占鎖 • 完整功能:支援任意分區策略、索引/約束/觸發器/權限自動遷移、欄位增減、IOT 轉換 • 一致性保證:物化視圖日誌捕獲所有增量變更,零數據丟失 • 可回滾:ABORT 隨時終止,原表不受影響 | • 實現相對複雜 (需掌握套件參數、流程) • 需雙倍空間 (原表 + 中間表 + MLOG) • 有限制條件 (無主鍵不可用主鍵方式、不支援 LONG/BFILE/UDT/叢集表/MV 日誌/橫向子集等) • FINISH 瞬間仍需獨占鎖 (極大表未同步時可達秒級) |
| 決策維度 | CTAS 重建 | Exchange Partition | 線上重定義 |
|---|---|---|---|
| 停機容忍度 | 可停機 (分鐘級) | 可短暫停機 (秒級) | 零停機 |
| 資料量 | < 50GB | > 100GB (TB 級) | 任意 (空間允許) |
| 分區複雜度 | 單級範圍/列表 | 單分區歸檔 + 後續拆分 | 任意 (多級/引用/間隔/自動) |
| 一致性要求 | 可接受極小丟失風險 | 可接受極小丟失風險 (可補救) | 零容忍 |
| 索引/約束遷移 | 手動重建 | 手動重建 | 自動遷移 |
| 空間開銷 | 1.5x (新表 + 舊表) | 1.2x (新表 + 舊表) | 2x+ (原表 + 中間表 + MLOG) |
| 技術門檻 | 低 | 中 | 高 |
| 回滾能力 | RENAME 回滾 | RENAME 回滾 | ABORT 隨時回滾 |
NOT NULLLONG, BFILE, UDT 欄位沒有完美方案,只有最適合當前約束的方案。CTAS 重建 適合「能停機、求簡單、表不大」;Exchange Partition 適合「巨大表歸檔單分區、能接受後續拆分」;線上重定義 是「零停機、全功能、企業級標準」的終極答案。請根據「停機窗口、資料量、分區複雜度、一致性要求、團隊能力」五大維度,在決策樹上定位你的最優解。下次面對「普通表轉分區」需求,不再糾結,直接對號入座。