PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

wal_keep_segments warum Minimum, nicht Maximum?

Um Ihre Frage direkt zu beantworten, warum Minimum und warum nicht Maximum? Weil die neuen WAL-Segmente schneller wachsen können als die RemoveOldXlogFiles(_logSegNo, recptr) Funktion kann die alten löschen.

Außerdem ist die Formel zur Berechnung der wahrscheinlichen Anzahl von WAL-Segmenten in den Dokumenten falsch. Ich habe immer ein paar WALs mehr als checkpoint_segments + wal_keep_segments + 1 Eine viel genauere Formel ist diese:wal_keep_segments + 2 * checkpoint_segments + 1

Hier gibt es einen alten, aber wirklich guten Beitrag dazu:http://www.postgresql.org/message-id/[email protected]

Wenn Sie massive Einsätze machen, werden Ihre WAL-Segmente schneller wachsen, als sie entfernt werden können. Das hat mich erst diese Woche erwischt. Ich habe erwartet, dass pg_xlog eine relativ konstante Größe beibehält. Nachts wurde ein großer Prozess ausgeführt, und als ich am nächsten Morgen zur Arbeit kam, stürzte meine Postgres-Instanz ab, weil das Volume, auf dem ich diese WALs abgelegt hatte, vollständig voll war. Postgres füllte den Band, versuchte, noch mehr WALs zu schreiben, konnte es nicht und starb abrupt. Glücklicherweise betreiben wir Replikate hinter pgpool2.

Wenn Sie neugierig sind, empfehle ich Ihnen, den Postgres-Quellcode zu durchsuchen. Es ist riesig und in C, aber die Codekommentare helfen wirklich. Diese Datei ist besonders aufschlussreich, da sie in die Grundlagen der Funktionsweise von Checkpoints und des Entfernens alter WAL-Segmente eingeht:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c