IT-Admin.tech

Paso a paso: realizar Point-in-Time Recovery (PITR) de PostgreSQL en bases de datos productivas

Schematische Visualisierung eines PostgreSQL PITR‑Workflows mit Base Backup, WAL‑Segmenten auf einer Zeitachse und...
Grafische Darstellung: Base Backup + WAL‑Archive ermöglichen eine Point‑in‑Time‑Recovery. Zeitachse zeigt WAL‑Segmente, Timeline‑Markers und Recovery‑Host mit PGDATA.

PostgreSQL Point-in-Time-Recovery (PITR) es la capacidad de revertir una instancia física de base de datos a un instante definido en el pasado. Para los operadores de instalaciones en producción, PITR suele ser a menudo la única manera de deshacer con precisión transacciones erróneas, eliminaciones accidentales o daños por ransomware. Esta guía amplía los fundamentos con pasos de verificación probados, cambios de timeline, comprobaciones de integridad, ejemplos de automatización y pasos concretos de resolución de problemas, para que pueda actuar con seguridad en emergencias reales.

Kurzüberblick: Was ist PITR und wie funktioniert es?

PITR combina dos componentes físicos de PostgreSQL: Base Backups (instantáneas consistentes del directorio de datos PGDATA) y Write‑Ahead‑Logs (WAL), que documentan cada cambio de datos de forma secuencial. Para una recuperación exitosa necesita un Base Backup y todos los segmentos WAL hasta el punto deseado. Si falta un segmento WAL, la recuperación hasta ese punto no será posible y deberá recurrir a un instante anterior o recuperar los archivos faltantes desde repositorios secundarios.

Wann ist PITR die richtige Methode?

PITR es el método indicado cuando desea deshacer cambios hasta un momento exacto; no es la herramienta adecuada si necesita reconstruir tablas individuales de forma selectiva (para esos casos son más apropiados backups lógicos como pg_dump o Logical Replication). Casos típicos de uso:

  • Actualizaciones masivas erróneas / borrado involuntario de grandes volúmenes de datos.
  • Análisis forense: reconstruir el estado de la BD en un sello temporal determinado.
  • Corrupción parcial de datos, cuando solo está afectado un rango temporal estrecho.
  • Escenarios de ransomware, cuando desea restaurar un estado limpio anterior a la infección.

Grundvoraussetzungen und Architektur

Antes de un PITR deben cumplirse de forma fiable estos requisitos:

  • Aktives WAL‑Archiving (archive_mode = on) und ein getestetes archive_command.
  • Copias base regulares y consistentes (p. ej. con pg_basebackup o snapshots de almacenamiento consistentes).
  • Un destino de archivo fiable con redundancia (ruta de archivo local, NFS u objeto‑store como S3) y permisos de acceso protegidos.
  • Documentación: asignación de marcas temporales del Base Backup, rangos WAL y IDs de Timeline.

Compruebe la configuración rápidamente con psql:

Shell
psql -At -c "SHOW archive_mode; SHOW wal_level; SHOW archive_command; SHOW archive_timeout;"

Wichtige Parameter kurz erklärt

En una frase:

  • archive_mode: Activa la archivación de WAL.
  • archive_command: Comando/Script de shell que transmite los segmentos WAL al archivo.
  • wal_level: Debe ser al menos replica para que los datos WAL completos estén disponibles para PITR.
  • archive_timeout: Fuerza el archivado periódico incluso con baja actividad.

PostgreSQL Point-in-Time-Recovery (PITR): Timeline, WAL‑Retention und Betrieb

En entornos productivos surgen dos aspectos operativos especialmente críticos: cambios de timeline y retención de WAL. Las IDs de Timeline aparecen en promociones o failovers; los nombres de archivo WAL y las etiquetas de backup contienen esta información. Si se ha producido un salto de Timeline, deben estar disponibles los WAL de la Timeline correcta; de lo contrario, el replay se detendrá.

Shell
# Timeline-Infos aus dem Base Backup / control
psql -c "SELECT timeline_id, last_wal_replay_lsn() FROM pg_control_checkpoint();"
# Timeline-History Dateien im Archiv prüfen
ls -1 /srv/pg_wal_archive/*.history

Planifique la retención de WAL de modo que cubra su ventana de recuperación (RPO). Para S3/almacenamiento de objetos se recomienda una política de ciclo de vida que conserve los WAL al menos durante la mayor ventana de recuperación prevista.

Step‑by‑Step: PITR durchführen (erweiterte Ablaufbeschreibung)

Los siguientes pasos se basan en el procedimiento básico, lo amplían con comprobaciones y verificaciones, y ofrecen recomendaciones de actuación concretas:

1) Planung, Isolierung und Kommunikation

Elija el punto de recuperación e informe a las partes interesadas. Prepare un host de recuperación aislado o una copia del PGDATA; nunca sobrescriba directamente el PGDATA productivo. Defina una condición de retroceso en el runbook: p. ej., abortar si faltan WAL o si aparecen errores de checksum.

2) Base Backup identifizieren und integritätsgeprüft bereitstellen

Compruebe el Base Backup para verificar su integridad y completitud. Si utiliza backups en tar, compruebe backup_label, el manifiesto y, opcionalmente, las sumas de comprobación almacenadas.

Shell
mkdir -p /recovery/pgdata
cd /recovery/pgdata
tar -xzf /backups/basebackup_2026-07-26.tar.gz
cat /recovery/pgdata/backup_label
# Optional: Prüfen einer manifest-Datei mit SHA256-Hashes
sha256sum -c /backups/basebackup_2026-07-26.manifest

3) RESTore_command gründlich testen

Los scripts RESTore_command defectuosos son una de las causas más frecuentes de fallos en las recuperaciones. Pruebe toda la cadena manualmente como usuario postgres, incluyendo credenciales de red, SELinux/contextos AppArmor y la ruta a aws/gsutil.

Shell
# Beispiel: S3-Objekt abrufen und auf Lesbarkeit prüfen
sudo -u postgres bash -c "aws s3 cp s3://my-pg-wal-archive/0000000100000000000000A0 /tmp/test_wal.gz && gunzip -c /tmp/test_wal.gz > /tmp/test_wal && file /tmp/test_wal"
# Prüfen auf Exit-Code
if [ $? -ne 0 ]; then echo 'RESTore_command failed'; fi

4) Recovery‑Parameter setzen und Timeline‑Regeln prüfen

Para PostgreSQL 12+ establezca los parámetros de recuperación en postgresql.conf o en una configuración separada similar a recovery.conf. PRESTe atención a recovery_target_time, recovery_target_lsn y recovery_target_timeline. recovery_target_timeline controla si, cuando exista una rama de timeline, se debe usar la rama más reciente (latest) o solo la timeline actual (current), o una ID de timeline explícita.

Shell
# Beispielkonfiguration
RESTore_command = '/usr/local/bin/RESTore_wal_from_s3.sh %f %p'
recovery_target_time = '2026-07-27 14:12:03+00'
recovery_target_timeline = 'latest'
recovery_target_action = 'promote'

5) Start, Monitoring und WAL‑Replay‑Analyse

Inicie la recuperación con una recovery.signal (PG12+) en el PGDATA de recuperación. Supervise los registros y el LSN de replay. Utilice pg_waldump para analizar el contenido de los WAL con antelación si sospecha irregularidades (p. ej., final repentino de un segmento):

Shell
# WAL-Inhalt prüfen
pg_waldump -f /srv/pg_wal_archive/0000000100000000000000A0 | head -n 50
# Replay-Status prüfen
psql -c "SELECT pg_is_in_recovery(), pg_last_wal_replay_lsn(), pg_last_wal_replay_timestamp();"

Si el replay se detiene en un archivo WAL específico, compruebe ese archivo en busca de corrupción y, si procede, compárelo con una copia alternativa (p. ej., archivo secundario u otra región).

6) Promoción y validación

Tras alcanzar el punto de recuperación objetivo, realice la promoción o el apagado según el Runbook. Valide mediante consultas de negocio por muestreo, recuentos de filas y comprobaciones de índices. A continuación, genere un nuevo Base Backup para cerrar correctamente la cadena de recuperación.

Análisis de errores: problemas frecuentes y contramedidas concretas

  • WALs faltantes: Compruebe otros destinos de archivado, réplicas o backups. Si no están disponibles, reduzca el punto de recuperación al último LSN disponible y comunique el alcance de la pérdida de datos.
  • Corrupción de WAL: Use pg_waldump para identificar la corrupción. Normalmente no es posible reparar la corrupción — necesita una copia intacta del WAL afectado o debe detenerse antes del segmento corrupto.
  • Confusión de Timeline: Compruebe los archivos .history en el archivado y ajuste recovery_target_timeline en consecuencia.
  • Errores de permisos y entorno: Ejecute todas las secuencias de comandos como el usuario postgres; compruebe SELinux/AppArmor y las variables de entorno para aws/gsutil.

Pruebas de integridad y técnicas de validación

Además de muestreos simples, debe planificar pruebas estructuradas:

  • Comparación de recuentos de filas para tablas clave entre el log de producción y el sistema RESTaurado.
  • Validación de checksums en Base Backups (si se generaron en el backup) y en los objetos del archivado mediante manifiestos SHA256 almacenados.
  • Comprobaciones funcionales e de integración con una copia de la aplicación en modo de solo lectura.

Automatización y monitorización: consultas de verificación recomendadas

Configure comprobaciones de monitorización que detecten errores de archivado de forma temprana:

Shell
# Letzte Archivierungs‑Informationen
psql -c "SELECT archived_count, failed_count, last_archived_wal FROM pg_stat_archiver;"
# Letzte WAL-File-Zeitstempel
psql -c "SELECT name, last_modified FROM pg_ls_waldir() LIMIT 10;" -- Abhängig von installierten Helper-Funktionen

Añada alertas en Prometheus/Nagios que se activen si no se han archivado WALs durante X horas o si falla un RESTore_command.

Si PITR no es posible: alternativas

Si existen lagunas en los WAL y no es posible un PITR completo, entran en juego alternativas:

  • RESTauración lógica de tablas con pg_dump/pg_RESTore, siempre que existan backups lógicos disponibles.
  • Reconstrucción a partir de logs de la aplicación o fuentes ETL.
  • RESTauración parcial: recuperación hasta el último WAL disponible y correcciones complementarias por parte de los equipos de aplicación.

Consejos prácticos para la operación

  • Automatice las RESTauraciones de prueba en un entorno aislado y documente los tiempos (RTO) y el esfuerzo.
  • Catalogue los backups y los rangos WAL en un directorio/DB central con metadatos (LSN inicial/final, Timeline, Checksummen).
  • Gestione los accesos a los destinos de archivado de forma minimalista (IAM‑Principle of Least Privilege) y utilice almacenamiento cifrado.
  • Tras cada recovery, cree inmediatamente un nuevo Base Backup para simplificar la cadena futura.

Lista de verificación: Antes del PITR en vivo (versión avanzada)

  1. Comprobación de activos: Base Backup completo, backup_label y manifiesto verificados.
  2. Comprobación WAL: Todos los archivos WAL presentes y verificados en integridad.
  3. RESTore_command: probado manualmente como usuario postgres, códigos de salida correctos.
  4. Comprobación de timeline: archivos .history e IDs de timeline cotejados.
  5. Host de recuperación: recursos, aislamiento y I/O de almacenamiento verificados.
  6. Comunicación: partes interesadas informadas, cadena de escalación preparada.
  7. Reversión: PGDATA actual asegurado, criterios de reversión definidos en el runbook.

Conclusión

PostgreSQL Point-in-Time-Recovery (PITR) es potente, pero operacionalmente exigente. Son determinantes copias base fiables, archivado WAL sin lagunas, scripts RESTore_command probados, documentación clara de timeline y comprobaciones automatizadas. Con RESTauraciones de prueba regulares, estrategias de archivado redundantes y una documentación de runbook ordenada, PITR se convierte en un componente fiable de su estrategia de recuperación ante desastres. Planifique recursos para pruebas y automatización: los costes de las pruebas preventivas son bajos en comparación con RESTauraciones no planificadas y caóticas.

Notas adicionales para enlaces internos

Páginas internas que debería enlazar: política de backup, configuración de archivado WAL, recovery‑runbook, políticas IAM para almacenamiento en la nube y lista de contactos de los equipos responsables. Estos enlaces facilitan la asignación de responsabilidades y aceleran la recuperación en caso de incidente.

PostgreSQL Point‑in‑Time‑Recovery (PITR): Aspectos de arquitectura e integración

Además del flujo de RESTauración y los pasos de verificación, vale la pena revisar decisiones arquitectónicas e integraciones que en operación marcan la diferencia entre un entorno recuperable rápidamente y una reconstrucción prolongada del incidente.

Archivado, almacenamiento de objetos y ciclo de vida: reglas prácticas

Los archivos WAL suelen almacenarse hoy en día en repositorios de objetos similares a S3. Planifique ciclos de vida de forma que los WAL estén disponibles al menos durante la ventana de recuperación máxima (RPO). PRESTe atención a la versionado de objetos / inmutabilidad para evitar sobrescrituras accidentales. Tenga en cuenta los costes de egreso de red al necesitar recuperar grandes volúmenes desde regiones en la nube.

Seguridad, credenciales y principio de menor privilegio

El RESTore_command necesita acceso a los destinos de archivado. Utilice roles/tokens de corta duración (sesión IAM, presigned URLs) en lugar de claves estáticas. Los roles deberían tener solo permisos de lectura sobre los prefijos relevantes. Documente la rotación de claves y los audit‑trails, de modo que una credencial de archivado comprometida pueda revocarse rápidamente.

Kubernetes, snapshots y PITR: evitar trampas

En entornos containerizados los snapshots de PV son atractivos, pero no sustituyen automáticamente a una copia base consistente más la cadena WAL. Un snapshot de un Pod de Postgres en ejecución debe coordinarse (p. ej. pg_start_backup/pg_stop_backup o filesystem‑freeze), de lo contrario faltarán WALs o la copia será inconsistente. En StatefulSets se recomienda una combinación de CSI‑snapshots para recuperaciones rápidas y copias base regulares para la capacidad PITR.

Idempotencia y robustez del RESTore_command

El RESTore_command se invoca repetidamente para cada segmento WAL faltante. Asegúrese de que el script sea idempotente, que escriba archivos temporales de forma atómica y que propague correctamente los códigos de error. Pruebe el script bajo condiciones como conexiones de red lentas, respuestas inesperadas 403/404 y descargas parciales.

Shell
# Monitorización: consultas de comprobación sencillas que puede usar en alertas
psql -c "SELECT archived_count, failed_count, last_archived_wal FROM pg_stat_archiver;"
psql -c "SELECT status, receive_start_lsn, receive_start_tli FROM pg_stat_wal_receiver;"

Interacción operativa entre replicación y failover

Realice la recuperación siempre de forma aislada — evite promociones automáticas de réplicas en streaming durante un PITR planificado. La ramificación de la línea temporal tras una promoción conduce a situaciones .history complejas. Defina en el Runbook cuándo se detienen las réplicas, cuándo se permiten promociones conservadoras y cuándo es necesaria una intervención manual.

Validación como proceso: RESTauraciones de prueba automatizadas

Automatice las RESTauraciones de prueba a intervalos regulares y documente RTO/RPO. Un informe claro sobre la tasa de éxito, la duración y los errores de archivado ocurridos hace que la preparación para PITR sea medible y reduce el riesgo de sorpresas en caso de incidente.

El archivado de WAL también es importante para este tema. El artículo sitúa estos aspectos de forma comprensible y muestra en qué hay que fijarse en la práctica diaria.