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?
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?
Risposte:
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_activity
omettere 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');
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';
pid
era 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 PUBLIC
o qualcosa di simile, e poi GRANT
in seguito.
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.