Comment détacher tous les autres utilisateurs d'une base de données PostgreSQL?

13

J'ai besoin d'un accès exclusif à une base de données. Est-il possible d'utiliser une commande SQL pour "détacher" tous les autres utilisateurs d'une base de données postgres. Ou peut-être en fermant toutes les autres connexions et en obtenant ensuite un accès exclusif.

Il s'agit de tests unitaires et les tests ne sont exécutés que manuellement, il n'y a donc aucun danger. Seules les anciennes connexions mortes seront affectées.

Il n'y a aucun autre utilisateur se connectant à ces bases de données les plus instables.

Les anciennes connexions mortes viennent du développement. Cela se produit tout le temps lorsqu'un test qui est en cours d'écriture ou qui échoue ne sort pas propre.


Si quelqu'un doit également verrouiller les autres utilisateurs pendant un certain temps après les avoir déconnectés dans un scénario de production, voir la réponse de Scott Marlowe ci-dessous: /dba//a/6184/2024


Voir aussi cette question similaire sur dba: comment supprimer toutes les connexions à une base de données spécifique sans arrêter le serveur?

mit
la source

Réponses:

14

Vous pouvez essayer de vous connecter à la base de données en tant qu'utilisateur postgres et d'exécuter:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )    -- 1. don't terminate your own session
    AND datname =                     -- 2. don't terminate connections to 
    (SELECT datname                   --    other databases in the cluster
       FROM pg_stat_activity
      WHERE procpid = pg_backend_pid( )
    );

update Une requête encore meilleure supprime la sous-sélection:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );
gsiems
la source
2
n'oubliez pas de RÉVOQUER les autorisations CONNECT, sinon les utilisateurs créent de nouvelles connexions avant que vous ayez un accès exclusif.
Frank Heikens
@Frank Heikens - Bonne prise. J'avais tapé sur "test unitaire manuel" mais s'il y en a d'autres qui se connectent en plus de l'individu faisant le test unitaire alors "révoquer la connexion sur <nomdat> de ..." serait essentiel.
gsiems
Dans PostgreSQL 9.2, a procpidété renommé pid, alors faites attention à cela.
Craig Ringer
Au-delà de faire un REVOKE avec l'utilisateur en question, je devais aussi REVOKE ..... public - quelque chose à surveiller!
David N. Welton
sur 9.3, il semble que pg_stat_activity.procpid s'appelle désormais pg_stat_activity.pid . travaillé A-OK sinon.
JL Peyret
4

Le problème ici est double, vous devez d'abord déconnecter ces utilisateurs et deuxièmement, vous devez les garder hors de votre serveur. Plutôt que de révoquer les perms de connexion, j'utilise habituellement pg_hba.conf pour refuser les nouvelles connexions de certaines machines et / ou utilisateurs, puis il suffit de faire un arrêt rapide pg_ctl -m; pg_ctl commence à supprimer toutes les connexions actuelles. Avec Slony faisant des changements DDL, c'est à peu près une nécessité ou vous obtiendrez des blocages partout.

Scott Marlowe
la source
5
J'utilise toujours un seul rôle qui autorise CONNECT et qui est hérité de tous les autres rôles. REVOKE se connecte pour ce rôle unique et vous avez terminé. Enveloppez-le dans une fonction avec pg_terminate_backend () et vous avez le contrôle lorsque vous devez arrêter toutes les connexions actuelles.
Frank Heikens