接続中のセッションを全部切る方法

セッション毎にプロセスが動いている。
pg_terminate_backend()を使ってプロセスを落とせば良い。
動いているプロセスを落とせばセッションは切れる。
killで落とすと上手くいかないので注意。

基本形

基本形は以下の通り。


$ sudo -s -u postgres
$ psql
postgres=> select pg_terminate_backend({プロセスID});

通常、セッションは複数存在するため、切りたいセッションのプロセスIDを選択して
pg_terminate_backend()に渡す必要がある。

自分以外全部切る

生きているセッションをpg_terminate_backend()(後述)を使って探し、
pg_terminate_backend()に食わせて落とす。
自分自身のpidは pg_backend_pid() で得られる。


$ sudo -s -u postgres
$ psql
postgres=>
SELECT pg_terminate_backend(pid)
  FROM pg_stat_activity
 WHERE datname = 'DB名'
   AND pid <> pg_backend_pid();

datnameはTypoではない!

動的統計情報ビュー

上で使っているpg_stat_activityは動的統計情報ビューというビルトインのビューの一つ。
27.2.2. 統計情報の表示
サーバ当たり1行の形式で、
状態や現在の問い合わせ等のプロセスの現在の活動状況に関連した情報を表示する。

取れるデータ達は以下の通り。PostgresSQLのバージョンによって異なるが、
よく使いそうなものは変わらなそう。使う場合には要注意。


postgres=> \d pg_stat_activity;
           View "pg_catalog.pg_stat_activity"
      Column      |           Type           | Modifiers
------------------+--------------------------+-----------
 datid            | oid                      |           ; バックエンドが接続するデータベースのOID
 datname          | name                     |           ; バックエンドが接続するデータベースの名前
 pid              | integer                  |           ; バックエンドのプロセスID
 usesysid         | oid                      |           ; バックエンドにログインしたユーザの識別子
 usename          | name                     |           ; バックエンドに接続したユーザの名前
 application_name | text                     |           ; バックエンドに接続したアプリケーションの名前
 client_addr      | inet                     |           ; バックエンドに接続したクライアントのIPアドレス
 client_hostname  | text                     |           ; client_addrの逆引き検索により報告された、接続クライアントのホスト名
 client_port      | integer                  |           ; クライアントがバックエンドとの通信に使用するTCPポート
 backend_start    | timestamp with time zone |           ; プロセスが開始、つまりクライアントがサーバに接続した時刻
 xact_start       | timestamp with time zone |           ; プロセスの現在のトランザクションが開始した時刻
 query_start      | timestamp with time zone |           ; 現在有効な問い合わせが開始した時刻
 state_change     | timestamp with time zone |           ; stateの最終変更時刻
 wait_event_type  | text                     |           ; he type of event for which the backend is waiting
 wait_event       | text                     |           ; Wait event name if backend is currently waiting, otherwise NULL.
 state            | text                     |           ; Current overall state of this backend
 backend_xid      | xid                      |           ; もしあれば、このバックエンドの最上位のトランザクション識別子
 backend_xmin     | xid                      |           ; 現在のバックエンドのxmin
 query            | text                     |           ; バックエンドの最も最近の問い合わせテキスト
 backend_type     | text                     |           ; Type of current backend