Necesito escribir un script que suelte una base de datos PostgreSQL. Puede haber muchas conexiones, pero el script debe ignorar eso.
La DROP DATABASE db_name
consulta estándar no funciona cuando hay conexiones abiertas.
¿Cómo puedo resolver el problema?
postgresql
Roman Prykhodchenko
fuente
fuente
Respuestas:
Esto eliminará las conexiones existentes, excepto las suyas:
Consulte
pg_stat_activity
y obtenga los valores pid que desea eliminar, luego emítalosSELECT pg_terminate_backend(pid int)
.PostgreSQL 9.2 y superior:
PostgreSQL 9.1 y siguientes:
Una vez que desconecte a todos, deberá desconectar y emitir el comando DROP DATABASE desde una conexión desde otra base de datos, es decir, no la que está tratando de eliminar.
Tenga en cuenta el cambio de nombre de la
procpid
columna apid
. Vea este hilo de la lista de correo .fuente
; drop database TARGET_DB;
funcionó bien en mi caso para asegurarme de que la base de datos se hubiera ido para cuando las cosas comenzaran a reintentarse.dropdb --force
.En PostgreSQL 9.2 y superior, para desconectar todo excepto su sesión de la base de datos a la que está conectado:
En versiones anteriores es lo mismo, solo cambie
pid
aprocpid
. Para desconectarse de una base de datos diferente, simplemente cambiecurrent_database()
el nombre de la base de datos de la que desea desconectar a los usuarios.Es posible que desee a
REVOKE
laCONNECT
derecha de los usuarios de la base de datos antes de desconectar a los usuarios, de lo contrario, los usuarios simplemente se volverán a conectar y nunca tendrán la oportunidad de abandonar la base de datos. Vea este comentario y la pregunta con la que está asociado, ¿Cómo desconecto a todos los demás usuarios de la base de datos ?Si solo desea desconectar a los usuarios inactivos, consulte esta pregunta .
fuente
Puede eliminar todas las conexiones antes de descartar la base de datos utilizando la
pg_terminate_backend(int)
función.Puede obtener todos los backends en ejecución usando la vista del sistema
pg_stat_activity
No estoy completamente seguro, pero lo siguiente probablemente mataría todas las sesiones:
Por supuesto, es posible que no estés conectado a esa base de datos
fuente
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á realizando 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:
NOTA: En 9.2+ tendrás que cambiar
procpid
apid
.fuente
procpid
apid
este fragmento funciona en 9.3.Noté que postgres 9.2 ahora llama a la columna pid en lugar de procpid.
Tiendo a llamarlo desde la cáscara:
Espero que sea útil. Gracias a @JustBob por el sql.
fuente
Acabo de reiniciar el servicio en Ubuntu para desconectar los clientes conectados.
fuente
En el símbolo del sistema de Linux, primero detendría todos los procesos postgresql que se están ejecutando al vincular este comando sudo /etc/init.d/postgresql restart
escriba el comando bg para verificar si otros procesos postgresql todavía se están ejecutando
luego seguido por dropdb dbname para descartar la base de datos
Esto funciona para mí en el símbolo del sistema de Linux
fuente
PostgreSQL 9.2 y superior:
SELECT pg_terminate_backend(pid)FROM pg_stat_activity WHERE datname = 'YOUR_DATABASE_NAME_HERE'
fuente
Aquí está mi truco ... = D
Pongo esta respuesta porque incluye un comando (arriba) para bloquear nuevas conexiones y porque cualquier intento con el comando ...
... no funciona para bloquear nuevas conexiones!
¡Gracias a @araqnid @GoatWalker! = D
https://stackoverflow.com/a/3185413/3223785
fuente
Próximamente PostgreSQL 13 presentará la
FORCE
opción.fuente
En mi caso, tuve que ejecutar un comando para desconectar todas las conexiones, incluida mi conexión de administrador activa
que finalizó todas las conexiones y me mostró un mensaje fatal de "error":
FATAL: terminating connection due to administrator command SQL state: 57P01
Después de eso, fue posible soltar la base de datos
fuente
Nada funcionó para mí, excepto que inicié sesión usando pgAdmin4 y en el Tablero desconecté todas las conexiones excepto pgAdmin4 y luego pude cambiar el nombre haciendo clic con el botón derecho en la base de datos y las propiedades y escribí un nuevo nombre.
fuente