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

最終更新日: 2022 年 6 月 27 日

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

簡単な説明

Amazon RDS for PostgreSQL インスタンスでは、AWS DMS はネイティブレプリケーションスロットを使用して、変更データキャプチャ (CDC) のための論理レプリケーションを実行します。

PostgreSQL インスタンスにあるレプリケーションスロット数は、max_replication_slots パラメータによって制御されています。RDS 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 インスタンスで古いタスクを実行している場合は、使用済みのレプリケーションスロットを削除します。これらのレプリケーションスロットは引き続きスペースを占有するため、削除することでスロットを新しいタスクに使用できるようになります。

まず、レプリケーションスロットの最大数を確認します。次に、使用済みのレプリケーションスロットを削除または「ドロップ」します。

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

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 パラメータの値を増やす

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

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


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


請求に関するサポートまたは技術的なサポートが必要ですか?