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:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(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:
select pg_cancel_backend(1234);
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:
select pg_terminate_backend(1234);
Si tiene acceso al shell y permisos de root o postgres, también puede hacerlo desde el shell. Para "cancelar" uno puede hacer:
kill -INT 1234
y para "terminar", simplemente:
kill 1234
NO HAGA:
kill -9 1234
... 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.