Dienstag, 10. April 2018

Postgresql Zombie Prozesse finden und beenden

Zombie gibt es überall, auch in Form von Queries in Datenbanken wie hier der Postgresql DB. Diese Zombies können auf unterschiedliche Weise entstehen, z.B. wenn eine Javaanwendung eine Query mach und in eine Excption gerät und dann die Ressourcen, d.h. hier die DB Query aufräumen. Die DB wartet dann ewig, dass die Java Applikation sich das Ergebnis der Query abholt, vergebens.

Mit der folgenden SQl Query kann man Zombies finden, hier Queries die älter als 30 Minuten sind.

select pid, age(query_start, clock_timestamp()), usename, query 
FROM pg_stat_activity 
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%'
AND query_start < NOW() - INTERVAL '30 minute'

Anschliessend kann man sie beenden:

select pg_terminate_backend(pid)

Einige nützliche Links

  1. https://gist.github.com/rgreenjr/3637525
  2. https://stackoverflow.com/questions/35319597/how-to-stop-kill-a-query-in-postgresql
  3. https://jobs.zalando.com/tech/blog/hack-to-terminate-tcp-conn-postgres/?gh_src=4n3gxh1