LoginSignup
35
49

More than 5 years have passed since last update.

[PostgreSQL] 接続中のセッションを切断する

Last updated at Posted at 2017-12-04

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';

以上です。

35
49
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
49