IT-Admin.tech

Étape par étape : effectuer une récupération point-in-time (PITR) de PostgreSQL sur des bases de données de production

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.

Le Point-in-Time-Recovery (PITR) de PostgreSQL est la capacité de ramener une instance physique de base de données à un instant précis du passé. Pour les exploitants d’installations en production, le PITR est souvent le seul moyen d’annuler de manière ciblée des transactions erronées, des suppressions accidentelles ou des dommages causés par des ransomwares. Ce guide complète les notions de base par des étapes de vérification éprouvées, des changements de Timeline, des contrôles d’intégrité, des exemples d’automatisation et des étapes concrètes de dépannage afin que vous puissiez agir en toute sécurité en cas d’incident réel.

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

Le PITR combine deux composants physiques de PostgreSQL : les Base Backups (instantanés cohérents du répertoire de données PGDATA) et les Write‑Ahead‑Logs (WAL) qui consignent séquentiellement chaque modification. Pour une restauration réussie, vous avez besoin d’un Base Backup et de tous les segments WAL jusqu’au point souhaité. Si un segment WAL fait défaut, la restauration jusqu’à ce point est impossible : il faudra soit revenir à un instant antérieur, soit récupérer les archives manquantes depuis des dépôts secondaires.

Wann ist PITR die richtige Methode?

Le PITR est la méthode appropriée lorsque vous souhaitez annuler des modifications jusqu’à un instant précis ; elle n’est en revanche pas adaptée si vous devez reconstruire sélectivement des tables individuelles (dans ces cas, des sauvegardes logiques comme pg_dump ou Logical Replication sont plus appropriées). Cas d’utilisation typiques :

  • Mises à jour massives erronées / suppression accidentelle de volumes importants de données.
  • Analyse forensique : reconstruire l’état de la BD à un horodatage donné.
  • Corruption partielle des données, lorsque seul un intervalle temporel restreint est affecté.
  • Scénarios de ransomware, lorsque vous souhaitez rétablir un état sain antérieur à l’infection.

Grundvoraussetzungen und Architektur

Avant d’effectuer un PITR, les conditions suivantes doivent être réunies de manière fiable :

  • Archivage WAL actif (archive_mode = on) et un archive_command testé.
  • Base Backups réguliers et cohérents (p. ex. avec pg_basebackup ou des snapshots de stockage cohérents).
  • Une cible d’archivage fiable avec redondance (chemin d’archives local, NFS ou objet‑store tel que S3) et des droits d’accès sécurisés.
  • Documentation : corrélation des horodatages des Base Backups, des plages WAL et des IDs de Timeline.

Vérifiez rapidement la configuration avec psql :

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

Wichtige Parameter kurz erklärt

En une phrase :

  • archive_mode : active l’archivage WAL.
  • archive_command : commande/script shell qui transfère les segments WAL vers l’archive.
  • wal_level : doit être au moins replica pour que les données WAL complètes nécessaires au PITR soient disponibles.
  • archive_timeout : force l’archivage périodique même en cas de faible activité.

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

En environnements de production, deux aspects opérationnels sont particulièrement critiques : les changements de Timeline et la rétention des WAL. Les IDs de Timeline apparaissent lors de promotions ou de basculements ; les noms de fichiers WAL et les labels de backup les contiennent. Si un saut de Timeline a eu lieu, les WAL de la Timeline appropriée doivent être disponibles, sinon le replay s’arrête.

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

Planifiez la rétention des WAL de sorte que votre fenêtre de récupération (RPO) soit couverte. Pour S3 ou un object store, prévoyez une règle de cycle de vie (lifecycle policy) qui conserve les WAL au moins pendant la durée de votre plus longue fenêtre de récupération planifiée.

Étape par étape : exécution d’un PITR (description de procédure étendue)

Les étapes suivantes s’appuient sur le processus de base, l’étendent par des vérifications et des validations, et fournissent des recommandations d’action concrètes :

1) Planification, isolation et communication

Choisissez le point de recovery et informez les parties prenantes. Préparez un hôte de recovery isolé ou une copie du PGDATA ; ne remplacez jamais directement le PGDATA en production. Définissez une condition de repli dans le runbook : p. ex. abandon si des WAL sont manquants ou si des erreurs de somme de contrôle surviennent.

2) Identifier le Base Backup et le préparer après vérification d’intégrité

Vérifiez le Base Backup pour complétude et intégrité. Si vous utilisez des sauvegardes tar, vérifiez backup_label, Manifest et éventuellement les checksums stockés.

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

Les scripts RESTore_command erronés sont l’une des causes les plus fréquentes d’échecs de recovery. Testez toute la chaîne manuellement en tant qu’utilisateur postgres, y compris les identifiants réseau, les contextes SELinux/AppArmor et le chemin vers 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

Pour PostgreSQL 12+, définissez les paramètres de recovery dans postgresql.conf ou dans une configuration séparée de type recovery.conf. Faites attention à recovery_target_time, recovery_target_lsn et recovery_target_timeline. recovery_target_timeline contrôle si, en présence de branches de timeline, la branche la plus récente doit être utilisée (latest) ou uniquement la timeline actuelle (current), ou bien une ID de timeline explicite.

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

Démarrez la recovery avec un fichier recovery.signal (PG12+) dans le Recovery‑PGDATA. Surveillez les logs et le Replay‑LSN. Utilisez pg_waldump pour analyser le contenu des WAL à l’avance si vous suspectez des irrégularités (p. ex. fin soudaine d’un segment) :

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 le replay s’arrête sur un fichier WAL particulier, vérifiez ce fichier pour détecter une corruption et comparez-le, le cas échéant, avec une copie alternative (p. ex. archive secondaire ou autre région).

6) Promotion et validation

Une fois le point cible atteint, effectuez la promotion ou l’arrêt conformément au Runbook. Validez par des requêtes métier ponctuelles, des comptages de lignes (Row‑Counts) et des contrôles d’index. Créez ensuite un nouveau Base Backup afin de fermer proprement la chaîne de récupération.

Analyse des erreurs : problèmes fréquents et mesures correctives concrètes

  • WAL manquants : Vérifiez d’autres cibles d’archivage, réplicas ou sauvegardes. Si introuvables, réduisez le point de récupération au dernier LSN disponible et communiquez l’étendue de la perte de données.
  • Corruption des WAL : Utilisez pg_waldump pour identifier la corruption. Les corrections de corruption sont généralement impossibles — vous aurez besoin d’une copie intacte du WAL concerné ou devrez vous arrêter avant le segment corrompu.
  • Confusion de timeline : Vérifiez les fichiers .history dans l’archive et réglez recovery_target_timeline en conséquence.
  • Erreurs d’autorisation et d’environnement : Testez tous les scripts en tant qu’utilisateur postgres ; vérifiez SELinux/AppArmor et les variables d’environnement pour aws/gsutil.

Contrôles d’intégrité et techniques de validation

En complément d’échantillonnages simples, prévoyez des contrôles structurés :

  • Comparaison des comptages de lignes (Row‑Counts) pour les tables clés entre le journal de production et le système RESTauré.
  • Validation des checksums pour les Base Backups (si générés lors de la sauvegarde) et pour les objets d’archive via des manifests SHA256 enregistrés.
  • Tests fonctionnels et d’intégration avec une copie de l’application en mode lecture seule.

Automatisation et monitoring : requêtes de contrôle recommandées

Mettez en place des contrôles de monitoring qui signalent tôt les erreurs d’archivage :

Shell
# Dernières informations d'archivage
psql -c "SELECT archived_count, failed_count, last_archived_wal FROM pg_stat_archiver;"
# Derniers horodatages de fichiers WAL
psql -c "SELECT name, last_modified FROM pg_ls_waldir() LIMIT 10;" -- Dépend des fonctions auxiliaires installées

Ajoutez des alertes dans Prometheus/Nagios pour déclencher une alarme si aucune WAL n’a été archivée depuis X heures ou si un RESTore_command échoue.

Si le PITR est impossible : alternatives

En cas de lacunes dans les WAL et d’impossibilité de PITR complet, les alternatives suivantes sont envisageables :

  • RESTauration logique des tables avec pg_dump/pg_RESTore, si des sauvegardes logiques existent.
  • Reconstruction à partir des journaux applicatifs ou des sources ETL.
  • RESTauration partielle : récupération jusqu’au dernier WAL disponible et corrections complémentaires par les équipes applicatives.

Conseils pratiques pour l’exploitation

  • Automatisez des RESTaurations tests dans un environnement isolé et documentez les durées (RTO) et les efforts.
  • Cataloguez les sauvegardes et plages WAL dans un répertoire/DB central avec métadonnées (Start/End LSN, Timeline, Checksummen).
  • Gérez les accès aux cibles d’archivage de manière minimaliste (IAM — principe du moindre privilège) et utilisez un stockage chiffré.
  • Après chaque récupération, créez immédiatement un nouveau Base Backup pour simplifier la chaîne future.

Checklist : avant le PITR en production (version étendue)

  1. Vérification des actifs : Base Backup complet, backup_label et manifeste vérifiés.
  2. WAL‑Check: Alle WAL‑Dateien vorhanden und integritätsgeprüft.
  3. RESTore_command: manuell als postgres‑User getestet, Exit‑Codes korrekt.
  4. Timeline‑Check: .history‑Dateien und Timeline‑IDs abgeglichen.
  5. Recovery‑Host: Ressourcen, Isolierung und Storage‑IO geprüft.
  6. Kommunikation: Stakeholder informiert, Eskalationskette bereit.
  7. Rückfall: Aktuelles PGDATA gesichert, Rückfallkriterien im Runbook definiert.

Fazit

PostgreSQL Point-in-Time-Recovery (PITR) ist mächtig, aber betrieblich anspruchsvoll. Entscheidend sind verlässliche Base Backups, lückenlose WAL‑Archivierung, getestete RESTore_command‑Skripte, klare Timeline‑Dokumentation und automatisierte Prüfungen. Mit regelmäßigen Probe‑RESTores, redundanten Archivstrategien und einer sauberen Runbook‑Dokumentation wird PITR zu einem verlässlichen Baustein Ihrer Disaster‑Recovery‑Strategie. Planen Sie Ressourcen für Prüfung und Automation ein — die Kosten für präventive Tests sind im Vergleich zu ungeplanten, chaotischen Wiederherstellungen gering.

Weiterführende Hinweise für interne Verlinkung

Interne Seiten, die Sie verlinken sollten: Backup‑Policy, WAL‑Archivierungskonfiguration, Recovery‑Runbook, IAM‑Richtlinien für Cloud‑Storage und Kontaktliste der verantwortlichen Teams. Diese Links erleichtern die Verantwortungszuweisung und beschleunigen das Recovery im Ernstfall.

PostgreSQL Point‑in‑Time‑Recovery (PITR): Architektur‑ und Integrationsaspekte

Ergänzend zu RESTore‑Ablauf und Prüfschritten lohnt sich ein Blick auf Architekturentscheidungen und Integrationen, die im Betrieb den Unterschied zwischen schnell wiederherstellbarer Umgebung und langwieriger Incident‑Rekonstruktion machen.

Archivierung, Objekt‑Storage und Lifecycle: praktische Regeln

WAL‑Archive landen heute häufig in S3‑ähnlichen Objektspeichern. Planen Sie Lifecycles so, dass WALs mindestens bis zum größen Recovery‑Fenster (RPO) vorhanden bleiben. Achten Sie auf Objekt‑Versionierung/Immutability, um versehentliches Überschreiben zu verhindern. Beachten Sie Netzwerk‑Egress‑Kosten bei großem Wiederherstellungsbedarf aus Cloud‑Regionen.

Sicherheit, Credentials und Least‑Privilege

Das RESTore_command benötigt Zugriff auf Archivziele. Verwenden Sie kurzlebige Rollen/Token (IAM‑Session, presigned URLs) statt statischer Keys. Rollen sollten nur Leserechte für die relevanten Prefixes haben. Dokumentieren Sie Schlüsselrotation und Audit‑Trails, damit ein kompromittiertes Archiv‑Credential schnell entzogen werden kann.

Kubernetes, Snapshots und PITR: Fallen vermeiden

In containerisierten Umgebungen sind PV‑Snapshots attraktiv, aber sie ersetzen nicht automatisch ein konsistentes Base Backup + WAL‑Kette. Ein Snapshot eines laufenden Postgres‑Pods muss koordiniert werden (z. B. pg_start_backup/pg_stop_backup oder Filesystem‑Freeze), sonst fehlen WALs oder das Backup ist inkonsistent. Bei StatefulSets empfiehlt sich eine Kombination aus CSI‑Snapshots für schnelle Recoveries und regulären Base Backups für PITR‑Fähigkeit.

Idempotenz und Robustheit des RESTore_command

RESTore_command wird bei jedem fehlenden WAL‑Segment mehrfach aufgerufen. Sorgen Sie dafür, dass das Script idempotent ist, temporäre Dateien atomar schreibt und Fehlercodes korrekt propagiert. Testen Sie das Script unter Bedingungen wie langsamer Netzwerkverbindung, unerwartetem 403/404 und partiellen Downloads.

Shell
# Überwachung: einfache Prüfqueries, die Sie in Alerts nutzen können
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;"

Interaction opérationnelle entre réplication et basculement

Effectuez toujours la récupération de manière isolée — évitez les promotions automatiques des répliques de streaming pendant un PITR planifié. Le branching de timeline après une promotion conduit sinon à des situations .history complexes. Définissez dans le Runbook quand les répliques doivent être arrêtées, quand des promotions conservatrices sont autorisées et quand une intervention manuelle est nécessaire.

Validation en tant que processus : RESTaurations de test automatisées

Automatisez les RESTaurations de test à intervalles réguliers et documentez les RTO/RPO. Un reporting clair sur le taux de réussite, la durée et les erreurs d’archivage survenues rend la préparation au PITR mesurable et réduit le risque de surprises en cas d’incident.

Pour ce sujet, l’archivage WAL est également important. L’article situe ces aspects de manière compréhensible et montre ce qui compte au quotidien.