我有一項 AWS Database Migration Service (AWS DMS) 任務,該任務會對 PostgreSQL 資料庫執行個體使用 Amazon Relational Database Service (Amazon RDS)。我的任務失敗,所有的複寫插槽皆在使用中,並且我會收到一則錯誤訊息。
簡短說明
若為 Amazon RDS for PostgreSQL 執行個體,AWS DMS 會使用原生複寫插槽來執行變更資料擷取 (CDC) 的邏輯複寫。
max_replication_slots 參數可控制 PostgreSQL 執行個體所擁有的複寫插槽數量。依預設,PostgreSQL 執行個體的 RDS 具有五個複寫插槽。如果超過複寫插槽數量的上限,則您會看到類似下列的日誌項目:
|
---|
訊息 |
[SOURCE_CAPTURE ]E: Failed (retcode -1) to execute statement [1022502] (ar_odbc_stmt.c:2579) |
[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 53400 NativeError: 1 則訊息: 錯誤:所有複寫插槽皆在使用中; |
若要解決這些錯誤,請移除已使用的複寫插槽,或增加 max_replication_slots 參數值。
解決方案
移除已使用的複寫插槽
已使用的複寫插槽會繼續佔用空間。如果您執行多個 AWS DMS 任務,或者擁有在相同的資料庫執行個體上執行的舊任務,請移除已使用的複寫插槽。
首先,識別複寫插槽的最大數量。然後,移除未使用的複寫插槽。
若要檢查複寫插槽數量上限,請執行下列查詢。若要識別未使用的複寫插槽,請檢閱「作用中」資料欄:
SELECT * FROM pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn
-----------------+---------------+-----------+--------+----------+--------+--------+--------------+-------------
old_and_used_slot | test_decoding | logical | 12052 | postgres | f | | 684 | 0/16A4408
**注意事項:**active: t (true) 表示插槽使用中,而 active: f (false) 則表示插槽不在使用中。
若要移除未使用的複寫插槽,請執行下列查詢:
SELECT pg_drop_replication_slot('old_and_used_slot');
**注意事項:**將 old_and_used_slot 取代為複寫插槽名稱。
移除未使用的複寫插槽後,重新啟動任務。
增加 max_replication_slots 參數的值
修改連接至 RDS 資料庫執行個體的自訂資料庫參數群組中的資料庫參數。然後,增加 max_replication_slots 參數的值。這是靜態參數,因此請務必在變更參數值後重新啟動資料庫執行個體。然後,重新啟動任務。
相關資訊
使用邏輯複寫啟用變更資料擷取 (CDC)
Amazon RDS for PostgreSQL
使用 PostgreSQL 資料庫作為 AWS DMS 來源
PostgreSQL 網站上的邏輯解碼範例