sql >> Base de Datos >  >> RDS >> PostgreSQL

wal_keep_segments ¿por qué mínimo, no máximo?

Para responder a su pregunta directamente, ¿por qué mínimo y por qué no máximo? Porque los nuevos segmentos WAL pueden crecer más rápido que RemoveOldXlogFiles(_logSegNo, recptr) función puede eliminar los antiguos.

Además, la fórmula para calcular el número probable de segmentos WAL en los documentos es incorrecta. Siempre tengo algunos WAL más que checkpoint_segments + wal_keep_segments + 1 Una fórmula mucho más precisa es esta:wal_keep_segments + 2 * checkpoint_segments + 1

Aquí hay una publicación antigua, pero realmente buena:http://www.postgresql.org/message-id/[email protected]

Si realiza inserciones masivas, sus segmentos WAL crecerán más rápido de lo que pueden eliminarse. Esto me atrapó esta semana. Esperaba que pg_xlog mantuviera un tamaño relativamente constante. Hubo un gran proceso que se ejecutó por la noche y cuando llegué al trabajo a la mañana siguiente, mi instancia de Postgres se bloqueó porque el volumen que monté para colocar esos WAL estaba completamente lleno. Postgres llenó el volumen, trató de escribir aún más WAL, no pudo y murió abruptamente. Por suerte, ejecutamos réplicas detrás de pgpool2.

Si tienes una mente curiosa, te animo a navegar por el código fuente de postgres. Es gigante y está en C, pero los comentarios del código realmente ayudan. Este archivo en particular es esclarecedor, ya que explica cómo funcionan los puntos de control y cómo se eliminan los segmentos WAL antiguos:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c