Wie kann man feststellen, ob es in PostgreSQL [inaktive Verbindungen mit] nicht festgeschriebenen Transaktionen gibt?

24

Laut einem Kommentar zu dieser Frage, den ich zu inaktiven Verbindungen in PostgreSQL 9.2 gestellt habe , können einige nicht festgeschriebene Transaktionen (möglicherweise im Zusammenhang mit einigen dieser inaktiven Verbindungen) einige Leistungsprobleme verursachen.

Was ist eine gute Methode, um festzustellen, ob nicht festgeschriebene Transaktionen vorliegen (Bonuspunkte, wenn festgestellt werden kann, ob die Verbindung, mit der sie verbunden sind, inaktiv ist oder nicht)?

Vielen Dank!

Juan Carlos Coto
quelle
2
Schau es dir an pgtop. Sie können auch nach Zeilen suchen, die in der Ausgabe von "Leerlauf in Transaktion" anzeigen ps aux.
Dezso
@dezso - pgtopsieht interessant aus; Gibt es eine Entsprechung für Windows?
Max Vernon
@MaxVernon es gibt einige Hinweise, dass es unter Windows funktionieren soll, aber kein konkretes Beispiel gesehen hat. Aber es ist immer noch ein (relativ) einfaches Perl-Projekt, also ... Und auf jeden Fall funktioniert es mit den pg_stat * -Ansichten.
Dezso

Antworten:

16

Wenn Sie sehen möchten, wie viele inaktive Verbindungen Sie haben, für die eine Transaktion offen ist, können Sie Folgendes verwenden:

select * 
from pg_stat_activity
where (state = 'idle in transaction')
    and xact_start is not null;

Daraufhin wird eine Liste der offenen Verbindungen angezeigt, die sich im Ruhezustand befinden und über eine offene Transaktion verfügen.

Allerdings kann ich im Ruhezustand, in dem eine Transaktion offen ist, keine offene Verbindung wiederherstellen. Vielleicht kann jemand anderes Einzelheiten dazu liefern.

Max Vernon
quelle
3
Beachten Sie, dass die stateSpalte nur in 9.2 vorhanden ist. Und für mich sieht es so aus, als wäre der richtige Zustand "in der Transaktion im Leerlauf".
Dezso
1
Ich stimme dezso zu.
Franken
1
state = 'idle'weist nicht auf eine offene Transaktion hin.
a_horse_with_no_name
2
I cannot recreate an open connection in the idle state that has an open transaction. Öffnen Sie zwei Verbindungen zur Datenbank und geben Sie "begin" ein. in Eins. In der anderen führen Sie die obige Abfrage aus, und Sie haben eine idle in transaction.
X-Istence