Ich verwalte eine große Datenbank (einige Hundert Konzerte) mit Tabellen mit verschiedenen Rollen, von denen einige Millionen Datensätze enthalten. Einige Tabellen empfangen nur eine große Anzahl von Einfügungen und Löschungen, andere wenige Einfügungen und eine große Anzahl von Aktualisierungen.
Die Datenbank läuft unter PostgreSQL 8.4 auf einem Debian 6.0 amd64-System mit 16 Gigabyte RAM.
Die Frage ist manchmal Autovakuum-Prozess auf einem Tisch, dauert sehr lange (Tage) zu vervollständigen. Ich möchte ungefähr sagen können, wie viel Zeit ein bestimmter Vakuumbefehl in Anspruch nimmt, um entscheiden zu können, ob er abgebrochen werden soll oder nicht. Auch wenn es eine Fortschrittsanzeige für Vakuumoperationen nach dem Tod gäbe, wäre dies sehr hilfreich.
Bearbeiten:
Ich suche keine kugelsichere Lösung. Lediglich ein grober Hinweis auf die Anzahl der toten Tupel oder der erforderlichen E / A-Bytes reicht aus, um eine Entscheidung zu treffen. Es ist wirklich ärgerlich, keine Ahnung zu haben, wann VACUUM
es zu Ende geht.
Ich habe gesehen, dass pg_catalog.pg_stat_all_tables
eine Spalte für die Anzahl der toten Tupel hat. So ist es möglich, eine Schätzung zu haben, auch wenn dies bedeutet, dass man ANALYZE
vorher an den Tisch muss. Andererseits autovacuum_vacuum_threshold
und autovacuum_vacuum_scale_factor
Einstellungen alleine beweisen, dass postgres selbst etwas über das Ausmaß der Änderungen auf den Tischen weiß und es wahrscheinlich auch in die Hände des DBA legt.
Ich bin nicht sicher, welche Abfrage ausgeführt werden soll, da ich beim Ausführen VACUUM VERBOSE
sehe, dass nicht nur Tabellen, sondern auch Indizes für sie verarbeitet werden.
quelle
VACUUM FULL
9.0+ funktionieren, da die Tabelle komplett neu geschrieben wird. Es sollte auch normal funktionierenVACUUM
, aber ich habe es noch nicht getestet. Dennautovacuum
es würde funktionieren, wenn Sie in der Lage wären, den Autovakuum-Worker-Prozess an einem bestimmten Tisch abzufangen, aber ich weiß nicht, wie Sie dies erreichen können.Dies ist sehr schwer zu bestimmen. Sie können das automatische Staubsaugen so einstellen , dass es aggressiver oder milder ist. Bei der Einstellung "Mild" und einem Rückstand und einer zu hohen E / A-Grundlast kann es jedoch vorkommen, dass der Prozess niemals einen ordnungsgemäßen Staubsaugerzustand erreicht - dann läuft der Prozess und läuft und läuft. Darüber hinaus haben spätere PostreSQL-Editionen deutlich verbesserte Autovakuum-Funktionen. Dies allein kann ausreichen, um auf eine dieser Editionen umzusteigen (vorzugsweise 9.2 als die aktuellste).
Der Fortschrittsbalken hört sich gut an, aber ich stelle mir vor, dass es nicht so einfach ist, ihn sinnvoll zu implementieren. Da Sie Ihre Tische ständig belasten, ist es durchaus möglich, dass der Fortschritt offensichtlich rückläufig ist (ich meine, dass die Anzahl der toten Reihen / der Prozentsatz zunimmt, anstatt abzunehmen). Welche Schlussfolgerung ziehen Sie dann?
quelle
VACUUM ANALYZE VERBOSE
Gibt zumindest eine Aktivität auf der Konsole aus, wenn dies der Fall ist. Es ist besser, als nur auf eine statische Eingabeaufforderung zu starren und sich zu fragen, ob etwas stundenlang feststeckt.VACUUM
, nicht für Autovakuum, aber es ist immer noch etwas.In unserer Produktion hatte einer der größten Tische dieses Protokoll:
Dies ist mit Abstand der schlechteste Ressourcenverbrauch, alle anderen Tabellen haben weniger als 2 s gedauert.
Um diese Arten von Protokollen anzuzeigen, sollten Sie Folgendes ausführen:
(für 5 ms), laden Sie die Konfigurationsdatei neu.
quelle
Ich fand diesen Beitrag und diesen Beitrag hilfreich, aber wie andere erwähnt haben, kann es schwierig sein, den Gesamtfortschritt des Vakuums zu berechnen, da der Prozess einige separate Vorgänge umfasst.
Ich verwende diese Abfrage, um den Fortschritt des Scannens des Vakuumtisches zu überwachen. Dies scheint der Hauptteil der Arbeit zu sein:
Dies schließt jedoch nicht das anschließende Index-Scannen ein und kann ebenso lange dauern, wenn nicht länger, wenn Sie über eine Tonne Indizes verfügen. Leider kann ich das Index-Scannen / -Staubsaugen nicht überwachen.
quelle