¿Cómo eliminar una base de datos PostgreSQL si hay conexiones activas a ella?

Resuelto Roman Prykhodchenko asked hace 13 años • 12 respuestas

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_nameno funciona cuando hay conexiones abiertas.

¿Cómo puedo solucionar el problema?

Roman Prykhodchenko avatar Mar 23 '11 23:03 Roman Prykhodchenko
Aceptado

Esto eliminará las conexiones existentes excepto la tuya:

Consulta pg_stat_activityy 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 procpidcolumna a pid. Vea este hilo de la lista de correo .

Kuberchaun avatar Mar 23 '2011 16:03 Kuberchaun

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 pida 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 REVOKEla CONNECTderecha 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 .

Craig Ringer avatar Nov 06 '2012 06:11 Craig Ringer