Wir haben hier einen etwas älteren Postgres 13 Server bei dem das Monitoring angeschlagen hat, weil age(datfrozenxid) bei allen 25 Datenbanken dicht an autovacuum_freeze_max_age heranreicht.
Nach näherer Untersuchung habe ich festgestellt, dass die Tabellen die das auslösen alle in pg_catalog oder information_schema liegen. pg_stat_all_tables.last_autovacuum ist überall null für diese Tabellen.
autovacuum ist natürlich an und arbeitet auch problemlos auf den “normalen” Tabellen. Warum werden die Systemtabellen dabei nicht berücksichtigt? In den Datenbanken passiert nicht viel (ein paar hundert Transaktionen am Tag). DDL so gut wie gar nicht.
Wenn ich ein vacuum (oder vacuum freeze) manuell laufen lasse, dann wird datfrozenxid korrekt zurückgesetzt.
Warum werden die Tabellen in pg_catalog von autovacuum überhaupt nicht berücksichtigt? Liegt das daran, dass die autovacuum Einstellungen insgesamt zu konservativ sind?
Da man Einstellungen für Systemtabellen ja nicht ändern kann, sehe ich als einzige Lösung autovacuum global aggressiver zu konfigurieren.
Ich bilde mir ein, in neueren Postgres Versionen gab es da irgendeine Änderung, konnte aber auf die Schnelle in den Release Notes nichts finden.
Es könnte gut sein, daß hier alles in bester Ordnung ist.
Normalerweise läuft Autovacuum dann los, wenn 20% der Tabelle Totmaterial sind (autovacuum_vacuum_scale_factor und autovacuum_vacuum_threshold), seit PostgreSQL v13 wird es auch von INSERT ausgelöst (autovacuum_vacuum_insert_scale_factor und autovacuum_vacuum_insert_threshold).
Sind diese Schwellen bei den Katalogtabellen überschritten? Wenn ja, dann könnte es sein, daß es zu wenige Worker gibt (autovacuum_max_workers) oder die zu lange brauchen, sodaß die Tabellen nie drankommen.
Wenn die Schwellen nicht überschritten sind, ist alles normal, und autobvacuum würde loslaufen, wenn autovacuum_freeze_max_age erreicht ist. Dafür ist der Parameter ja da.
Ich behaupte, daß die Warnschwelle beim Monitoring-System falsch eingestellt ist. autovacuum_freeze_max_age ist zu niedrig; da geht es ja erst los. Wenn autovacuum_freeze_max_age auf seinem Defaultwert von 200 Millionen ist, würde ich die Warnschwelle auf 300 Millionen setzen. Bis dahin sollte die Sache erledigt sein.
Letztendlich haben wir die Abfrage aus diesem Thread auf der Mailing Liste verwendet. Und da dort percent_towards_emergency_autovac mit 95% ausgegeben wurde, haben wir uns das näher angesehen.
Deine Antwort bestätigt meine Einschätzung, dass alles in Ordnung ist, und autovacuum sich darum kümmern würde. Wir haben trotzdem mal ein vacuum freeze gemacht und werden das Monitoring anpassen.