在RDS PostgreSQL中進行某些資料定義語言 (Data Definition Language)(DDL)操作時,例如將INT類型變更為BIGINT,原生的ALTER COLUMN TYPE操作會因二進位不相容而重寫整個表,期間會長時間鎖定表,中斷業務讀寫。為瞭解決這一問題,RDS PostgreSQL提供了rds_online_ddl外掛程式,該外掛程式支援線上修改列類型,從而在不影響商務持續性的前提下完成表結構變更。
功能簡介
雖然PostgreSQL的許多DDL操作(如CREATE INDEX CONCURRENTLY)已支援並發執行,但對於二進位不相容的列類型修改,仍需要進行鎖表重寫,這是資料庫營運中一個常見且影響較大的情境。
rds_online_ddl外掛程式通過建立暫存資料表並以線上方式同步資料,從而避免長時間阻塞。整個過程大致如下:
建立暫存資料表:建立與原表結構相同的暫存資料表。
修改結構:在暫存資料表上執行您指定的
ALTER COLUMN TYPE操作。同步存量資料:將原表的存量資料高效地匯入到暫存資料表中。
構建索引:在暫存資料表上建立與原表一致的所有索引。
同步增量資料:通過邏輯解碼將上述操作期間產生的增量資料同步至暫存資料表,確保資料最終一致。
修改原表結構:擷取原表的最進階鎖,並對原表結構進行修改。
分頁檔:交換原表與暫存資料表(包括索引)的底層檔案。
提交事務:刪除暫存資料表並提交事務,完成整個線上DDL過程。
前提條件
目標RDS PostgreSQL執行個體滿足以下條件:
注意事項
驗證及備份:在生產環境使用前,強烈建議您在測試環境中進行充分驗證,並確保已具備有效備份。
儲存空間:在執行期間需額外預留儲存空間,其大小約為原表及其索引總和的兩倍。請確保執行個體具備足夠的可用空間。
表限制:
該功能不支援包含外鍵約束的表。
該功能僅支援常規表(Regular Table),不支援分區表(Partitioned Table)。
ALTER TABLE的USING子句因邏輯複製限制可能無法完全支援,使用時請進行測試。整個操作過程是原子性的。如果中途失敗或被中斷,表結構將復原至原始狀態,不會造成資料損毀。
計費說明
此外掛程式免費。
建立和刪除外掛程式
請使用高許可權帳號執行如下命令。
建立外掛程式
CREATE EXTENSION rds_online_ddl;說明通過
SELECT * FROM pg_extension;可以查看已安裝的外掛程式。刪除外掛程式
DROP EXTENSION rds_online_ddl;
使用樣本
例如,將test表的id列從int4修改為int8。
執行以下命令,建立測試表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;調用rds_online_ddl.alter_table函數,執行線上DDL操作。該函數的第一個參數為目標表名,第二個參數為標準的
ALTER TABLE命令。SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8');(可選)查看進度。
對於資料量較大的表,操作可能需要較長時間。您可以通過查詢以下視圖來監控任務進度:
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:表示對應操作類型已解碼的增量資料數量。