2009-04-07 6 views

Odpowiedz

20

Łączenie funkcji pg_terminate_backend i widoku systemu .

+2

pg_cancel_backend() nie rozłącza, tylko anuluje bieżące zapytanie. Następne zapytanie może nadejść w dowolnej chwili, używając tego samego starego połączenia, które nadal tam jest. –

+0

Naprawiono. Dziękuję Ci! –

0

Znalazłem this thread na liście mailingowej. Sugeruje użycie SIGTERM do spowodowania rozłączenia klientów. Nie jest tak czysty jak db2 force application all.

36

zgony idle procesy w PostgreSQL 8.4:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity 
    WHERE current_query LIKE '<IDLE>'; 
+0

Działa jak urok w Postgres v9.1.4. Dzięki za spostrzeżenia! –

+13

W najnowszych wersjach PostgreSQL: SELECT pid, (SELECT pg_terminate_backend (pid)) jako zabity z pg_stat_activity WHERE state LIKE 'idle'; ' –

+0

@Mike Weller: dzięki, zrobiłem to za mnie! – jipiboily

1

prawdopodobnie bardziej heavy handed podejście następnie powinny być używane, ale:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done 
5

This SO answer pięknie wyjaśnia (pełny cytat z araqnid między zasad horyzontalnych, to znowu ja):


T O bazie znak jak nie przyjmowanie nowych połączeń „applogs”:

update pg_database set datallowconn = false where datname = 'applogs'; 

Inną możliwością byłoby odwołać „podłączyć” dostępu w bazie danych dla roli (ów) klienta.

Odłącz użytkowników od bazy danych = zabij backend. Tak aby odłączyć wszystkie innym użytkownikom „applogs” bazy danych, na przykład:

select pg_terminate_backend(procpid) 
from pg_stat_activity 
where datname = 'applogs' and procpid <> pg_backend_pid(); 

Po wykonaniu zarówno tych, jesteś jedynym użytkownikiem podłączony do 'applogs. Chociaż może rzeczywiście nastąpić opóźnienie, zanim backend faktycznie zakończy się rozłączeniem?


Aktualizacja z MarkJL: Jest rzeczywiście opóźnienie przed backendy zakończeniu odłączania.

Teraz ja znowu: Mimo to, należy pamiętać, że kolumna procpid została przemianowana na pid w PostgreSQL 9.2 i nowszych.

Uważam, że jest to o wiele bardziej pomocne niż odpowiedź Milena A. Radeva, która choć technicznie jest taka sama, nie zawiera przykładów użycia i sugestii z życia.

+0

Zdecydowanie opóźnienie w rozłączeniach backendu. – MarkJL

+1

@MarkJL thanks, dodano go do odpowiedzi (usunie ten komentarz za kilka dni) – mirabilos

4

zamieścić moją odpowiedź, bo nie każdy może korzystać z nich w moim skryptu, serwer 9.3:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';" 

W następnej linii, można zrobić cokolwiek chcesz z yo „my_database_to_alter”. Jak widać, wykonaj kwerendę z bazy danych "postgres", która istnieje prawie w każdej instalacji po Gresql.

Wykonanie przez superużytkownika i poza bazą danych samo w sobie sprawdziło się idealnie.