為什麼使用 PostgreSQL 作為來源的 AWS DMS 任務會因所有複寫插槽皆在使用中而失敗?

1 分的閱讀內容
0

我有一項 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 網站上的邏輯解碼範例