web-dev-qa-db-fra.com

Comment supprimer toutes les connexions à une base de données spécifique sans arrêter le serveur?

Je souhaite supprimer toutes les connexions (sessions) actuellement ouvertes vers une base de données PostgreSQL spécifique mais sans redémarrer le serveur ni déconnecter les connexions à d'autres bases de données.

Comment puis je faire ça?

60
sorin

Voici ma réponse à question très similaire sur StackOverflow.

En fonction de votre version de postgresql, vous pourriez rencontrer un bogue, ce qui rend pg_stat_activity pour omettre les connexions actives des utilisateurs supprimés. Ces connexions ne sont pas non plus affichées dans pgAdminIII.

Si vous effectuez des tests automatiques (dans lesquels vous créez également des utilisateurs), cela peut être un scénario probable.

Dans ce cas, vous devez revenir à des requêtes telles que:

 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');
27
jb.

La requête comme celle-ci devrait aider (en supposant que la base de données est nommée 'db'):

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

pid était autrefois appelé procpid, donc si vous utilisez une version de postgres antérieure à 9.2, vous pouvez essayer ce qui suit:

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

Cependant, vous devez être un superutilisateur pour déconnecter les autres utilisateurs.

Il pourrait également être utile de REVOKE CONNECT ON DATABASE FROM PUBLIC ou quelque chose de similaire, puis GRANT ensuite.

101
Szymon Guz

Cela peut être utilisé pour "libérer" une base de données des connexions client, afin que vous puissiez par exemple la renommer:

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;

N'oubliez pas que cela peut entraîner un comportement problématique pour vos applications clientes. Les données ne doivent pas être actualisées en raison de l'utilisation de transactions.

3
cysk