PostgreSQLで同時接続数の確認と接続中のセッションを切断する方法

データーベースのパフォーマンス調査やメンテの際に必要となるコマンド

現在の接続数を確認するSQL

SELECT * FROM pg_stat_activity;

クエリを実行すると現在のステータス関連の情報が表示されます。

pg_stat_activityで表示される各項目について

        列        |            型            | 説明    
------------------+--------------------------+----------+---------------+------------
 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                     |バックエンドが待機しているイベントがあればその型、なければNULL
 wait_event       | text                     |バックエンドが現在待機している場合は待機イベント名、その他はNULL
 state            | text                     |現在のバックエンドの総体的な状態です
 backend_xid      | xid                      |このバックエンドの最上位のトランザクション識別子
 backend_xmin     | xid                      |現在のバックエンドのxmin
 query            | text                     |バックエンドの最も最近の問い合わせテキスト
 backend_type     | text                     |現在のバックエンドの種別

現在の最大同時接続数の設定を確認するSQL

SHOW max_connections;

クエリを実行するとデータベースに設定されている現在の最大同時接続(セッション)が表示されます。

接続中のセッションを切断するSQL

すごく遅いSQLが動いているセッションがボトルネックになっていることで、データベースのパフォーマンスが落ちてしまう場合は強制的にそのセッションを切断するしかありません
強制的にセッションを切断するには下記のクエリを実行します。

切断するセッションのpidを指定する場合
「pid」はpg_stat_activityテーブルのpid列の値をセットします。

SELECT pg_terminate_backend(pid)

特定のデータベースのセッションを全て切断する場合

SELECT pg_terminate_backend(pid)
  FROM pg_stat_activity
 WHERE datname = 'DB名'
   AND pid <> pg_backend_pid(); -- この条件により自分自身の接続は除外します

プログラム側の接続がコネクションプールを使っている場合に切断すると、プログラム側の実行タイミングでエクセプションが発生するので、切断する場合はプログラムが動作しているアプリケーションサーバー側の対処もセットになるので、運用時は注意して行いましょう。

参考リンク

PostgreSQLの接続情報関連についての公式ドキュメント

PostgreSQL10.5 データベース活動状況の監視(28.2. 統計情報コレクタ)

https://www.postgresql.jp/document/10/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW

Leave a Reply

Your email address will not be published. Required fields are marked *