Amazon RDS for PostrgreSQL または Aurora PostgreSQL 互換 DB インスタンスで、長時間実行しているクエリを終了させる方法を教えてください。

所要時間1分
0

Amazon Relational Database Service (Amazon RDS) for PostgreSQL または Amazon Aurora PostgreSQL 互換エディションの DB インスタンスで長時間実行中のプロセスを終了したいです。

簡単な説明

pg_cancel_backend (pid) を使用するとクエリが終了しますが、接続は維持されます。pg_terminate_backend (pid) を使用するとクエリが終了し、接続が閉じます。この関数が完全な接続を終了すると、進行中の他のクエリが影響を受ける可能性があります。pg_terminate_backend(pid) は、必要な場合にのみ使用してください。

これらの関数を使用するには、次のアクセス許可のいずれかが必要です。

  • rds_superuser または、デフォルトロール pg_signal_backend のメンバー。
  • データベースには、キャンセルするセッションと同じデータベースユーザーで接続します。

注:

  • pg_stat_activity ビューの pid 列を参照し、アクティブなバックエンドプロセスのプロセス ID (pid) を特定します。詳細については、PostgreSQL のウェブサイトで pg_stat_activity について参照してください。
  • pg_signal_backendSIGINT シグナルを、pg_terminate_backendSIGTERM シグナルをバックエンドプロセスに送信します。詳細については、PostgreSQL のウェブサイトで「サーバーシグナリング関数」を参照してください。

解決策

注: 一部の Aurora PostgreSQL 互換バージョンは、すべてのシステム要件が満たされていても autovacuum プロセスを終了できません。これらのバージョンで autovacuum プロセスを終了しようとすると、次のエラーが表示される場合があります。

"ERROR: 42501: スーパーユーザーのプロセスを終了するには、スーパーユーザーである必要があります。LOCATION: pg_terminate_backend, signalfuncs.c:227。」

一部のマイナーバージョンでは、rds_superuser により、ロールに明示的に関連付けられていない autovacuum プロセスを終了させることができます。お使いのバージョンで rds_superuser が autovacuum プロセスを終了できるかどうかを確認するには、「Amazon Aurora PostgreSQL の更新」を参照してください。

pg_cancel_backend(pid) および pg_terminate_backend(pid) 関数の使用方法について、例を次に示します。

pg_cancel_backend(pid):

別のセッションから次の関数を実行すると、pid 8121 のデータベースバックエンドから実行されたクエリがキャンセルされます。

postgres=> SELECT pg_cancel_backend(8121);

期待される出力:

pg_cancel_backend
------------------------
 t
(1 row)

次の内容を実行すると、クエリは正しくキャンセルされ、関数は true (t) を返します。クエリがないか、またはデータベース接続が行われていない場合、関数は false (f) を返します。

pg_terminate_backend(pid):

次のコマンドは、別のセッションから実行すると、pid 8121 のデータベース接続を終了します。

postgres=> SELECT pg_terminate_backend(8121);

期待される出力:

pg_terminate_backend
------------------------
 t
(1 row)

この関数は、プロセスがまだキャンセルされていない場合も true (t) を返します。応答は、SIGTERM シグナルが正常に送信されたことのみを示します。このコマンドは、バックエンドプロセスをすぐには中断しません。共有メモリを一貫性のない状態に保つため、このコマンドは CHECK_FOR_INTERRUPTS の実行中に正常なシャットダウンプロセスを開始します。

終了せず、長時間実行しているプロセスをキャンセルする

割り込み可能なセクションで pg_cancel_backend (pid)pg_terminate_backend (pid) を実行すると、関数はクエリを正常にキャンセルしません。たとえば、プロセスが軽量ロックまたは、ネットワークストレージデバイスに対する読み取りまたは書き込みシステムコールの取得を待っている場合があります。バックエンドプロセスはシグナルを受けず、無期限に膠着状態になります。

プロセスを終了するには、データベースエンジンを再起動します。

PostgreSQL バージョン 14 以降では、statement_timeoutidle_in_transaction_statement_timeoutidle_session_timeout などのタイムアウトパラメータを調整することがベストプラクティスです。tcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count などのクライアントおよびサーバー側のタイムアウトを設定することもベストプラクティスです。

**statement_timeout ** パラメータは、ステートメント、ユーザーレベル、データベース、インスタンスなどの適切なレベルで設定します。

注: インスタンスレベルまたはデータベースレベルで短いタイムアウトを設定することは、タイムアウトが短い場合、意図的に長時間実行しているクエリもキャンセルされるため、ベストプラクティスではありません。log_min_error_statementERROR 以下に設定されている場合、タイムアウトしたステートメントがログに記録されます。詳細については、PostgreSQL のウェブサイトで「ステートメントの動作」を参照してください。

関連情報

Amazon RDS for PostgreSQL または Aurora PostgreSQL DB インスタンスについて、実行中のクエリを確認し、リソース消費の問題を診断する方法を教えてください

Amazon RDS for PostgreSQL または Aurora PostgreSQL 互換 DB インスタンスで、パフォーマンスの問題や実行速度が遅いクエリを特定してトラブルシューティングする方法を教えてください

AWS公式
AWS公式更新しました 1ヶ月前
コメントはありません

関連するコンテンツ