Ich habe kürzlich eine Anwendung geerbt, die PostgreSQL verwendet, und ich habe Probleme mit dem Speichern von Datensätzen in der Datenbank behoben.Wie verfolge ich Transaktionen im PostgreSQL-Protokoll?
Ich weiß, dass PostgreSQL mir erlaubt, die Transaktions-ID in das Protokoll aufzunehmen, indem Sie den speziellen Wert von %x
in der log_line_prefix
. Was ich jedoch bemerkt habe, ist, dass die erste Anweisung, die innerhalb einer Transaktion auftritt, immer mit einer Null geloggt wird.
Wenn ich die folgenden Operationen in psql ausführen,
begin;
insert into numbers (1);
insert into numbers (2);
commit;
das Abfrageprotokoll werden die folgenden Einträge enthalten:
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;
Mein Log-Format ist %t %x
und wie Sie sehen können, die Transaktions-ID für die erste Insert-Anweisung ist 0, aber es ändert sich zu 689, wenn ich die zweite Einfügung ausführe.
Kann jemand erklären, warum PostgreSQL nach dem Start einer Transaktion nicht die richtige Transaktions-ID auf der ersten Anweisung protokolliert? Oder, wenn ich das nur falsch mache, gibt es eine zuverlässigere Möglichkeit, anhand der Protokolldatei herauszufinden, welche Abfragen Teil einer einzelnen Transaktion waren?