Ich habe "PostgreSQL-Replikation von Hans-Jürgen Schönig" gelesen, und ein paar Stellen, dass es Best Practice ist, eine Archiv-WAL-Datei während der Ausführung des Befehls archive_content nicht zu überschreiben - kann jemand bitte erweitern die Gründe dafür? und wenn das folgende Szenario für das Überschreiben von WAL gültig ist?Postgresql WAL archive_command Datei vergleichen
Ich habe ein Skript geschrieben, das die folgende hohe Logik für einen einzelnen WAL Archivierungsvorgang wird ausgeführt:
if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067)
exit with status 0
else
if (copy 00000001000000F700000067 to /archive/00000001000000F700000067 is successful)
if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067)
exit with status 0
else
exit with status non-zero
else
exit with status non-zero
Kurz gesagt, dieser Ansatz hofft gegen zumindest das Szenario zu verteidigen, wo die ursprüngliche WAL-Datei falsch archiviert - die Kopie hat einen gültigen Dateinamen, ist aber beschädigt (z. B. aufgrund eines Hardwarefehlers). Mein Verständnis des Prozesses WAL Archivierung in diesem Fall:
- Die archive_command kehrt nicht Null Exit-Status während des Byte-für-bye Vergleichs nach dem Kopiervorgang (lassen Sie uns den Kopiervorgang annehmen, hat einen falschen Erfolgsantwort)
- Gemäß der Dokumentation, auf nicht-Null exit_status WAL Archivierung auf unbestimmte Zeit erneut versucht werden soll - ein zweiter Versuch von WAL-Archivierung
- die archive_command wird erkennen, auftreten soll, dass das bestehende Archiv WAL nicht den aktuellen WAL Byte überein -wise
- Der Kopiervorgang wird ein zweites Mal stattfinden, hoffentlich vorbei die beschädigte Datei
- exit_status 0 im Falle eines Erfolgs Vergleich der Dateien zu schreiben, sonst wird dieser Prozess
Es gibt einen sehr geringen Aufwand mit dem Vergleich beteiligt wiederholt werden (was ich zu md5 Prüfung aktualisieren kann), kann jemand irgendwelche Probleme sehen, die aus einem solchen Ansatz entstehen können? oder weiter empfehlen?
Danke
Ah natürlich, genial danke. In meinem Fall ist das ein lokaler Speicher auf einem einzigen postgresql-Server. – abstractx1