Measure freeze debt before autovacuum forces your hand
A table with autovacuum_enabled = false was still vacuumed within 15 seconds of crossing its freeze ceiling, you cannot opt out. But that forced pass froze nothing and the age stayed at 120,003, because vacuum_freeze_min_age was 50,000,000. Setting it to 0 dropped the age to 0.
Problem
What you're actually looking at
The symptom as it shows up on a real server.
Freeze debt is the one form of maintenance backlog with a hard deadline, and it is governed by two settings that are easy to confuse. One decides when PostgreSQL stops asking and vacuums the table regardless of your preferences. The other decides how much of the debt that vacuum actually clears. Tune only the first and you get tables that are vacuumed over and over while their age never falls, the work happens, the debt does not move, and the deadline keeps approaching.
Meridian sees age(relfrozenxid) rising on a large table. Autovacuum is visibly running against it, so the alert is dismissed as noise. The age does not fall.
Simple terms
Every row carries the id of the transaction that wrote it, and those ids run out eventually, so PostgreSQL periodically rewrites old rows as "frozen", meaning permanently visible and no longer counted against the limit. Two dials control this. The first is a ceiling: cross it and PostgreSQL vacuums the table whether you wanted it to or not, because the alternative is the database shutting down to protect itself. The second is a minimum age a row must reach before it is worth freezing. If that minimum is larger than your table's whole history, the forced vacuum runs, freezes nothing, and the number you are watching does not move.
Full runbook for this incident
- The full identify checklist, the exact signals that tell you it's this incident
- Every diagnostic query; lab output is attached only to the steps we actually captured
- The resolution path and the pitfalls that make it worse
- Mitigation steps to stop it recurring, plus a verify-you're-done query
Card required. Cancel before day 7 and you are not charged.
More in this category
Other Vacuum & bloat runbooks
Neighbouring incidents that share the same diagnostic surface.
Connected
How this connects to the rest of the library
A live view of this page's real cross-references, what explains it, what fixes it, what to tune, and where to go next. Every link is an authored relationship, not a guess.
Fixes these errors
Need the full procedure?
Pro runbooks finish the incident path
Free runbooks teach the shape. Pro opens the full step transcript, edge cases, and prevention depth.