Toto je obecná odpověď Postgres, nikoli specifická pro heroku
(Jednoduchá a hloupá odpověď na tuto otázku může znít ... stačí restartovat postgresql. Za předpokladu, že to není žádoucí nebo není možné ...)
Najděte PID spuštěním tohoto sql:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(Dotaz může vyžadovat opravu v závislosti na verzi postgres - nakonec stačí vybrat * z pg_stat_activity). Pid najdete v prvním (levém) sloupci a první (horní) řádek bude pravděpodobně dotaz, který chcete ukončit. Předpokládám, že pid je 1234 níže.
Dotaz můžete zrušit prostřednictvím SQL (tj. bez přístupu k shellu), pokud je váš nebo máte přístup superuživatele:
select pg_cancel_backend(1234);
To je "přátelský" požadavek na zrušení dotazu 1234 a s trochou štěstí po chvíli zmizí. Nakonec je to efektivnější:
select pg_terminate_backend(1234);
Pokud máte přístup k shellu a oprávnění root nebo postgres, můžete to udělat také ze shellu. Chcete-li "zrušit" jeden může udělat:
kill -INT 1234
a "ukončit" jednoduše:
kill 1234
NE:
kill -9 1234
... to často povede k tomu, že celý postgres server spadne v plamenech, pak můžete také restartovat postgres. Postgres je docela robustní, takže data nebudou poškozena, ale v žádném případě bych nedoporučoval používat "kill -9" :-)
Dlouhotrvající „nečinnost v transakci“ často znamená, že transakce nebyla ukončena příkazem „commit“ nebo „rollback“, což znamená, že aplikace je chybná nebo není správně navržena pro práci s transakčními databázemi. Je třeba se vyhnout dlouhotrvajícímu „nečinnosti v transakci“, protože také může způsobit velké problémy s výkonem.