what's the pg_stat_activity
pg_stat_activity 是 PostgreSQL 內置的一個系統視圖, 是 PostgreSQL 實例維護的一個進程相關的視圖,是實時變化的。
官方對他的定義是:每一行都表示一個系統進程,顯示與當前會話的活動進程的一些信息,比如當前回話的狀態和查詢等。
主要字段
| Column | Type | Description |
|---|---|---|
| datid | oid | 后台連接的數據庫id(OID) |
| datname | name | 后台連接的數據庫名 |
| pid | integer | 后代進程id(PID) |
| usesysid | oid | 連接到后台的用戶id |
| usename | name | 連接到后台的用戶名稱 |
| application_name | text | 通過后台連接的應用程序名稱 |
| client_addr | inet | 后台連接的IP地址。當該字段為空時,說明客戶端是在服務器主機上通過Unix的socket協議直連,或是數據庫內部進程(如autovacuum等) |
| client_hostname | text | 根據client_addr字段,通過DNS解析獲取的對應主機名稱. 但僅當log_hostname被開啟時才有效,並且只有通過IP協議連接時才能記錄到主機名; |
| client_port | integer | 后台連接使用的TCP端口號。當使用Unix-Socket協議連接時此值為-1。 |
| backend_start | timestamp with time zone | 進程開始的時間,即客戶端連接到服務器的時刻。 |
| xact_start | timestamp with time zone | 進程的當前事務開始執行的時間。若當前無活動事務,該值為null。 如果當前query是事務中的首次查詢,此項值應與query_start列相同. |
| query_start | timestamp with time zone | 當前事務中有在執行中的語句時,此值記錄該語句開始執行的時間; 若事務state不是active狀態,此值記錄的是上一次開始執行語句時間。(即每次開始執行新的語句時此值更新) |
| state_change | timestamp with time zone | 記錄進程中事務狀態發生改變的時刻; |
| waiting | boolean | 是否處於等待。當進程在等待解鎖時此值為t,否則為false |
| state | text | 表示后台進程的整體狀態。可能的值有:
|
| query | text | 后台進程最近(當前)執行的語句內容. 當狀態是 active時,它記錄的是正在執行的語句內容;否則記錄的是上一條語句執行的內容 |
主要作用
平時遇到數據庫,查詢慢,或者數據庫故障問題,可以看看數據庫相關的一些狀態視圖,快速定位問題
-- 查詢閑置連接數。注意是否忘記關閉鏈接。 另外還可以查看連接數是不是過多等問題。 select count(*) from pg_stat_activity where state=‘idle’; -- 統計當前有多少活躍的客戶端 select count(*) from pg_stat_activity where not pid = pg_backend_pid(); -- 查看一個后端進程運行了多久,以及它當前是否在等待 select pid,state,CURRENT_TIMESTAMP - least(query_start,xact_start) AS runtime,substr(query,1,25) AS current_query from pg_stat_activity where not pid = pg_backend_pid(); -- 慢查詢 select pid, datname, usename, client_addr, application_name, state, backend_start, xact_start, xact_stay, query_start, query_stay, replace(query, chr(10), ' ') as query from (select pgsa.pid as pid,
pgsa.datname as datname,
pgsa.usename as usename,
pgsa.client_addr client_addr,
pgsa.application_name as application_name,
pgsa.state as state, pgsa.backend_start as backend_start,
pgsa.xact_start as xact_start,
extract(epoch from (now() - pgsa.xact_start)) as xact_stay,
pgsa.query_start as query_start,
extract(epoch from (now() - pgsa.query_start)) as query_stay ,
pgsa.query as query from pg_stat_activity as pgsa
where
pgsa.state != 'idle' and pgsa.state != 'idle in transaction' and pgsa.state != 'idle in transaction (aborted)')
idleconnections order by query_stay desc limit 5;
