2009-04-07 11 views

risposta

20

Combina la funzione pg_terminate_backend e la vista di sistema pg_stat_activity.

+2

pg_cancel_backend() non si disconnette, annulla solo la query corrente. La prossima query può arrivare in qualsiasi secondo usando la stessa vecchia connessione che è ancora lì. –

+0

Riparato. Grazie! –

0

Ho trovato this thread sulla mailing list. Suggerisce di usare SIGTERM per far disconnettere i client.

Non pulito come db2 force application all.

36

Uccisioni processi inattivi in ​​PostgreSQL 8.4:

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

Funziona come un fascino in Postgres v9.1.4. Grazie per gli approfondimenti! –

+13

Nelle ultime versioni di Postgres: 'SELEZIONA pid, (SELEZIONA pg_terminate_backend (pid)) come ucciso da pg_stat_activity DOVE stato LIKE come 'idle';' –

+0

@Mike Weller: grazie, questo lo ha fatto per me! – jipiboily

1

probabilmente un approccio mano più pesante quindi dovrebbe essere usato ma:

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

This SO answer splendidamente spiega (citazione completa da araqnid tra le regole orizzontali, poi di nuovo io):


T o database di marchio come non accettare nuove connessioni 'applogs':

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

Un'altra possibilità sarebbe quella di revocare 'collegare' l'accesso alla banca dati per il ruolo client (s).

Disconnettere utenti dal database = kill backend. Quindi, per scollegare tutti gli altri utenti dal database "applogs", per esempio:

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

volta che hai fatto sia di quelli, sei l'unico utente collegato a 'applogs. Sebbene potrebbe esserci effettivamente un ritardo prima che i backend finiscano effettivamente di disconnettersi?


Aggiornamento da MarkJL: V'è infatti un ritardo prima che il backend finiscono disconnessione.

Ora, ancora una volta: Detto questo, si ricordi che la colonna procpid è stata rinominata in pid in PostgreSQL 9.2 e versioni successive.

Penso che questo sia molto più utile della risposta di Milen A. Radev che, pur essendo tecnicamente la stessa, non viene fornita con esempi di utilizzo e suggerimenti di vita reale.

+0

C'è sicuramente un ritardo nelle disconnessioni backend – MarkJL

+1

@MarkJL grazie, aggiunto alla risposta (eliminerà questo commento tra qualche giorno) – mirabilos

4

vi posto la mia risposta, perché non ho potuto usare nessuno di loro nel mio script, il server 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';" 

Nella riga successiva, si può fare nulla yo vuole con 'my_database_to_alter'. Come puoi vedere, esegui la query dal database "postgres", che esiste quasi in ogni installazione postgresql.

Fare da superutente e dall'esterno il database dei problemi ha funzionato perfettamente per me.

Problemi correlati