¿Cómo soltar todas las conexiones a una base de datos específica sin detener el servidor?

45

Quiero eliminar todas las conexiones (sesiones) que están abiertas actualmente en una base de datos PostgreSQL específica pero sin reiniciar el servidor o desconectar las conexiones a otras bases de datos.

¿Cómo puedo hacer eso?

Sorin
fuente
Leí en alguna parte que podrías usar lowth.com/cutter para lograr esto.

Respuestas:

22

Aquí está mi respuesta a una pregunta muy similar sobre StackOverflow.

Dependiendo de su versión de postgresql, puede encontrarse con un error, que hace pg_stat_activityque omita las conexiones activas de los usuarios descartados. Estas conexiones tampoco se muestran dentro de pgAdminIII.

Si está haciendo pruebas automáticas (en las que también crea usuarios), este podría ser un escenario probable.

En este caso, debe volver a consultas como:

 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');
jb.
fuente
8
ERROR: falta la entrada de la cláusula FROM para la tabla "pg_stat_activity" (psql (9.6.1))
user1767316
44
esto ya no funciona ... obtenga el error anterior ^
ligero
Ver la respuesta a continuación por Szymon Guz
Dfranc3373
Desaparecido de la cláusula, no funciona
Vipul
78

La consulta como esta debería ayudar (suponiendo que la base de datos se llame 'db'):

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

pidsolía llamarse procpid, por lo que si está utilizando una versión de postgres anterior a la 9.2, puede intentar lo siguiente:

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

Sin embargo, debe ser un superusuario para desconectar a otros usuarios.

También podría ser útil REVOKE CONNECT ON DATABASE FROM PUBLICo algo similar, y luego GRANTdespués.

Paul White dice GoFundMonica
fuente
3

Esto se puede usar para "liberar" una base de datos de las conexiones del cliente, para que, por ejemplo, pueda cambiarle el nombre:

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;

Tenga en cuenta que esto podría causar un comportamiento problemático a sus aplicaciones cliente. Los datos en realidad no deberían estar dañados debido al uso de transacciones.

Trygve Laugstøl
fuente