Używam Heroku z opcją Crane Postgres i wykonywałem zapytanie w bazie danych z mojego lokalnego komputera, gdy mój lokalny komputer się zawiesił. Jeśli biegnę
select * from pg_stat_activity
jeden z wpisów ma
<IDLE> in transaction
w kolumnie current_query_text.
W rezultacie nie mogę usunąć tabeli, do której zapisywano zapytanie, które zostało zakończone. Próbowałem użyć pg_cancel_backend (N) i zwraca True, ale wydaje się, że nic się nie dzieje.
Jak mogę zakończyć ten proces, aby móc usunąć tabelę?
postgresql
heroku
alan
źródło
źródło
Odpowiedzi:
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:
(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:
To "przyjacielska" prośba o anulowanie zapytania 1234 i przy odrobinie szczęścia zniknie po chwili. Ostatecznie jest to bardziej wydajne:
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:
i aby „zakończyć”, po prostu:
NIE RÓB:
... 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ą.
źródło
select version()
. Czy podczas używania otrzymujesz komunikaty o błędachpg_cancel_backend
?Spróbuj tego:
Więcej na ten temat można znaleźć tutaj . Powinno to być „czystsze” rozwiązanie tego problemu niż zabijanie procesu przez system.
źródło
Możesz zainstalować
heroku-pg-extras
dodatek i uruchomić następujące polecenie, aby uzyskać identyfikator PID:Następnie po prostu wykonaj:
UWAGA :
--force
opcja może być użyta do wydania pg_terminate_backend, który przerywa całe połączenie dla tego zapytania.Jeśli
heroku pg:locks
nic nie wymienia, spróbujheroku pg:ps
.Więcej informacji można znaleźć pod adresem :
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
źródło
Aby to osiągnąć w jednym zapytaniu, możemy użyć następujących czynności:
źródło
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';