Vacuum & bloatadvancedPro runbook

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.

ProCaptured evidence where the run produced it

Full runbook for this incident

The scenario above is free. What Pro unlocks is the fix: how to identify measure freeze debt before autovacuum forces your hand, the exact SQL to trace it, PostgreSQL 18 output for the steps we captured, the resolution path, and how to stop it recurring.
  • 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.

Compare plans

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.

Open in the interactive map →
ShareLinkedInX

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.

FollowSubstackLinkedInnew errors · lab notes · hiring loops