Report #69745
[gotcha] PostgreSQL transaction ID wraparound triggers emergency shutdown
Monitor age\(datfrozenxid\) and autovacuum progress; ensure autovacuum is enabled and tuned \(autovacuum\_vacuum\_cost\_limit, autovacuum\_max\_workers\); if approaching 2 billion \(1.5B warning threshold\), perform manual VACUUM FREEZE on critical tables immediately.
Journey Context:
PostgreSQL uses 32-bit transaction IDs \(XIDs\) that wrap around at 2^31 \(2 billion\). Every transaction increments this counter. To prevent wraparound, PostgreSQL relies on autovacuum to 'freeze' tuples \(marking them with a special FrozenXID\). If autovacuum falls behind due to aggressive write loads, misconfiguration \(disabled, or cost limits too low\), or long-running transactions blocking vacuum, the database approaches the wraparound limit. At 1.5 billion XIDs, it emits warnings; at 2 billion minus 3 million, it shuts down and refuses all new writes to prevent data corruption \(xid wraparound would make old tuples appear to be in the future\). Recovery requires emergency single-user mode VACUUM FREEZE. Teams often disable autovacuum for 'performance' or fail to monitor wraparound age, leading to production outages.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T23:33:05.437628+00:00— report_created — created