¿Qué hago cuando pg_cancel_backend no funciona?

8

Si tengo una consulta de Postgres de larga duración, y "kill [pid]" no funciona, y pg_cancel_backend no funciona, ¿qué debo hacer?


fuente

Respuestas:

8

Usted debe nunca se kill -9 cualquier postgres procesan a menos que su objetivo es llevar a todo el servidor hacia abajo por la fuerza. Puede eliminar cualquier proceso que no responda a una llamada pg_cancel_backend () desde el shell con

kill <pid>

es decir, no -9. Tenga en cuenta que he visto algunas veces que incluso eso no funcionó debido a que el proceso se colgó esperando en algún bucle los datos en una conexión de red. Si recuerdo correctamente, matar el proceso del cliente se encargó de eso.

mage2k
fuente
8

http://www.postgresql.org/docs/current/static/server-shutdown.html

pg_cancel_backend es equivalente a enviar SIGINT al proceso.
pg_terminate_backend del mismo modo para SIGTERM, pero si pg_cancel_backend no funciona, no veo por qué pg_terminate_backend lo haría.

Si ha probado esas opciones, puede probar SIGQUIT. Los documentos dicen: " Esto se recomienda solo en emergencias " .

(Si odias tus datos y esperas que mueran, podrías usar SIGKILL. Pero no lo haría).

Puedes usarlo killdirectamente o pg_ctl kill.

Bribles
fuente
+1 PostgreSQL usa un proceso por conexión, por lo que puede matar un proceso sin mucho peligro de afectar otras conexiones. No estoy seguro de si hay alguna posibilidad de corrupción de datos, pero realmente lo dudaría.
David Pashley el
Pensé que enviar kill -9 a un proceso de postgres fue desastroso, ya que podría poner la base de datos en modo de recuperación, lo que podría dejarlo fuera de servicio durante muchos minutos.
1
stackoverflow.com/questions/920956/… Parece que estoy equivocado.
Bribles el
Ese enlace se refiere al envío de kill -9 al servidor . Estoy hablando de una sola consulta pid. ¿O son lo mismo?
2
@Bribles por favor agregue una advertencia a su publicación! SIGQUIT causará PROBLEMAS GRAVES si se intenta. Lo acabo de hacer y causó muchos problemas: ¡desearía poder retroceder en el tiempo y evitar presionar la tecla Enter!
ADTC
3

si tienes un Postgres reciente, puedes probarlo pg_terminate_backend.

Vitaly Kushner
fuente
1

Bribles es correcto en su declaración anterior ...

SinSHUTDOWN embargo, si intentas con el servidor, para mí:

Solo estoy tratando de eliminar las bases de datos / esquemas retirados, que todavía tienen una conexión persistente que no dejará pasar.

Entonces, para responder tu pregunta,

Si tengo una consulta de Postgres de larga duración ...

pg_cancel_backend no funciona ...

¿Qué tengo que hacer?

NO ESTÁ RELACIONADO con apagar el servidor de ninguna manera.

También he visto este comportamiento de pg_cancel_backend()no funcionar. Y quería compartir mi solución de trabajo.

No he visto un problema hasta ahora, con ningún tipo de "pérdida" de datos.

De nuevo, tampoco estoy tratando de matar Activeconsultas.

- Estoy conectado como USUARIO "A" con una sesión o PID de 777777.

- Y va a intentar forzar la desconexión de otra sesión del USUARIO "A" abierta como 123456789

- Que es una conexión inactiva, y es por eso que también busco idleen mis consultas a continuación.

SELECT * 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Intento 1

SELECT pg_cancel_backend(pid) 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Curiosamente, Result indica que la cancelación es VERDADERA, pero aún existe.

SELECT * 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Intento 2

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Y ahora no existe ...

SELECT * 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- NOTA: Traté de usar pid # ridículos para ayudar a evitar que la gente copie y pegue y arruine sus vidas.

- NOTA: Por defecto, postgres SOLO le permitirá eliminar procesos que se ejecutan bajo SU inicio de sesión en el USUARIO,

- NOTA: pero eso ya lo sabías.

Espero que esto ayude. =)

~ Jay

JayRizzo
fuente