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

dba.stackexchange https://dba.stackexchange.com/questions/16426

  •  22-10-2019
  •  | 
  •  

Question

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

Comment puis-je faire?

Était-ce utile?

La solution

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

En fonction de votre version de postgresql vous pourriez rencontrer un bug, qui fait pg_stat_activity d'omettre les connexions actives des utilisateurs ont chuté. Ces connexions sont également non représentées à l'intérieur pgAdminIII.

Si vous faites des tests automatiques (dans lequel vous créez également aux utilisateurs) cela pourrait être un scénario probable.

Dans ce cas, vous avez besoin de revenir aux questions comme:

 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');

Autres conseils

La requête comme cela devrait aider (en supposant que la base de données est appelée « db »):

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

pid utilisé pour appeler procpid, donc si vous utilisez une version de postgres de plus de 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 super-utilisateur à déconnecter d'autres utilisateurs.

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

Ceci peut être utilisé pour « libérer » une base de données de connexions clients, de sorte que vous pouvez par exemple 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 pourrait causer des problèmes de comportement à vos applications clientes. Les données actualy ne doit pas être currupted due à l'utilisation des transactions.

$ ps aux | grep DATABASE_NAME

51191 postgres: user DATABASE_NAME [local] idle

puis tuer le processus

$ kill 51191
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top