Frage PostgreSQL-Fehler: Abbruch der Anweisung aufgrund eines Konflikts mit der Wiederherstellung


Beim Ausführen einer Abfrage für eine PostgreSQL-Datenbank im Standby-Modus wird der folgende Fehler angezeigt. Die Abfrage, die den Fehler verursacht, funktioniert für 1 Monat gut, aber wenn Sie für mehr als 1 Monat 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


76
2018-01-29 21:15


Ursprung


Antworten:


Das Ausführen von Abfragen auf dem Hot-Standby-Server ist etwas schwierig - es kann fehlschlagen, da während der Abfrage einige benötigte Zeilen möglicherweise aktualisiert oder auf der Primärseite gelöscht werden. Da eine Primärdatenbank nicht weiß, dass eine Abfrage auf Sekundärseite gestartet wird, glaubt sie, dass sie alte Versionen ihrer Zeilen bereinigen (vakuumieren) kann. Dann muss secondary diese Bereinigung wiederholen und alle Abfragen zwangsweise abbrechen, die diese Zeilen verwenden können.

Längere Abfragen werden häufiger abgebrochen.

Sie können dies umgehen, indem Sie eine wiederholbare Lesetransaktion für die Primärdatenbank starten, die eine Dummy-Abfrage ausführt und dann inaktiv bleibt, während eine echte Abfrage auf der Sekundärdatenbank ausgeführt wird. Seine Anwesenheit verhindert das Staubsaugen alter Reihenversionen auf der Primärseite.

Weitere Informationen zu diesem Thema und weitere Problemumgehungen finden Sie in Hot Standby - Umgang mit Query-Konflikten Abschnitt in der Dokumentation.


48
2018-01-29 23:51



Es ist nicht notwendig, untätige Transaktionen auf dem Master zu starten. In postgresql-9.1 die Der direkteste Weg zur Lösung dieses Problems ist das Einstellen

hot_standby_feedback = on

Dadurch wird der Master auf lange laufende Abfragen aufmerksam gemacht. Von dem Dokumente:

Die erste Option besteht darin, den Parameter hot_standby_feedback zu setzen, der verhindert   VACUUM durch das Entfernen von vor kurzem toten Zeilen und somit keine Bereinigungskonflikte auftreten.

Warum ist das nicht die Standardeinstellung? Dieser Parameter wurde nach dem Anfang hinzugefügt Implementierung und es ist die einzige Möglichkeit, dass eine Standby einen Master beeinflussen kann.


56
2018-02-10 19:34



Wie angegeben Hier Über hot_standby_feedback = on :

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

Und Hier:

Mit welcher Einstellung von max_standby_streaming_delay? ich würde lieber   Standardwert ist -1 als Standard hot_standby_feedback on. So was   Sie tun in der Standby-Funktion nur die Standby-Funktion


Also fügte ich hinzu

max_standby_streaming_delay = -1

Und nicht mehr pg_dump Fehler für uns noch Master Bloat :)


37
2017-10-22 13:58



Keine Notwendigkeit zu berühren hot_standby_feedback. Wie andere bereits erwähnt haben, setzen Sie es auf on kann Master aufblähen. Stellen Sie sich vor, Sie öffnen eine Transaktion auf einem Slave und schließen sie nicht.

Setze stattdessen max_standby_archive_delay und max_standby_streaming_delay zu einem 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 Abfragen an Slaves mit einer Dauer von weniger als 900 Sekunden nicht abgebrochen. Wenn Ihre Arbeitslast längere Abfragen erfordert, legen Sie einfach diese Optionen auf einen höheren Wert fest.


15
2017-12-05 19:33



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 wieder aufzunehmen:

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

4
2017-10-05 08:56