XID wraparound
PostgreSQL transaction IDs are 32 bits and wrap around. Fail to retire the old ones in time and the database stops accepting writes entirely.
Row visibility depends on whether the transaction that created a row came before or after yours, but a circular counter has no absolute before: half the space counts as the past and half as the future. If an old row crosses the two-billion boundary it would suddenly appear to come from the future and become invisible — which is why autovacuum freezes old rows, marking them permanently visible. Let it slip far enough and the server starts warning; with a million IDs left it shuts down writes and demands a vacuum in single-user mode. It is one of the few known causes of multi-day unplanned downtime in otherwise well-run Postgres installations.