Estoy usando Heroku con la opción Crane Postgres y estaba ejecutando una consulta en la base de datos desde mi máquina local cuando mi máquina local falló. Si corro
select * from pg_stat_activity
una de las entradas tiene
<IDLE> in transaction
en la columna current_query_text.
Como resultado, no puedo eliminar la tabla en la que estaba escribiendo la consulta que terminó. Intenté usar pg_cancel_backend (N) y devuelve True, pero parece que no sucede nada.
¿Cómo puedo finalizar este proceso para poder dejar la mesa?
postgresql
heroku
Alan
fuente
fuente
Respuestas:
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. Suponiendo que eso no sea deseable o no sea una opción ...)
Encuentre el PID ejecutando este sql:
(Es posible que sea necesario corregir la consulta dependiendo de la versión de postgres; eventualmente, solo 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 le gustaría terminar. 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:
Esa es una solicitud "amigable" para cancelar la consulta 1234 y, con algo de suerte, desaparecerá después de un tiempo. Eventualmente, esto es más eficiente:
Si tiene acceso al shell y permisos de root o postgres, también puede hacerlo desde el shell. Para "cancelar" uno puede hacer:
y para "terminar", simplemente:
NO HAGA:
... que a menudo resultará en 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 :-)
Un "inactivo en la transacción" de larga duración a menudo significa que la transacción no se terminó con un "compromiso" o un "retroceso", lo que significa que la aplicación tiene errores o no está correctamente diseñada para funcionar con bases de datos transaccionales. Debe evitarse el "inactivo en la transacción" de larga duración, ya que también puede causar importantes problemas de rendimiento.
fuente
select version()
. ¿Recibe algún mensaje de error al usarlopg_cancel_backend
?Prueba esto:
Puedes encontrar más sobre esto aquí . Esta debería ser una solución 'más limpia' de este problema que matar proceso por sistema.
fuente
Puede instalar el
heroku-pg-extras
complemento y ejecutar el siguiente comando para obtener el PID:Entonces solo haz:
NOTA : la
--force
opción se puede usar para emitir pg_terminate_backend que descarta toda la conexión para esa consulta.Si
heroku pg:locks
no incluye nada, inténteloheroku pg:ps
.Para obtener más información, consulte:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
fuente
Podemos utilizar lo siguiente para lograrlo en una sola consulta:
fuente
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';