archive_mode y archive_command
archive_mode habilita el archivado de WAL en el primario. archive_command envía cada segmento de WAL completado a almacenamiento duradero para PITR y seguridad de recuperación de standbys.
Receta
Directorio de archivo local para el laboratorio; patrón S3 o NFS para producción.
ALTER SYSTEM SET archive_mode = on;
ALTER SYSTEM SET archive_command =
'test ! -f /mnt/wal_archive/%f && cp %p /mnt/wal_archive/%f';
ALTER SYSTEM SET archive_timeout = '300s';
-- reiniciar PostgreSQL para habilitar archive_mode# Verificar que el archiver está en ejecución
psql -c "SELECT * FROM pg_stat_archiver;"
ls -l /mnt/wal_archive/ | tailCuándo usar esto: Cualquier clúster PostgreSQL autoalojado 18.4 que requiera PITR o retención de WAL sin pgBackRest.
Ejemplo de funcionamiento
Patrones de producción: Montaje NFS, rclone a S3 e integración con pgBackRest:
# archive_command a través de script (copia atómica)
# /usr/local/bin/archive_wal.sh
#!/usr/bin/env bash
set -euo pipefail
WAL_PATH="$1"
WAL_NAME="$2"
DEST="/mnt/wal_archive/${WAL_NAME}"
test ! -f "$DEST" && cp "$WAL_PATH" "$DEST"
aws s3 cp "$DEST" "s3://prod-pg-wal/${WAL_NAME}" --only-if-different-- Equivalentes de postgresql.conf
-- archive_mode = on
-- archive_command = '/usr/local/bin/archive_wal.sh %p %f'
-- wal_level = replica (mínimo)
SELECT archived_count, failed_count, last_failed_wal, last_failed_time
FROM pg_stat_archiver;# Forzar el cambio de segmento para probar la ruta de archivo
psql -c "SELECT pg_switch_wal();"
sleep 2
psql -c "SELECT last_archived_wal, last_archived_time FROM pg_stat_archiver;"Lo que esto demuestra:
archive_commanddebe devolver 0 como código de salida en caso de éxito; cualquier valor distinto de cero incrementafailed_count.test ! -fpreviene errores de sobrescritura en reintentos.archive_timeoutfuerza el cambio de WAL en sistemas de bajo tráfico para que los archivos lleguen a tiempo.
Análisis detallado
Placeholders de archive_command
| Token | Significado |
|---|---|
%p | Ruta completa al archivo WAL a archivar |
%f | Solo el nombre del archivo WAL (ej. 000000010000000000000001) |
Destinos comunes de envío
| Destino | Patrón |
|---|---|
| Local/NFS | cp %p /archive/%f |
| S3 | Script personalizado con AWS CLI |
| pgBackRest | archive_command = 'pgbackrest --stanza=prod archive-push %p' |
pg_receivewal | Demonio secundario (menos común ahora) |
archive_mode vs streaming
- La replicación por streaming envía WAL a los standbys en vivo.
- El archivado copia los segmentos completados a un almacenamiento duradero para PITR.
- Usa ambos: replicación para alta disponibilidad (HA), archivo para retroceder y cumplimiento normativo.
Errores comunes
- NFS lleno o montaje obsoleto -
failed_countaumenta; la cadena PITR se rompe. Solución: Monitorizar el disco ypg_stat_archiver. archive_commandno idempotente - El reintento falla si la sobrescritura no está permitida. Solución: Guardiatest ! -fo pgBackRest.archive_modesolo en standby - El standby no genera nuevo WAL para archivar para PITR de escrituras primarias. Solución: Archivar en el primario (o pgBackRest desde la política de copias de seguridad del standby).- Archivo lento bloquea el reciclaje de WAL - Presión de disco en el primario. Solución: Puesta en escena local rápida y luego carga asíncrona a S3.
- Olvidar reiniciar después de habilitar
archive_mode- Parece configurado pero inactivo. Solución: Reiniciar PostgreSQL; confirmarSHOW archive_mode;.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| pgBackRest archive-push | Repositorio de copias de seguridad unificado | Configuración mínima solo con shell |
| Snapshot EBS + WAL en S3 | Nativo de AWS | Necesidad de control granular de archive_command |
| Copia de seguridad gestionada en la nube | Copia de seguridad automatizada de RDS | Patroni DIY en VMs |
Preguntas frecuentes
¿wal_level para archivar?
replica o logical. minimal es insuficiente para la combinación de HA + archivo en producción.
¿Valor de archive_timeout?
Por defecto 300s. Reducir para un RPO más ajustado en bases de datos inactivas; aumentar reduce el número de archivos de archivo en sistemas ocupados.
¿Patroni y archive_command?
Establecer en los parámetros de Patroni postgresql.parameters o bootstrap.dcs.postgresql.parameters; reinicio gradual a través de Patroni.
¿Compresión de WAL en el archivo?
pgBackRest comprime. cp directo no lo hace; habilitar compresión del sistema de archivos o gzip en el script si es necesario.
¿Cómo rehidratar un segmento faltante?
Copiar de una réplica externa del bucket de archivo; la recuperación no puede omitir segmentos en la cadena.
Relacionado
- Conceptos básicos de PITR - flujo de recuperación
- Opciones de destino de recuperación - detener la reproducción
- pgBackRest - archive-push
- Mejores prácticas de copia de seguridad - verificar archivos
Versiones de la pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.