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ół?

Author: alan, 2012-07-02

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ą.

 100
Author: tobixen,
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.

 34
Author: evgenek,
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

 17
Author: davidfrancisco,
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';
 0
Author: codersofthedark,
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