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


45

Je souhaite supprimer toutes les connexions (sessions) actuellement ouvertes à 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?


J'ai lu quelque part que vous pourriez utiliser lowth.com/cutter pour y parvenir .

Réponses:


22

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

En fonction de votre version de postgresql, vous pouvez rencontrer un bogue qui pg_stat_activityempêche les connexions actives des utilisateurs supprimés. Ces connexions ne sont pas non plus représentées dans pgAdminIII.

Si vous effectuez des tests automatiques (dans lesquels vous créez également des utilisateurs), cela pourrait ê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');

8
ERREUR: entrée de la clause FROM manquante pour la table "pg_stat_activity" (psql (9.6.1))
utilisateur1767316 le

4
cela ne fonctionne plus .... obtenir l'erreur ci-dessus ^
poids léger

Voir la réponse ci-dessous de Szymon Guz
Dfranc3373

Absent de la clause, ne fonctionne pas
Vipul

78

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

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

pidappelait auparavant procpid, donc si vous utilisez une version de postgres antérieure à 9.2, essayez 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.

Cela pourrait également être utile, REVOKE CONNECT ON DATABASE FROM PUBLICou quelque chose de similaire, et ensuite GRANT.


3

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;

Sachez que cela peut entraîner un comportement problématique pour vos applications clientes. Les données actuelles ne doivent pas être interrompues en raison de l’utilisation de transactions.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.