1.如何判斷 idle in transaction 為僵屍事務


1.idle in transaction

在日常運維過程中通過系統進程經常會看到一些idle in transaction 狀態的連接,對於這種狀態的連接我們怎么判斷是不是僵屍事務呢?還是說此事務狀態有還未提交的信息。

postgres=# select pid, state from pg_stat_activity;  
  pid  |state          
-------+---------------------  
 54168 | idle intransaction  
 51197 |idle  
 51983 |active  
(11 rows) 

2.判斷

在pg_stat_activity中查看idle in transaction 狀態相關的二個狀態backend_xid,backend_xmin 我們通過解讀這個二個狀態來確定是否是僵屍事務
backend_xid:用來表示會話是否申請了事務號
backend_xmin:事務會話的快照ID

如果backend_xid 和backend_xmin 為空,可清理掉該進程, 如果不為空,說明事務還沒結束,如未提交

3.示例

# 會話1
postgres=# begin;                       -- 執行begin 的時候沒有事務好,只有在開始執行select 等語句時才有事務號
BEGIN
postgres=# select 1;
 ?column? 
----------
        1
(1 row)

postgres=#  select pg_backend_pid() ;
 pg_backend_pid 
----------------
          28493


#會話2 
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_activity where pid=28493 ;
-[ RECORD 1 ]----+------------------------------
datid            | 13548
datname          | postgres
pid              | 28493
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      | 127.0.0.1
client_hostname  | 
client_port      | 28736
backend_start    | 2022-02-18 11:45:03.954147+08
xact_start       | 2022-02-18 11:52:36.022063+08
query_start      | 2022-02-18 11:52:49.399027+08
state_change     | 2022-02-18 11:52:49.399425+08
wait_event_type  | Client
wait_event       | ClientRead
state            | idle in transaction
backend_xid      | 
backend_xmin     | 
query            | select pg_backend_pid() ;
backend_type     | client backend

# 注意:
    從上面的截圖我們可以看到會話的backend_xid和backend_xmin是空的,因為沒有對數據庫做任何操作所以沒有申請事務號,由於是readcommitted的事務隔離級別,因此目前沒有事務快照信息,backend_xmin為空。
    如果后面數據有操作,那么backend_xid會有一個當前事務號或者查詢當前事務號。

#會話1
postgres=# select txid_current();
 txid_current 
--------------
      2170833
(1 row)

# 會話2
postgres=# select * from pg_stat_activity where pid=28493 ;
-[ RECORD 1 ]----+------------------------------
datid            | 13548
datname          | postgres
pid              | 28493
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      | 127.0.0.1
client_hostname  | 
client_port      | 28736
backend_start    | 2022-02-18 11:45:03.954147+08
xact_start       | 2022-02-18 11:52:36.022063+08
query_start      | 2022-02-18 11:54:39.75218+08
state_change     | 2022-02-18 11:54:39.752858+08
wait_event_type  | Client
wait_event       | ClientRead
state            | idle in transaction
backend_xid      | 2170833
backend_xmin     | 
query            | select txid_current();
backend_type     | client backend





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM