pg_terminate_backend
関数を使うとセッションを切断することができますが、引数にPID
を指定しなければならないので、まずそれを調べる必要があります。
ということでpg_stat_activity
ビューを使って現在接続中のプロセスを確認してみましょう。
select * from pg_stat_activity;
いくつか項目が表示されるので、調査の役に立ちそうなやつだけ意味を調べてみます。
詳細を知りたい方は公式ページをご覧ください。
https://www.postgresql.jp/document/9.2/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW
-
datname
接続しているデータベースの名前。 -
pid
プロセスID。これをセッションの切断に使います。 -
usename
接続しているユーザ名。 -
application_name
接続しているアプリケーション名。 -
client_addr
接続しているクライアントのIPアドレス。 -
backend_start
クライアントがサーバに接続した時刻。 -
xact_start
トランザクションが開始した時刻。トランザクション実行中でなければNULL。何か値が入っていて長時間経過していればデッドロックの可能性あり。 -
query_start
直前のクエリを実行開始した時刻。 -
waiting
ロック待機中の場合はt
(true) -
state
-
active
- 問い合わせ実行中。 -
idle
- 次のコマンドを待機中。
(※他にもあるけどよく分かりませんでした。あまり出番がない気がします)
-
-
query
直前に実行したクエリ。
これらの情報を元に怪しいプロセスのPID
を特定したら、pg_terminate_backend
関数にPID
を渡して切断します。
select pg_terminate_backend(9999);
1つ1つ切断するのが面倒なら、pg_stat_activity
の検索結果のPID
をそのままpg_terminate_backend
関数に渡すこともできます。
-- 5時間以上前にクエリを実行したプロセスを全て切断
select pg_terminate_backend(pid) from pg_stat_activity
where query_start < current_timestamp + '-5 hours';
以上です。