Come eliminare tutte le connessioni a un database specifico senza arrestare il server?


45

Voglio eliminare tutte le connessioni (sessioni) che sono attualmente aperte a un database PostgreSQL specifico ma senza riavviare il server o disconnettere le connessioni ad altri database.

Come lo posso fare?


Ho letto da qualche parte che potresti usare lowth.com/cutter per raggiungere questo obiettivo .

Risposte:


22

Ecco la mia risposta a una domanda molto simile su StackOverflow.

A seconda della tua versione di postgresql potresti imbatterti in un bug, che fa pg_stat_activityomettere le connessioni attive dagli utenti abbandonati. Anche queste connessioni non sono mostrate all'interno di pgAdminIII.

Se stai eseguendo test automatici (in cui crei anche utenti) questo potrebbe essere uno scenario probabile.

In questo caso è necessario ripristinare query come:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');

8
ERRORE: mancante voce della clausola FROM per la tabella "pg_stat_activity" (psql (9.6.1))
user1767316

4
questo non funziona più .... ottieni l'errore sopra ^
leggero il

Vedi risposta sotto di Szymon Guz
Dfranc3373,

Manca dalla clausola, non funziona
Vipul

78

La query in questo modo dovrebbe aiutare (supponendo che il database sia chiamato 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pidera chiamato procpid, quindi se stai usando una versione di Postgres precedente alla 9.2 puoi provare quanto segue:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

Tuttavia, devi essere un superutente per disconnettere altri utenti.

Potrebbe anche essere utile REVOKE CONNECT ON DATABASE FROM PUBLICo qualcosa di simile, e poi GRANTin seguito.


3

Questo può essere usato per "liberare" un database dalle connessioni client, in modo che, ad esempio, tu possa rinominarlo:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

Tenere presente che ciò potrebbe causare comportamenti problematici alle app client. I dati in realtà non devono essere aggiornati a causa dell'utilizzo delle transazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.