¿Cómo eliminar una base de datos PostgreSQL si hay conexiones activas a ella?
Necesito escribir un script que elimine una base de datos PostgreSQL. Puede haber muchas conexiones, pero el script debería ignorarlas.
La consulta estándar DROP DATABASE db_name
no funciona cuando hay conexiones abiertas.
¿Cómo puedo solucionar el problema?
Esto eliminará las conexiones existentes excepto la tuya:
Consulta pg_stat_activity
y obtén los valores de pid que deseas eliminar, luego entrégalos SELECT pg_terminate_backend(pid int)
.
PostgreSQL 9.2 y superior:
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB
AND pid <> pg_backend_pid();
PostgreSQL 9.1 y anteriores:
SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB
AND procpid <> pg_backend_pid();
Una vez que desconectes a todos, tendrás que desconectarte y emitir el comando DROP DATABASE desde una conexión desde otra base de datos, también conocida como la que estás intentando desconectar.
Tenga en cuenta el cambio de nombre de la procpid
columna a pid
. Vea este hilo de la lista de correo .
En PostgreSQL 9.2 y superior, para desconectar todo excepto su sesión de la base de datos a la que está conectado:
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
AND pid <> pg_backend_pid();
En versiones anteriores es lo mismo, solo cambia pid
a procpid
. Para desconectarse de una base de datos diferente, simplemente cambie current_database()
el nombre de la base de datos de la que desea desconectar a los usuarios.
Es posible que desee estar a REVOKE
la CONNECT
derecha de los usuarios de la base de datos antes de desconectarlos; de lo contrario, los usuarios seguirán reconectándose y nunca tendrá la oportunidad de abandonar la base de datos. Vea este comentario y la pregunta a la que está asociado: ¿ Cómo separo a todos los demás usuarios de la base de datos ?
Si solo desea desconectar a los usuarios inactivos, consulte esta pregunta .