¿Cómo separo a todos los demás usuarios de una base de datos postgres?

13

Necesito acceso exclusivo a una base de datos. ¿Es posible usar un comando SQL para "separar" a todos los demás usuarios de una base de datos postgres. O tal vez cerrando todas las demás conexiones y luego obteniendo acceso exclusivo.

Esto es para pruebas unitarias, y las pruebas solo se ejecutan manualmente, por lo que no hay peligro involucrado. Solo las conexiones muertas viejas se verán afectadas.

No hay otros usuarios que se conecten a estas bases de datos unittest.

Las viejas conexiones muertas provienen del desarrollo. Esto sucede todo el tiempo cuando una prueba que se está escribiendo o falla no sale limpia.


Si alguien también necesita mantener bloqueados a otros usuarios por un tiempo después de desconectarlos en un escenario de producción, vea la respuesta de Scott Marlowe a continuación: /dba//a/6184/2024


Consulte también esta pregunta similar sobre dba: ¿Cómo soltar todas las conexiones a una base de datos específica sin detener el servidor?

mit
fuente

Respuestas:

14

Puede intentar conectarse a la base de datos como usuario de postgres y ejecutar:

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

actualizar Una consulta aún mejor elimina la subselección:

SELECT pg_terminate_backend( procpid )
FROM pg_stat_activity
WHERE procpid <> pg_backend_pid( )
    AND datname = current_database( );
gsiems
fuente
2
no olvide revocar los permisos CONNECT, de lo contrario, los usuarios crearán nuevas conexiones antes de que tenga acceso exclusivo.
Frank Heikens
@ Frank Heikens - Buena captura. Había introducido "prueba de unidad manual", pero si hay otros que se conectan además de la persona que realiza la prueba de unidad, sería esencial "revocar la conexión en <datname> desde ...".
gsiems
En PostgreSQL 9.2, procpidse cambió el nombre a pid, así que ten cuidado con eso.
Craig Ringer el
Más allá de hacer una REVOCACIÓN con el usuario en cuestión, también tuve que REVOCAR ... público - ¡algo a tener en cuenta!
David N. Welton
en 9.3 parece que pg_stat_activity.procpid ahora se llama pg_stat_activity.pid . trabajó A-OK de lo contrario.
JL Peyret
4

El problema aquí es doble: primero debe desconectar a esos usuarios y, segundo, debe mantenerlos fuera de su servidor. En lugar de revocar permisos de conexión, generalmente uso pg_hba.conf para rechazar nuevas conexiones de ciertas máquinas y / o usuarios, luego solo hago una parada rápida pg_ctl -m; pg_ctl comienza a eliminar todas las conexiones actuales. Con slony haciendo cambios DDL, esto es prácticamente una necesidad o obtendrá puntos muertos por todas partes.

Scott Marlowe
fuente
55
Siempre uso un solo rol que permite CONECTAR y es heredado por todos los demás roles. REVOCA la conexión para este rol único y listo. Envuélvalo en una función con pg_terminate_backend () y tendrá el control cuando tenga que detener todas las conexiones actuales.
Frank Heikens