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?
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?
Respuestas:
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_activity
que 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');
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';
pid
solí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 PUBLIC
o algo similar, y luego GRANT
después.
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.