PostgreSQLで現在実行中のSQLを取得する方法

select pid, query_start, now() - query_start as lap, state, query
from pg_stat_activity where state <> 'idle'
order by lap desc;

stateで現在のバックエンドの総体的な状態を確認できる。 (http://www.postgresql.jp/document/9.2/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW

  • active: バックエンドは問い合わせを実行中です。
  • idle: バックエンドは新しいクライアントからのコマンドを待機しています。
  • idle in transaction: バックエンドはトランザクションの内部にいますが、現在実行中の問い合わせが現在ありません。
  • idle in transaction (aborted): この状態はidle in transactionと似ていますが、トランザクション内のある文がエラーになっている点が異なります。
  • fastpath function call: バックエンドは近道関数を実行中です。
  • disabled: この状態は、このバックエンドでtrack_activitiesが無効である場合に報告されます。

実行中のクエリを殺すには、pidさえ分かれば、以下のクエリでプロセスを殺すことが出来る。(https://www.postgresql.jp/document/9.2/html/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE

-- バックエンドの現在の問い合わせを取り消す(SIGINT)
SELECT pg_cancel_backend(/*pid*/);

-- まだ死なない場合、バックエンドを終結する。(SIGTERM)
SELECT pg_terminate_backend(/*pid*/);

それぞれ、成否をbooleanを返す。