sql >> Base de Datos >  >> RDS >> PostgreSQL

Terminar consulta colgada (inactiva en transacción)

Esta es una respuesta general de Postgres y no específica de heroku

(La respuesta simple y estúpida a esta pregunta puede ser... simplemente reinicie postgresql. Asumiendo que no es deseable o no es una opción...)

Encuentre el PID ejecutando este sql:

SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;

(La consulta puede necesitar reparación dependiendo de la versión de postgres; eventualmente, simplemente seleccione * de pg_stat_activity). Encontrará el pid en la primera columna (izquierda), y es probable que la primera fila (superior) sea la consulta que desea finalizar. Asumiré que el pid es 1234 a continuación.

Puede cancelar una consulta a través de SQL (es decir, sin acceso de shell) siempre que sea suya o tenga acceso de superusuario:

select pg_cancel_backend(1234);

Esa es una solicitud "amistosa" para cancelar la consulta 1234 y, con un poco de suerte, desaparecerá después de un tiempo. Eventualmente, esto es más eficiente:

select pg_terminate_backend(1234);

Si tiene acceso de shell y permisos de root o postgres, también puede hacerlo desde el shell. Para "cancelar" se puede hacer:

kill -INT 1234

y para "terminar", simplemente:

kill 1234

NO:

kill -9 1234

... eso a menudo dará como resultado que todo el servidor de postgres se incendie, entonces también puede reiniciar postgres. Postgres es bastante robusto, por lo que los datos no se dañarán, pero recomendaría no usar "kill -9" en cualquier caso :-)

Una "transacción inactiva" prolongada a menudo significa que la transacción no finalizó con una "confirmación" o una "reversión", lo que significa que la aplicación tiene errores o no está diseñada correctamente para funcionar con bases de datos transaccionales. Se debe evitar la "inactividad en la transacción" de larga duración, ya que también puede causar problemas importantes de rendimiento.