31 votes

Forcer la déconnexion du client en utilisant PostgreSQL

Existe-t-il un moyen de forcer les clients à se déconnecter de PostgreSQL ? Je cherche l'équivalent de force application all de DB2.

J'aimerais pouvoir le faire sur ma machine de développement car lorsque j'ai des consoles de base de données ouvertes, je ne peux pas charger un export de base de données. Je dois d'abord les quitter.

37voto

bonyiii Points 1159

Tue les processus inactifs dans PostgreSQL 8.4 :

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity
   WHERE current_query LIKE '';

0 votes

Fonctionne à merveille dans Postgres v9.1.4. Merci pour les informations!

15 votes

Sur les dernières versions de postgres: SÉLECTIONNEZ pid, (SÉLECTIONNEZ pg_terminate_backend(pid)) comme tué de pg_stat_activity OÙ state LIKE 'idle';

0 votes

Cela fonctionne ... sauf que pgAdmin plante lorsqu'il essaie de se reconnecter! Retour à la case départ :(

21voto

Milen A. Radev Points 20462

Combinez la fonction pg_terminate_backend et la vue système pg_stat_activity.

2 votes

Pg_cancel_backend() ne se déconnecte pas, il annule seulement la requête en cours. La prochaine requête peut arriver à tout moment en utilisant la même ancienne connexion qui est toujours là.

6voto

mirabilos Points 1679

Cette réponse SO explique magnifiquement (citation complète de araqnid entre les règles horizontales, puis moi à nouveau):


Pour marquer la base de données 'applogs' comme n'acceptant pas de nouvelles connexions:

update pg_database set datallowconn = false where datname = 'applogs';

Une autre possibilité serait de révoquer l'accès 'connect' à la base de données pour le(s) rôle(s) client.

Déconnecter les utilisateurs de la base de données = tuer le backend. Pour déconnecter tous les autres utilisateurs de la base de données "applogs", par exemple:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();

Une fois que vous avez fait ces deux opérations, vous êtes le seul utilisateur connecté à 'applogs'. Bien qu'il puisse y avoir un délai avant que les backends ne se soient effectivement déconnectés?


Mise à jour de MarkJL: Il y a effectivement un délai avant que les backends ne soient effectivement déconnectés.

Maintenant, moi à nouveau: Cela dit, veuillez noter que la colonne procpid a été renommée en pid dans PostgreSQL 9.2 et ultérieur.

Je pense que c'est beaucoup plus utile que la réponse de Milen A. Radev qui, bien que techniquement similaire, ne s'accompagne pas d'exemples d'utilisation et de suggestions concrètes.

0 votes

Il y a définitivement un retard dans les déconnexions du backend.

1voto

johnjamesmiller Points 375

Sûrement une approche plus lourde que celle qui devrait être utilisée mais :

pour x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done

0voto

Luke Francl Points 11707

J'ai trouvé ce fil de discussion sur la liste de diffusion. Il suggère d'utiliser SIGTERM pour forcer les clients à se déconnecter.

Pas aussi propre que db2 force application all.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X