2016-09-20 5 views
6

私は最近、PostgreSQLを使用するアプリケーションを継承し、データベースにレコードを保存する際の問題を解決しています。PostgreSQLログのトランザクションをどのようにトラッキングできますか?

log_line_prefixに特別な値%xを含めることで、PostgreSQLでトランザクションIDをログに記録することができます。しかし、私が気づいたのは、トランザクション内で発生する最初のステートメントは常にゼロで記録されるということです。

私は

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

、psqlで次の操作を実行した場合、クエリログには、次のエントリが含まれます。

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; 

私のログ形式は、トランザクションID、%t %xとあなたが見ることができるようです最初の挿入文は0ですが、2番目の挿入を実行すると689に変わります。

トランザクションを開始した後、理由を説明できる人は誰ですか?PostgreSQLは最初の文に正しいトランザクションIDを記録していませんか?または、これを間違って実行している場合は、ログファイルを調べることで、どのクエリが単一のトランザクションの一部であるかを識別する信頼性の高い方法がありますか?

答えて

8

トランザクションIDは、文の開始後に割り当てられます。したがって、log_statementはそれを取得しません。 BEGINはトランザクションIDを割り当てませんが、最初の書き込み操作まで遅延しています。

代わりに仮想txidを使用します。これはすぐに割り当てられます。プレースホルダは%vです。これらはすぐに割り当てられますが、永続的ではなく、バックエンドローカルです。

両方を記録すると便利です。 xminxmaxシステム欄の内容などに一致するので、txidは、トランザクションで行われた操作をグループ化するのに役立つvtxid。

関連する問題