To jest ogólna odpowiedź Postgresa, a nie specyficzna dla heroku
(Prosta-głupia odpowiedź na to pytanie może brzmieć ... po prostu uruchom ponownie postgresql. Zakładając, że jest to niepożądane lub nie wchodzi w grę ...)
Znajdź PID, uruchamiając ten sql:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(Zapytanie może wymagać naprawy w zależności od wersji postgres - ostatecznie wystarczy wybrać * z pg_stat_activity). Pid znajdziesz w pierwszej (lewej) kolumnie, a pierwszym (górnym) wierszem prawdopodobnie będzie zapytanie, które chcesz zakończyć. Zakładam, że pid to 1234 poniżej.
Możesz anulować zapytanie przez SQL (tj. Bez dostępu do powłoki), o ile jest twoje lub masz dostęp superużytkownika:
select pg_cancel_backend(1234);
To "przyjacielska" prośba o anulowanie zapytania 1234 i przy odrobinie szczęścia zniknie po chwili. Ostatecznie jest to bardziej wydajne:
select pg_terminate_backend(1234);
Jeśli masz dostęp do powłoki i uprawnienia roota lub postgres, możesz to również zrobić z powłoki. Aby „anulować”, można:
kill -INT 1234
i aby „zakończyć”, po prostu:
kill 1234
NIE RÓB:
kill -9 1234
... co często spowoduje, że cały serwer postgres stanie w płomieniach, wtedy równie dobrze możesz ponownie uruchomić postgres. Postgres jest dość niezawodny, więc dane nie zostaną uszkodzone, ale w każdym przypadku odradzałbym używanie "kill -9" :-)
Długotrwała „bezczynność w transakcji” często oznacza, że transakcja nie została zakończona „zatwierdzeniem” lub „wycofaniem”, co oznacza, że aplikacja zawiera błędy lub nie została prawidłowo zaprojektowana do pracy z transakcyjnymi bazami danych. Należy unikać długotrwałego „bezczynności w transakcji”, ponieważ może to również powodować poważne problemy z wydajnością.