Write-Ahead Logging, checkpoints, fsync y recuperación tras fallos para entender cómo PostgreSQL hace durables los cambios antes de escribir páginas de datos.
Última actualización
Actualizada
Nivel
Profundización
WAL no es un backup ni una copia legible de las tablas. Es el registro ordenado que permite confirmar transacciones antes de escribir todas las páginas de datos, recuperarse de un crash, alimentar réplicas y reproducir cambios hasta un punto concreto.
el registro WAL que describe un cambio
→ debe quedar seguro antes
→ que la página de datos modificada pueda considerarse persistida
La aplicación modifica filas; PostgreSQL cambia páginas en memoria y genera registros WAL. En el commit, lo importante para durabilidad es que el WAL necesario alcance el nivel de persistencia configurado. Las páginas heap e índice pueden escribirse después.
Escribir todas las páginas modificadas en cada commit sería costoso y produciría muchas escrituras aleatorias. WAL convierte el camino crítico en una secuencia principalmente append-only:
Texto
UPDATE
→ cambia buffers
→ genera WAL
→ flush del WAL
→ COMMIT responde
→ páginas sucias se escriben más tarde
Si el servidor cae, el recovery vuelve a aplicar registros WAL desde el último checkpoint para llevar los archivos a un estado consistente.
Cada posición del WAL tiene un Log Sequence Number. Sirve para expresar:
Hasta dónde se generó WAL.
Hasta dónde se escribió o hizo flush.
Qué posición recibió o reprodujo una réplica.
Qué punto corresponde a un backup o restore.
El WAL se almacena en archivos segmentados dentro de pg_wal. No deben eliminarse manualmente: su retención depende de recovery, archiving, replicas y replication slots.
1. La transacción modifica buffers.
2. PostgreSQL genera records WAL.
3. Se escribe el commit record.
4. WAL se flush según synchronous_commit y fsync.
5. El cliente recibe confirmación.
6. Checkpointer/background writer escriben data pages después.
Una respuesta exitosa significa que se cumplieron las garantías configuradas, no que cada archivo de tabla ya fue escrito.
Un checkpoint establece un punto desde el cual comenzar recovery y coordina la escritura de páginas sucias anteriores.
Trade-off:
Texto
checkpoints frecuentes
→ recovery potencialmente corto
→ más picos de I/O y full-page images
checkpoints espaciados
→ escritura más distribuida
→ más WAL y recovery potencialmente largo
Parámetros como checkpoint_timeout, max_wal_size y checkpoint_completion_target interactúan. No se ajustan aislados: observa logs, volumen de WAL, latencia y storage.
La primera modificación de una página después de un checkpoint puede incluir una imagen completa en WAL. Esto protege frente a torn pages, donde una escritura física incompleta deja una página parcialmente actualizada.
Consecuencias:
Más WAL justo después del checkpoint.
Checkpoints demasiado frecuentes aumentan el volumen.
Desactivar full_page_writes sin una garantía equivalente del storage es peligroso.
fsync=on pide al sistema operativo que los datos críticos lleguen a almacenamiento durable.
Desactivarlo puede mejorar benchmarks, pero tras crash puede producir corrupción, no solo pérdida de las últimas transacciones. Solo tiene sentido en clusters desechables y reconstruibles.
Controla cuándo una transacción considera suficiente el WAL para responder.
Con valores que permiten commit asíncrono, el cliente puede recibir éxito antes de que el commit record esté durable localmente. Un crash inmediato podría perder transacciones recientes aunque la base permanezca consistente.
Esto puede servir para eventos reconstruibles o telemetría, no para datos cuya confirmación debe ser fuerte. Puede configurarse por transacción:
SQL
SETLOCAL synchronous_commit =off;
La decisión es de negocio y operación, no un “tuning gratis”.
WAL depende de una base física coherente. Sin base backup o backup lógico adecuado, una colección de segmentos no basta para reconstruir arbitrariamente el cluster.
Además, un DROP TABLE confirmado también queda registrado: recovery normal reproduce la eliminación. Para volver a antes del error necesitas restore/PITR, no “leer el WAL y deshacer”.