2016-09-20 30 views
6

我最近繼承了一個使用PostgreSQL的應用程序,並且一直在解決與在數據庫中保存記錄有關的問題。如何跟蹤PostgreSQL日誌中的事務?

我知道PostgreSQL允許我通過在log_line_prefix中包含特殊值%x來記錄交易ID。但是,我注意到,事務中發生的第一條語句總是以零記錄。

如果我執行PSQL以下操作,

begin; 
insert into numbers (1); 
insert into numbers (2); 
commit; 

查詢日誌將包含以下項目:

2016-09-20 03:07:40 UTC 0 LOG: statement: begin; 
2016-09-20 03:07:53 UTC 0 LOG: statement: insert into numbers values (1); 
2016-09-20 03:07:58 UTC 689 LOG: statement: insert into numbers values (2); 
2016-09-20 03:08:03 UTC 689 LOG: statement: commit; 

我的日誌格式%t %x,正如你所看到的,事務ID對於第一個插入語句是0,但是當我執行第二個插入時它變爲689。

任何人都可以解釋爲什麼開始一個事務後PostgreSQL不會在第一條語句上記錄正確的事務ID嗎?或者,如果我只是做了這個錯誤,是否有一種更可靠的方式通過查看日誌文件來確定哪些查詢是單個事務的一部分?

回答

8

事務ID在語句開始後分配,因此log_statement不捕獲它。 BEGIN不分配事務ID,它會延遲到第一次寫入操作。

使用虛擬txid,而不是立即分配。佔位符是%v。這些被立即分配,但不是持久的,並且是後端本地的。

我覺得記錄兩者都很有用。 txid因爲它匹配到xminxmax系統列的內容等; vtxid幫助我將交易中完成的操作分組。