2012-07-02 14 views
60

Używam Heroku z opcją Crane Postgres i uruchomiłem zapytanie do bazy danych z mojego lokalnego komputera, gdy moja lokalna maszyna się zawiesiła. Jeśli uruchomięHeroku Postgres - zakończenie zawieszonego zapytania (bezczynność w transakcji)

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, która była zapisywana przez zapytanie, które zostało zakończone. Próbowałem użyć pg_cancel_backend (N) i zwraca True, ale nic się nie dzieje.

Jak mogę zakończyć ten proces, aby można było usunąć tabelę?

+1

Może pytanie należy przeformułować „jak mam zakończyć moje własne zapytanie, kiedy nie ma ani korzenia dostęp do serwera PostgreSQL ani superużytkownika dostępu do bazy danych”. Wydaje się, że jest to bardzo dobre pytanie ... i nie znam odpowiedzi. – tobixen

Odpowiedz

89

To jest ogólna odpowiedź, a nie specyficzna dla heroku. Ogólnie rzecz biorąc, anulowanie zapytania może wymagać, aby użytkownik miał dostęp superużytkownika do serwera postgres lub do bazy danych postgres - wygląda na to, że zwykły użytkownik nie może zabić swojego własnego procesu zapytania bez pytania administratora lub administratora systemu o pomoc


Znajdź PID uruchamiając ten sql:

SELECT procpid,* from pg_stat_activity 
WHERE current_query<>'<IDLE>' ORDER BY xact_start; 

cenie znajdziesz procpid w pierwszej kolumnie (po lewej), a pierwszy (górny) rząd będzie prawdopodobnie kwerendy you” Chciałbym zakończyć. Założę się, że pid ma wartość 1234 poniżej.

można anulować poprzez zapytanie SQL (czyli bez dostępu do powłoki, ale prawdopodobnie trzeba administratora dostęp do bazy danych):

select pg_cancel_backend(1234); 

To jest „miękki” sposób ... zapytanie nie będzie znika natychmiast. Jeśli jesteś w pośpiechu, spróbuj tego:

select pg_terminate_backend(1234); 

Jeśli masz dostęp do powłoki można też zrobić to z powłoki:

kill -INT 1234 

Jeśli to nie pomoże, użyj:

kill 1234 

nie:

kill -9 1234 

... to często powoduje, że cały serwer Postgresu płonie w płomieniach, a następnie możesz ponownie uruchomić PostgreSQL. PostgreSQL jest dość mocny, więc dane nie zostaną uszkodzone, ale polecam przed użyciem „kill -9” w każdym razie ;-)


„bezczynności w transakcji” oznacza, że ​​transakcja nie była zakończone "zatwierdzeniem" lub "wycofaniem", co oznacza, że ​​aplikacja jest błędna lub niewłaściwie zaprojektowana do pracy z transakcyjnymi bazami danych. Należy unikać długotrwałej "nieaktywności transakcji", ponieważ może to również spowodować poważne problemy z wydajnością.

+0

Próbowałem pg_cancel_backend bezskutecznie. Nie mam dostępu do powłoki i nie jestem superużytkownikiem, więc nie mogę wysłać SIGKILLa używając pg_terminate_backend – alan

+0

Z której wersji Postgreszu korzystasz? (wskazówka: 'wybierz wersję()'). Czy otrzymujesz komunikat o błędzie podczas używania 'pg_cancel_backend'? – tobixen

+0

Sam spróbowałem użyć pg_cancel_backend, więc otrzymałem komunikat o błędzie "musi być superużytkownikiem, aby zasygnalizować inne procesy serwera" ... co oznacza, że ​​będziesz potrzebował albo dostępu do konta root na serwerze, albo dostępu do db przez jakiegoś superużytkownika postgres (np. Postgres użytkownik), aby zabić własne zapytanie. Wydaje się, że to trochę ssać :-( – tobixen

33

Spróbuj tego:

select pg_terminate_backend(pid int) 

Więcej na ten temat można znaleźć here. To powinno być "czystsze" rozwiązanie tego problemu niż zabijanie procesu przez system.

+7

TO ROZWIĄZANIE. pg_cancel_backend często nie działa, ale * zakończenie * jest lewą. –

+0

Dodaj, jak otrzymać swój pid do odpowiedzi – mountainclimber

16

Można zainstalować heroku-pg-extras dodatek i uruchom następujące polecenie, aby uzyskać PID:

heroku pg:locks --app <your-app> 

Następnie wystarczy zrobić:

heroku pg:kill <pid> --app <your-app> 

UWAGA: --force opcja może być używana do Wydaj pg_terminate_backend, który odrzuca całe połączenie dla tego zapytania.

Jeśli heroku pg:locks niczego nie wyświetla, spróbuj heroku pg:ps.

Aby uzyskać więcej informacji sprawdź:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall

+0

Zaoszczędziłam tak dużo czasu ... Dzięki! –

+0

Perfect, thanks – nrowegt

+0

Dziękuję. Nadal nie mogę zakończyć transakcji/PID chociaż ... mój komputer zawiesił sprzęt podczas importu i nie mogę zakończyć PID. :( – dimitarvp

Powiązane problemy