全部產品
Search
文件中心

ApsaraDB RDS:Online DDL(rds_online_ddl)

更新時間:Sep 17, 2025

在RDS PostgreSQL中進行某些資料定義語言 (Data Definition Language)(DDL)操作時,例如將INT類型變更為BIGINT,原生的ALTER COLUMN TYPE操作會因二進位不相容而重寫整個表,期間會長時間鎖定表,中斷業務讀寫。為瞭解決這一問題,RDS PostgreSQL提供了rds_online_ddl外掛程式,該外掛程式支援線上修改列類型,從而在不影響商務持續性的前提下完成表結構變更。

功能簡介

雖然PostgreSQL的許多DDL操作(如CREATE INDEX CONCURRENTLY)已支援並發執行,但對於二進位不相容的列類型修改,仍需要進行鎖表重寫,這是資料庫營運中一個常見且影響較大的情境。

rds_online_ddl外掛程式通過建立暫存資料表並以線上方式同步資料,從而避免長時間阻塞。整個過程大致如下:

  1. 建立暫存資料表:建立與原表結構相同的暫存資料表。

  2. 修改結構:在暫存資料表上執行您指定的ALTER COLUMN TYPE操作。

  3. 同步存量資料:將原表的存量資料高效地匯入到暫存資料表中。

  4. 構建索引:在暫存資料表上建立與原表一致的所有索引。

  5. 同步增量資料:通過邏輯解碼將上述操作期間產生的增量資料同步至暫存資料表,確保資料最終一致。

  6. 修改原表結構:擷取原表的最進階鎖,並對原表結構進行修改。

  7. 分頁檔:交換原表與暫存資料表(包括索引)的底層檔案。

  8. 提交事務:刪除暫存資料表並提交事務,完成整個線上DDL過程。

前提條件

目標RDS PostgreSQL執行個體滿足以下條件:

  • 執行個體大版本:PostgreSQL 12或以上版本。

  • 核心小版本:20250830及以上版本。

  • 執行個體參數wal_level取值已設定為logical

  • 表結構:原表必須包含主鍵(PRIMARY KEY)或唯一約束(UNIQUE CONSTRAINT)。

  • 建立高許可權帳號

注意事項

  • 驗證及備份:在生產環境使用前,強烈建議您在測試環境中進行充分驗證,並確保已具備有效備份。

  • 儲存空間:在執行期間需額外預留儲存空間,其大小約為原表及其索引總和的兩倍。請確保執行個體具備足夠的可用空間。

  • 表限制

    • 該功能不支援包含外鍵約束的表。

    • 該功能僅支援常規表(Regular Table),不支援分區表(Partitioned Table)。

  • ALTER TABLEUSING子句因邏輯複製限制可能無法完全支援,使用時請進行測試。

  • 整個操作過程是原子性的。如果中途失敗或被中斷,表結構將復原至原始狀態,不會造成資料損毀。

計費說明

此外掛程式免費。

建立和刪除外掛程式

重要

請使用高許可權帳號執行如下命令。

  • 建立外掛程式

    CREATE EXTENSION rds_online_ddl;
    說明

    通過SELECT * FROM pg_extension;可以查看已安裝的外掛程式。

  • 刪除外掛程式

    DROP EXTENSION rds_online_ddl;

使用樣本

例如,將test表的id列從int4修改為int8。

  1. 執行以下命令,建立測試表test,並插入測試資料。

    CREATE TABLE test(id int4 PRIMARY KEY, info TEXT);
    
    INSERT INTO test SELECT x, repeat(x::text, 2) FROM generate_series(1, 1000000) AS x;
  2. 調用rds_online_ddl.alter_table函數,執行線上DDL操作。該函數的第一個參數為目標表名,第二個參數為標準的ALTER TABLE命令。

    SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8');
  3. (可選)查看進度。

    對於資料量較大的表,操作可能需要較長時間。您可以通過查詢以下視圖來監控任務進度:

    SELECT * FROM rds_online_ddl.pg_stat_progress_online_ddl;

    視圖中,關鍵字段說明:

    • insert_initial:表示已經匯入的存量資料行數。

    • nindexes_built:表示已完成構建的索引數量。

    • nindexes_total:表示索引總數。

    • insert_applied/update_applied/delete_applied:表示對應操作類型已應用的增量資料數量。

    • insert_decoded/update_decoded/delete_decoded:表示對應操作類型已解碼的增量資料數量。