Dies ist eine allgemeine Antwort von Postgres und nicht spezifisch für Heroku
(Die einfach-dumme Antwort auf diese Frage könnte sein ... einfach postgresql 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 repariert 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 abbrechen (dh ohne Shell-Zugriff), solange es Ihre ist oder Sie Super-User-Zugriff haben:
select pg_cancel_backend(1234);
Das ist eine "freundliche" Anfrage, die 1234-Abfrage abzubrechen, und mit etwas Glück wird sie nach einer Weile verschwinden. Letztendlich ist dies effizienter:
select pg_terminate_backend(1234);
Wenn Sie über Shell-Zugriff und Root- oder Postgres-Berechtigungen verfügen, können Sie dies auch über die Shell tun. Um "abzubrechen", kann man tun:
kill -INT 1234
und einfach zu "beenden":
kill 1234
UNTERLASSEN SIE:
kill -9 1234
... das oft dazu führt, dass der gesamte Postgres-Server in Flammen aufgeht, dann können Sie Postgres auch neu starten. Postgres ist ziemlich robust, so dass die Daten nicht beschädigt werden, aber ich würde auf jeden Fall empfehlen, "kill -9" nicht zu verwenden :-)
Ein lang anhaltender "Leerlauf in der Transaktion" bedeutet häufig, dass die Transaktion nicht mit einem "Commit" oder einem "Rollback" beendet wurde, was bedeutet, dass die Anwendung fehlerhaft oder nicht ordnungsgemäß für die Arbeit mit Transaktionsdatenbanken ausgelegt ist. Ein lang anhaltender "Leerlauf in der Transaktion" sollte vermieden werden, da dies auch zu erheblichen Leistungsproblemen führen kann.