XID-Wraparound
PostgreSQLs Transaktions-IDs sind 32 Bit breit und laufen über. Werden alte IDs nicht rechtzeitig entsorgt, verweigert die Datenbank irgendwann jede Schreiboperation.
Die Sichtbarkeit einer Zeile hängt davon ab, ob die Transaktion, die sie erzeugt hat, vor oder nach der eigenen liegt — doch bei einem zirkulären Zähler gibt es kein absolutes "davor": Die eine Hälfte des Zahlenraums gilt als Vergangenheit, die andere als Zukunft. Überschreitet eine alte Zeile die Zwei-Milliarden-Grenze, würde sie plötzlich aus der Zukunft zu kommen scheinen und unsichtbar werden — deshalb friert Autovacuum alte Zeilen ein und markiert sie als dauerhaft sichtbar. Geht es trotzdem zu weit, beginnt der Server zu warnen, und bei einer Million verbleibenden IDs stellt er Schreibvorgänge komplett ein und verlangt ein VACUUM im Single-User-Modus. Es ist eine der wenigen bekannten Ursachen für mehrtägige ungeplante Ausfälle bei ansonsten gut gepflegten Postgres-Installationen.