2010-07-06 29 views
15

Tengo un script en PostgreSQL que restaura la base de datos de prueba del volcado todas las noches. Los servidores y procesos de la aplicación acceden a la base de datos con un grupo de conexiones que mantiene activas algunas conexiones en todo momento.PostgreSQL: deshabilitar temporalmente las conexiones

Para que el script restablezca el volcado en my_temp_database. Luego debe cambiar el nombre de my_database a my_old_database, my_temp_database a my_database, y eventualmente colocar my_old_database.

¿Cómo puedo desconectar todos los clientes, superusuario o no, de my_database, para poder cambiar el nombre? ¿Cómo puedo evitar temporalmente que se vuelvan a conectar?

¿Hay una manera mejor de hacer lo que necesito?

Respuesta

23

Para marcar como base de datos que no aceptan nuevas conexiones applogs '':

update pg_database set datallowconn = false where datname = 'applogs'; 

Otra posibilidad sería la de revocar 'conectar' el acceso a la base de datos para el papel (s) cliente.

Desconectar usuarios de la base de datos = matar back-end. Así que para desconectar todos los demás usuarios de la base de datos "applogs", por ejemplo:

select pg_terminate_backend(procpid) 
from pg_stat_activity 
where datname = 'applogs' and procpid <> pg_backend_pid(); 

Una vez que has hecho ambas cosas, usted es el único usuario conectado a '' applogs. Aunque en realidad podría haber un retraso antes de que los backends realmente terminen de desconectarse?

+0

Ha, me gustaría que trabajó en 8.3. –

+0

En 8.3 puede intentar 'seleccionar pg_terminate_backend (pid) de pg_stat_activity;' –

+0

@araqnid El comando "actualizar pg_database establecer datallowconn = false donde datname = 'applogs';" ¡Funciona de maravilla! "¡REVOKE CONNECT ON DATABASE" no funciona para mí! ¡ARRIBA! ¡ARRIBA! ¡ARRIBA! ¡ARRIBA! ¡ARRIBA! ¡ARRIBA! –

7

Después de finalizar las conexiones activas actuales, también puede emitir este comando que solo permitirá a los superusuarios iniciar sesión. Esto supone que estás de acuerdo con que todos los superusuarios tengan acceso. Es de esperar que no entregues derechos de superusuario a cualquiera.

ALTER DATABASE your_db CONNECTION LIMIT 0; 
0

que tenían un escenario de uso diferente, en la que se quiere desactivar una base de datos para todo el mundo (incluyendo superusuario) y para siempre, pero no claramente lo dejo caer por el momento, para poder reactivarlo rápidamente si es necesario.

Esto funcionó bien en un viejo 8.3 Postgres:

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name'; 
0

A partir de PostgreSQL 9.5 podemos finalmente:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false; 
Cuestiones relacionadas