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?
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?
Réponses:
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_activity
empê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');
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';
pid
appelait 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 PUBLIC
ou quelque chose de similaire, et ensuite GRANT
.
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.