データベースがトランザクション接続で長時間アイドル状態になっている - Amazon Aurora

データベースがトランザクション接続で長時間アイドル状態になっている

データベースへの接続が 1800 秒以上 idle in transaction 状態です。

サポート対象エンジンバージョン

このインサイト情報は、Aurora PostgreSQL のすべてのバージョンでサポートされています。

Context

idle in transaction 状態のトランザクションがロックを保持していて、他のクエリをブロックしている可能性があります。また、VACUUM (自動バキュームを含む) がデッド行をクリーンアップするのを妨げて、インデックスやテーブルが肥大化したり、トランザクション ID がラップアラウンドしたりします。

この問題の考えられる原因

インタラクティブセッションで BEGIN または START TRANSACTION を使用して開始されたトランザクションが、COMMIT、ROLLBACK、または END コマンドを使用しても終了していません。これにより、トランザクションは idle in transaction 状態に移行します。

アクション

pg_stat_activity クエリを実行すると、アイドル状態のトランザクションを見つけることができます。

SQL クライアントで、次のクエリを実行して、idle in transaction 状態にあるすべての接続を一覧表示し、継続時間順に並べ替えます。

SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* FROM pg_stat_activity WHERE state = 'idle in transaction' AND xact_start is not null ORDER BY 1 DESC;

インサイトの原因に応じて、異なるアクションをお勧めします。

接続を終了する

インタラクティブセッションで BEGIN または START TRANSACTION を使用してトランザクションを開始すると、トランザクションは idle in transaction 状態に移行します。COMMIT、ROLLBACK、END コマンドを実行してトランザクションを終了するか、接続を完全に切断してトランザクションをロールバックするまで、この状態のままになります。

接続を作成する

次のクエリを使用して、アイドル状態のトランザクションがある接続を終了します。

SELECT pg_terminate_backend(pid);

pid は接続のプロセス ID です。

idle_in_session_timeout パラメータを設定する

パラメータグループの idle_in_transaction_session_timeout パラメータを設定します。このパラメータを設定する利点は、手動操作を行わなくても、長時間アイドル状態になっているトランザクションを終了できることです。このパラメータの詳細については、「PostgreSQL documentation」(PostgreSQL ドキュメント) を参照してください。

接続が終了し、指定した時間を超えてトランザクションが idle_in_transaction 状態にあると、PostgreSQL ログファイルに次のメッセージが報告されます。

FATAL: terminating connection due to idle in transaction timeout

AUTOCOMMIT のステータスを確認する

AUTOCOMMIT は、デフォルトで有効になっています。ただし、クライアントで誤ってオフにした場合は、必ずオンに戻してください。

  • psql クライアントで次のコマンドを実行します。

    postgres=> \set AUTOCOMMIT on
  • pgadmin で、下矢印から AUTOCOMMIT オプションを選択してオンにします。

    pgadmin で、AUTOCOMMIT を選択して、オンにします。

アプリケーションコード内のトランザクションロジックを確認する

アプリケーションロジックを調べ手、問題がない確認します。以下のアクションの場合を検討します。

  • アプリケーションで JDBC auto commit が true に設定されているかどうかを確認します。また、コード内で明示的な COMMIT コマンドを使用することも検討してください。

  • エラー処理ロジックをチェックして、エラー後にトランザクションがクローズされるかどうかを確認します。

  • トランザクションが開いているときに、アプリケーションがクエリによって返された行の処理に時間がかかるかどうかを確認します。その場合は、行を処理する前にトランザクションを閉じるようにアプリケーションをコーディングすることを検討してください。

  • トランザクションに長時間実行される操作が多数含まれていないか確認します。その場合は、1 つのトランザクションを複数のトランザクションに分割します。

関連するメトリクス

以下の PI メトリクスがこのインサイトに関連しています。

  • idle_in_transaction_count - idle in transaction 状態にあるセッション数。

  • idle_in_transaction_max_time - idle in transaction 状態で最も長く実行されているトランザクションの継続時間。