PostgreSQL をソースとして使用する AWS DMS タスクがレプリケーションスロットすべてが使用中のために失敗するのはなぜですか ?

最終更新日 : 2019 年 10 月 1 日

PostgreSQL をソースとしている Amazon Relational Database Service (Amazon RDS) DB インスタンスを使用する、AWS Database Migration Service (AWS DMS) タスクを実行させています。このタスクが失敗したときに、すべてのレプリケーションスロットが使用中であり、エラーメッセージが表示されました。このタスクが失敗する理由と、これらのエラーを解決する方法を教えてください。

簡単な説明

PostgreSQL を実行する RDS DB インスタンスの場合、AWS DMS では、ネイティブレプリケーションスロットを使用して、変更データキャプチャ (CDC) の論理レプリケーション、つまり継続的なレプリケーションを実行しています。

PostgreSQL インスタンスにあるレプリケーションスロットの数は、max_replication_slots パラメータによって制御されています。PostgreSQL を実行する RDS DB インスタンスにあるレプリケーションスロット数は、デフォルトでは 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 インスタンスで実行中の古いタスクがある場合は、領域を占有し続ける使用済みレプリケーションスロットを削除して、新しいタスクがスロットを使用できるようにします。まず、レプリケーションスロットの最大数を確認します。次に、新しいタスクが利用できるように、使用済みのレプリケーションスロットを削除または「drop」します。

次のクエリを実行して、レプリケーションスロットの最大数を確認します。

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

次のクエリを実行して、使用済みレプリケーションスロットを削除します。

SELECT pg_drop_replication_slot('old_and_used_slot');

注: old_and_used_slot を削除するレプリケーションスロットの名前に置き換えます。

max_replication_slots パラメータの値を増やす

DB パラメータの変更を、Amazon RDS DB インスタンスにアタッチされているカスタム DB パラメータグループで行い、max_replication_slots パラメータの値を増やします。これは静的パラメータであるため、パラメータ値の変更後に、DB インスタンスを再起動する必要があります。

使用済みレプリケーションスロットの削除、もしくは max_replication_slots パラメータの値を増やした後は、AWS DMS タスクを再起動します


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合