Ich verwende Heroku mit der Option Crane Postgres und habe von meinem lokalen Computer aus eine Abfrage in der Datenbank ausgeführt, als mein lokaler Computer abstürzte. Wenn ich renne
select * from pg_stat_activity
einer der Einträge hat
<IDLE> in transaction
in der Spalte current_query_text.
Daher kann ich die Tabelle, in die die abgebrochene Abfrage geschrieben hat, nicht löschen. Ich habe versucht, pg_cancel_backend (N) zu verwenden, und es gibt True zurück, aber es scheint nichts zu passieren.
Wie kann ich diesen Vorgang beenden, damit ich die Tabelle löschen kann?
postgresql
heroku
Alan
quelle
quelle
Antworten:
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:
(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:
Das ist eine "freundliche" Anfrage, die 1234-Abfrage abzubrechen, und mit etwas Glück wird sie nach einer Weile verschwinden. Letztendlich ist dies effizienter:
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:
und einfach zu "beenden":
UNTERLASSEN SIE:
... 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.
quelle
select version()
. Erhalten Sie bei der Verwendung Fehlermeldungenpg_cancel_backend
?Versuche dies:
Mehr dazu finden Sie hier . Dies sollte eine "sauberere" Lösung dieses Problems sein, als den Prozess pro System zu beenden.
quelle
Sie können das
heroku-pg-extras
Add-On installieren und den folgenden Befehl ausführen, um die PID abzurufen:Dann machen Sie einfach:
HINWEIS : Mit dieser
--force
Option kann pg_terminate_backend ausgegeben werden, wodurch die gesamte Verbindung für diese Abfrage unterbrochen wird.Wenn
heroku pg:locks
nichts aufgelistet ist, versuchen Sie esheroku pg:ps
.Weitere Informationen finden Sie unter:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
quelle
Wir können Folgendes verwenden, um dies in einer einzelnen Abfrage zu erreichen:
quelle
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';