PostgreSQL DB インスタンス用の Amazon Relational Database Service (Amazon RDS) を使用する AWS Database Migration Service (AWS DMS) タスクがあります。このタスクの実行に失敗したときに、すべてのレプリケーションスロットが使用中で、エラーメッセージが表示されます。
簡単な説明
Amazon RDS for PostgreSQL インスタンスでは、AWS DMS はネイティブレプリケーションスロットを使用して、変更データキャプチャ (CDC) のための論理レプリケーションを実行します。
PostgreSQLインスタンスにあるレプリケーションスロットの数は、max_replication_slots パラメータによって制御されています。RDS for PostgreSQL インスタンスにあるレプリケーションスロット数は、デフォルトでは 5 つです。レプリケーションスロット数が最大数を超えると、次のようなログエントリが表示されます。
|
---|
メッセージ |
[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 Message: ERROR: all replication slots are in use; |
これらのエラーを解決するには、使用済みのレプリケーションスロットを削除するか、max_replication_slots パラメータの値を増やします。
解決策
使用済みレプリケーションスロットの削除
使用済みのレプリケーションスロットは引き続きスペースを占有します。複数の AWS DMS タスクを実行している場合、または同じ DB インスタンスで古いタスクを実行している場合は、使用済みのレプリケーションスロットを削除します。
まず、レプリケーションスロットの最大数を確認します。次に、使用済みのレプリケーションスロットを削除します。
次のクエリを実行して、レプリケーションスロットの最大数を確認します。active 列を確認して、未使用のレプリケーションスロットを特定します。
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 DB インスタンスにアタッチされているカスタム DB パラメータグループの DB パラメータを変更します。次に、max_replication_slots パラメータの値を増やします。これは静的パラメータであるため、パラメータ値を変更した後は、必ず DB インスタンスを再起動する必要があります。その後、タスクを再開します。
関連情報
論理レプリケーションを使用した変更データ キャプチャ (CDC) の有効化
Amazon RDS for PostgreSQL
Using a PostgreSQL database as an AWS DMS source
PostgreSQL Web サイトの Logical decoding examples