pg_stat_activity
pg_stat_activity は、クライアント接続(セッション)と、一部の内部ワーカーの状態を一覧表示するビューです。一般的にはクライアント接続一覧を確認するために利用する事が多いです。OracleのV$SESSIONに相当します。
PostgreSQL のプロセスモデルと pg_stat_activity の関係
PostgreSQL は、外部から接続要求が来ると、 postmaster(5432番ポートで LISTEN している親プロセス) がその接続を受け付け、 fork() によってバックエンドプロセス(セッション)を生成します。このバックエンドプロセスが SQL を実行する主体であり、 pg_stat_activity は これらのバックエンドプロセスの状態を一覧表示するビューです。
そのため、pg_stat_activity は「セッション一覧」として利用されることが多いですが、 より正確には PostgreSQL に接続しているプロセス(セッション)と、一部の内部ワーカーの状態を確認するビューと言えます。
このVIEWはインスタンス全体(クラスタ)を対象にするので接続DB以外への接続セッションも確認できます。なお、pg_stat_activity を実行する際は、 管理者権限(通常 postgres ユーザ)で実行することを推奨します。 一般ユーザでも実行できますが、その場合は 自分自身のセッションしか見えず、 他ユーザのセッションは確認できません。
セッション一覧出力SQL
datname is not null の条件を入れる事でセッション一覧になります。
select a.pid,a.datname, a.usename,a.application_name, s.ssl, client_addr ,to_char(a.backend_start, 'YY/MM/DD HH24:MI:SS') as backend_start ,to_char(a.xact_start, 'YY/MM/DD HH24:MI:SS') as xact_start ,a.state,a.wait_event,a.wait_event_type from pg_stat_activity a left outer join pg_stat_ssl s on s.pid = a.pid where 1=1 and datname is not null order by backend_start ;
項目説明
| No. | 項目名 | 意味 |
| 1 | pid | プロセスID |
| 2 | datname | 接続しているDB名 |
| 3 | usename | 接続ユーザ名 |
| 4 | application_name | アプリケーション名 JDBC 接続の場合、 ApplicationName を接続文字列に指定しないと「PostgreSQL JDBC Driver」と表示されます。 |
| 5 | ssl | SSL接続している場合はt(true)。pg_stat_sslと結合する事で求められます。 |
| 6 | client_addr | 接続しているクライアントIPアドレス |
| 7 | backend_start | クライアントがサーバに接続開始した時刻 |
| 8 | xact_start | 現在のトランザクションが開始した時刻。bigeinやstart transactionが発行されたタイミング; |
| 9 | state | セッション(バックエンドプロセス)の状態 |
| 10 | wait_event | セッション(バックエンドプロセス)が現在待機している場合は待機イベント名、その他はNULL。 |
| 11 | wait_event_type | 値が取りえる場合はセッション(バックエンドプロセス)が待機しているイベントの型。 さもなければNULL。Ver.9.6以降に設けられた項目です。 |
wait_event と wait_event_type は PostgreSQL 9.6 で導入され、現在のバージョンでも利用できます。
実行例
pid | datname | usename | application_name | ssl | client_addr | backend_start | xact_start | state | wait_event | wait_event_type
-------+----------+----------+--------------------------+-----+-------------+-------------------+-------------------+--------+------------+-----------------
47379 | postgres | postgres | psql | t | 192.168.3.5 | 23/07/17 02:07:11 | 23/07/17 02:11:33 | active | |
47393 | myposdb | postgres | psql | t | 192.168.3.5 | 23/07/17 02:08:21 | | idle | ClientRead | Client
47417 | myposdb | sooni | psql | f | 192.168.3.5 | 23/07/17 02:10:12 | | idle | ClientRead | Client
47433 | myposdb | postgres | pgAdmin 4 - CONN:6723353 | t | 192.168.3.5 | 23/07/17 02:11:20 | | idle | ClientRead | Client
47434 | myposdb | sooni | PostgreSQL JDBC Driver | f | 192.168.3.5 | 23/07/17 02:11:30 | | idle | ClientRead | Client
(5 行)
postgres=#
queryカラムで最後に実行したSQLを確認できます
select a.pid,a.datname,a.usename,a.application_name ,to_char(a.backend_start, 'YY/MM/DD HH24:MI:SS') as backend_start ,a.query from pg_stat_activity a where 1=1 and datname is not null order by backend_start ;

