Heroku Postgres-Zakończ zawieszone zapytanie (bezczynność w transakcji)
Używam Heroku z opcją Crane Postgres i uruchamiałem zapytanie w bazie danych z mojej lokalnej maszyny, gdy moja lokalna Maszyna się zawiesiła. If I run
select * from pg_stat_activity
Jeden z wpisów ma
<IDLE> in transaction
W kolumnie current_query_text.
W rezultacie nie mogę upuścić tabeli, do której było napisane 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 tak że mogę upuścić stół?
4 answers
jest to ogólna odpowiedź Postgres, a nie specyficzna dla heroku
Znajdź PID uruchamiając ten sql:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(stare wersje Postgres używają procpid zamiast pid). Pid znajdziesz w pierwszej (lewej) kolumnie, a pierwszy (górny) wiersz prawdopodobnie będzie zapytaniem, które chcesz zakończyć. Zakładam, że pid jest 1234 poniżej.
Możesz anulować zapytanie przez SQL (tj. bez dostępu do powłoki), o ile jest twoje lub masz super usera dostęp:
select pg_cancel_backend(1234);
To jest "miękki" sposób ... zapytanie nie zniknie natychmiast. Jeśli się spieszysz, spróbuj tego zamiast:
select pg_terminate_backend(1234);
Jeśli masz dostęp do powłoki i uprawnienia root lub postgres, możesz to zrobić również z powłoki:
kill -INT 1234
Jeśli to nie pomoże, użyj:
kill 1234
NIE:
kill -9 1234
... to często spowoduje, że cały serwer postgres stanie w płomieniach, wtedy równie dobrze możesz ponownie uruchomić postgres. Postgres jest dość solidny, więc dane nie będą uszkodzone, ale i tak polecam nie używać "kill -9"; -)
Długotrwałe "bezczynność transakcji" często oznacza, że transakcja nie została zakończona "commit" lub "rollback", co oznacza, że aplikacja jest wadliwa lub nieprawidłowo zaprojektowana do pracy z Transakcyjnymi bazami danych. Należy unikać długotrwałego "bezczynności transakcji", ponieważ może to również powodować poważne problemy z wydajnością.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 13:09:32
Spróbuj tego:
select pg_terminate_backend(pid int)
Więcej na ten temat można znaleźć tutaj . Powinno to być "czystsze" rozwiązanie tego problemu niż zabijanie procesu przez system.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 16:04:27
Możesz zainstalować heroku-pg-extras
Dodaj i uruchom następujące polecenie, aby uzyskać PID:
heroku pg:locks --app <your-app>
To po prostu zrób:
heroku pg:kill <pid> --app <your-app>
Uwaga: --force
opcja może być użyta do wydania pg_terminate_backend, które usuwa całe połączenie dla tego zapytania.
Jeśli heroku pg:locks
niczego nie wyświetli, spróbuj heroku pg:ps
.
Aby uzyskać więcej informacji sprawdź out:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 23:26:05
Możemy użyć poniższego, aby to osiągnąć w jednym zapytaniu:
SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 13:17:06