PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hängende Abfrage beenden (im Leerlauf in Transaktion)

Dies ist eine allgemeine Postgres-Antwort und nicht spezifisch für Heroku

(Die einfach dumme Antwort auf diese Frage könnte lauten ... postgresql einfach neu starten. Vorausgesetzt, das ist nicht wünschenswert oder keine Option ...)

Finden Sie die PID, indem Sie diese SQL ausführen:

SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;

(Die Abfrage muss möglicherweise abhängig von der Version von Postgres korrigiert werden. Wählen Sie schließlich einfach * aus pg_stat_activity aus). Sie finden die PID in der ersten (linken) Spalte, und die erste (obere) Zeile ist wahrscheinlich die Abfrage, die Sie beenden möchten. Ich gehe davon aus, dass die PID unten 1234 ist.

Sie können eine Abfrage über SQL (d. h. ohne Shell-Zugriff) abbrechen, solange sie Ihnen gehört oder Sie Superuser-Zugriff haben:

select pg_cancel_backend(1234);

Das ist eine "freundliche" Aufforderung, die 1234-Abfrage abzubrechen, und mit etwas Glück verschwindet sie nach einer Weile. Letztendlich ist dies effizienter:

select pg_terminate_backend(1234);

Wenn Sie Shell-Zugriff und Root- oder Postgres-Berechtigungen haben, können Sie dies auch über die Shell tun. Zum "Abbrechen" kann man Folgendes tun:

kill -INT 1234

und zum "beenden", einfach:

kill 1234

NICHT:

kill -9 1234

... das führt oft dazu, dass der gesamte Postgres-Server in Flammen aufgeht, dann können Sie Postgres genauso gut neu starten. Postgres ist ziemlich robust, sodass die Daten nicht beschädigt werden, aber ich würde auf jeden Fall davon abraten, "kill -9" zu verwenden :-)

Ein lange andauernder „Idle in Transaction“ bedeutet oft, dass die Transaktion nicht mit einem „Commit“ oder einem „Rollback“ beendet wurde, was bedeutet, dass die Anwendung fehlerhaft oder nicht richtig für die Arbeit mit transaktionalen Datenbanken ausgelegt ist. Langanhaltender "Idle in Transaction" sollte vermieden werden, da auch dies zu erheblichen Performance-Problemen führen kann.