2009-04-07 22 views

Respuesta

20

Función de combinación pg_terminate_backend y la vista del sistema pg_stat_activity.

+2

pg_cancel_backend() no se desconecta, solo cancela la consulta actual. La próxima consulta puede venir en cualquier segundo usando la misma conexión anterior que todavía está allí. –

+0

Reparado. ¡Gracias! –

0

Encontré this thread en la lista de correo. Sugiere usar SIGTERM para causar que los clientes se desconecten.

No tan limpio como db2 force application all.

36

Muertes procesos inactivos en PostgreSQL 8.4:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity 
    WHERE current_query LIKE '<IDLE>'; 
+0

Funciona como un encanto en Postgres v9.1.4. Gracias por las ideas! –

+13

En las últimas versiones de postgres: 'SELECT pid, (SELECCIONAR pg_terminate_backend (pid)) como muerto de pg_stat_activity DONDE declarar LIKE 'inactivo';' –

+0

@Mike Weller: gracias, ¡esto lo hizo por mí! – jipiboily

1

probablemente un enfoque de mano más pesada a continuación, se debe utilizar, pero:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done 
5

This SO answer explica bellamente (cita completa de araqnid entre las normas horizontales, entonces yo otra vez):


T o Base de datos marca como 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?


actualización de MarkJL: En efecto, existe un retraso antes de que terminen de backends desconectar.

Ahora yo de nuevo: Dicho esto, tenga en cuenta que la columna procpid se renombró a pid en PostgreSQL 9.2 y posterior.

Creo que esto es mucho más útil que la respuesta de Milen A. Radev que, aunque técnicamente es lo mismo, no viene con ejemplos de uso y sugerencias de la vida real.

+0

Definitivamente hay un retraso en las desconexiones de backend. – MarkJL

+1

@MarkJL gracias, lo he añadido a la respuesta (eliminará este comentario en unos días) – mirabilos

4

he puesto mi respuesta porque no podía usar cualquiera de ellos en mi guión, Server 9.3:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';" 

En la siguiente línea, se puede hacer cualquier cosa yo quiero Con 'my_database_to_alter'. Como puedes ver, realizas la consulta desde la base de datos "postgres", que existe casi en cada instalación de postgresql.

Haciendo por superusuario y fuera del problema, la base de datos funcionó perfectamente para mí.

Cuestiones relacionadas