Mittwoch Mai 14, 2008

PostgreSQL: Dead rows oder Nonremovable rows

Eines der leider designtechnisch weniger schönen Dinge bei der Postgres, sind die dead rows die zunächst übrig bleiben, wenn man SQL Update-Statements auf eine Tabelle los lässt. Bei so einem Update biegt die Postgres mehr oder weniger nur einen Pointer um  auf die neuen Daten und lässt die alten erstmal stehen. Normalerweise kümmert sich der Autovacuum um diese Zeilen und räumt sie von Zeit zu Zeit auf. Allerdings funktioniert das nicht, wenn man eine Transaktion am Laufen hat, die über Stunden oder gar Tage hinweg läuft und diese Tabelle darin beteiligt ist. Wenn man einen vacuum verbose oder vacuum full verbose auf diese Tabelle los lässt, dann sieht das z.B. so aus:

INFO:  "events": found 629702 removable, 2764070 nonremovable row versions in 440726 pages
DETAIL:  2734213 dead row versions cannot be removed yet.
        Nonremovable row versions range from 237 to 1160 bytes long.
        There were 1797800 unused item pointers.
        Total free space (including removable row versions) is 1808978584 bytes.
        175919 pages are or will become empty, including 0 at the end of the table.
        316400 pages containing 1792334416 free bytes are potential move destinations.
        CPU 97.17s/19.74u sec elapsed 269.83 sec.

Gar nicht gut. Wir schleppen da ein Haufen Müll mit uns rum und die Queries werden immer langsamer. Es gilt also diese Transkation zu finden. Eventl. kann man in der Prozessliste auf dem DB Rechner schon mal Prozesse mit idle in transaction ausmachen, die schon ewig laufen. Das sind potenzielle Kandidaten. Genauer sieht man es aber mit folgender Query:

SELECT * FROM pg_prepared_xacts;

Man sollte sich am Besten ein Skript schreiben, das diese Tabelle/View regelmäßig überwacht und meldet, wenn eine Query zu lange da drin hängt. Auch wenn man einen vacuum verbose einmal täglich über alle Tabellen laufen lässt (soweit das die DB-Größe und die Performance des Rechners hergeben), kann man den Output dieses Befehls parsen und darauf entsprechend reagieren.

Kommentare:

Senden Sie einen Kommentar:
  • HTML Syntax: Ausgeschaltet