it-swarm.com.de

PostgreSQL-FEHLER: Abbruch der Anweisung aufgrund eines Konflikts mit der Wiederherstellung

Beim Ausführen einer Abfrage auf einer PostgreSQL-Datenbank im Standby-Modus wird die folgende Fehlermeldung angezeigt. Die Abfrage, die den Fehler verursacht, funktioniert 1 Monat lang einwandfrei. Wenn Sie jedoch mehr als 1 Monat lang abfragen, tritt ein Fehler auf.

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

Irgendwelche Vorschläge zur Lösung? Vielen Dank

106
AnApprentice

Das Ausführen von Abfragen auf einem Hot-Standby-Server ist etwas kompliziert - dies kann fehlschlagen, da während der Abfrage einige erforderliche Zeilen möglicherweise auf dem primären Server aktualisiert oder gelöscht werden. Da ein Primärserver nicht weiß, dass eine Abfrage auf einem Sekundärserver gestartet wurde, glaubt er, alte Versionen seiner Zeilen bereinigen (vakuumieren) zu können. Dann muss secondary diese Bereinigung wiederholen und alle Abfragen abbrechen, die diese Zeilen verwenden können.

Längere Abfragen werden häufiger abgebrochen.

Sie können dies umgehen, indem Sie eine wiederholbare Lesetransaktion auf dem primären Server starten, die eine Dummy-Abfrage ausführt und dann im Leerlauf ist, während eine echte Abfrage auf dem sekundären Server ausgeführt wird. Sein Vorhandensein verhindert das Staubsaugen alter Reihenversionen auf der Primärseite.

Weitere Informationen zu diesem Thema und andere Problemumgehungen finden Sie im Abschnitt Hot Standby - Umgang mit Abfragekonflikten in der Dokumentation.

72
Tometzky

Auf dem Master müssen keine inaktiven Transaktionen gestartet werden. In postgresql-9.1 besteht die direkteste Möglichkeit zur Lösung dieses Problems in der Einstellung

hot_standby_feedback = on

Dies macht den Master auf lange laufende Abfragen aufmerksam. Aus dem docs :

Die erste Möglichkeit besteht darin, den Parameter hot_standby_feedback festzulegen, der verhindert, dass VACUUM kürzlich tote Zeilen entfernt, sodass keine Bereinigungskonflikte auftreten.

Warum ist dies nicht die Standardeinstellung? Dieser Parameter wurde nach der ersten Implementierung hinzugefügt und ist die einzige Möglichkeit, wie ein Standby einen Master beeinflussen kann.

71
eradman

Sie müssen nicht hot_standby_feedback Berühren. Wie andere bereits erwähnt haben, kann das Setzen auf on den Master aufblähen lassen. Stellen Sie sich vor, Sie öffnen eine Transaktion auf einem Slave und schließen sie nicht.

Setzen Sie stattdessen max_standby_archive_delay Und max_standby_streaming_delay Auf einen vernünftigen Wert:

# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s

Auf diese Weise werden Anfragen an Slaves mit einer Dauer von weniger als 900 Sekunden nicht abgebrochen. Wenn Ihre Arbeitslast längere Abfragen erfordert, setzen Sie diese Optionen einfach auf einen höheren Wert.

62
Max Malysh

Wie gesagt hier über hot_standby_feedback = on:

Nun, der Nachteil ist, dass der Standby-Modus den Master aufblähen kann, was auch für einige Leute überraschend sein könnte

Und hier :

Mit welcher Einstellung von max_standby_streaming_delay? Ich würde das eher auf -1 als auf hot_standby_feedback setzen. Auf diese Weise wirkt sich das, was Sie im Standby-Modus tun, nur auf den Standby-Modus aus


Also habe ich hinzugefügt

max_standby_streaming_delay = -1

Und nicht mehr pg_dump Fehler für uns, noch Master aufblähen :)

Überprüfen Sie für eine AWS RDS-Instanz http://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html

47
Gilles Quenot

Die Tabellendaten auf dem Hot-Standby-Slave-Server werden geändert, während eine lange laufende Abfrage ausgeführt wird. Eine Lösung (PostgreSQL 9.1+), um sicherzustellen, dass die Tabellendaten nicht geändert werden, besteht darin, die Replikation anzuhalten und nach der Abfrage fortzusetzen:

select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume
9
David Jaspers