PostgreSQL-Fehler: canceling statement due to conflict with recovery

FATAL:  terminating connection due to conflict with recovery
DETAIL:  User query might have needed to see row versions that must be removed.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.

Dieser Fehler existiert nur auf Hot-Standby-Replikas. Die Replika muss WAL vom Primary anwenden, um synchron zu bleiben; Ihre Query brauchte Zeilenversionen, die das eingehende WAL (typischerweise Vacuum-Aufräumen) entfernt. Nach dem Anhalten des Replays für max_standby_streaming_delay wählte die Replika Replikation über Ihre Query und brach sie ab.

Was dieser Fehler bedeutet

Die Replika bedient Lesevorgänge, während sie kontinuierlich das WAL des Primary wiederholt — zwei Aufgaben, die in Konflikt geraten, wenn das Replay Daten ändern oder entfernen will, die eine laufende Query noch sehen kann. PostgreSQL verzögert das Replay zuerst, um die Query beenden zu lassen (bis zu max_standby_streaming_delay, Standard 30 s), und bricht dann die Query ab. Es ist ein bewusster Kompromiss zwischen Replika-Aktualität und Query-Überleben, und jeder Regler bewegt sich nur entlang dieser Achse.

Häufige Ursachen

So diagnostizieren Sie ihn

-- Auf der Replika: Konfliktzähler nach Typ und Datenbank
SELECT * FROM pg_stat_database_conflicts;

confl_snapshot ist der Vacuum-Aufräum-Fall; confl_lock deutet auf DDL auf dem Primary hin. Korrelieren Sie mit den Arbeitslasten, die zu diesen Zeiten auf der Replika laufen.

So beheben Sie ihn

Wählen Sie den Kompromiss explizit:

🔍 Weiterführend: VACUUM & Bloat — hot_standby_feedback lässt Replika-Queries das Aufräumen genau wie lange lokale Transaktionen zurückhalten.