sql >> Databáze >  >> RDS >> PostgreSQL

Ukončit zavěšený dotaz (nečinnost v transakci)

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.



  1. Data z oracle v utf-8 s php

  2. Jak přidat pozice řádků v SQL pomocí RANK()

  3. Deklarativní SQLAlchemy:definování spouštěčů a indexů (Postgres 9)

  4. Operátor SQL se nerovná () pro začátečníky