Sauvegarde et PITR avec pgBackRest
PostgreSQLNiveau: IntermédiaireDurée: 45–90 minSauvegarde complète / différentielle / incrémentale avec pgBackRest, archivage WAL continu et restauration à un instant donné (PITR). Pour un serveur unique, une streaming replication (primary + standbys) ou un cluster Patroni ; le dépôt peut se trouver sur le même serveur, sur un serveur de sauvegarde séparé (SSH) ou dans un object storage compatible S3. Inclut le chiffrement, la compression, la politique de rétention, la planification cron/systemd et une restauration de test dans un répertoire séparé ; le même guide produit aussi le runbook de restauration sur place en cas de sinistre (y compris la reconstruction d'un cluster Patroni depuis la sauvegarde). Différence avec les guides voisins : c'est l'outil de sauvegarde physique recommandé en production ; pour une sauvegarde physique et un PITR sans outil supplémentaire, utilisez le guide pg_basebackup + archivage WAL, et pour une sauvegarde logique (dump de table ou de base, migration entre versions), le guide pg_dump / pg_restore.
Topologie: 1 serveur, primary + standbys ou cluster Patroni ; serveur de sauvegarde optionnel
Scénarios
- Installation de pgBackRest + première sauvegarde + restauration de test — pgBackRest n'est pas encore en place : logiciel, dépôt, archivage WAL, première sauvegarde, planification et une restauration de test.
- Sinistre : restauration sur place (jusqu'au dernier état ou à un instant donné) — Ramenez la base sur place à un instant couvert par la sauvegarde et l'archive : dernier instant, heure, xid, LSN ou restore point. Le cluster est arrêté ; les modifications postérieures à la cible sont perdues.
- Fichier corrompu ou supprimé dans le répertoire de données (réparer avec un delta restore) — Le serveur est intact mais certains fichiers de données sont illisibles ou supprimés : --delta ne réécrit depuis la sauvegarde que les fichiers différents, puis avance jusqu'au dernier instant de l'archive. Le cluster est arrêté.
- Récupérer une seule base de données (--db-include) — Le cluster reste ouvert : la base est restaurée dans une instance temporaire (répertoire et port séparés), extraite avec pg_dump puis chargée sous un nouveau nom sur le serveur de production. Cette fiche sert aussi pour une seule table supprimée (avec pg_dump -t).
- Restaurer la sauvegarde sur un autre serveur (clone / test / reporting) — Le serveur de production n'est pas touché. La sauvegarde est restaurée sur un nouveau serveur ; l'archivage WAL y est désactivé pour que le clone n'écrive pas dans le dépôt de production. Avec un dépôt chiffré, la clé est demandée.
- Serveur entièrement perdu : restaurer la sauvegarde sur un nouveau serveur et le mettre en service à sa place — Perte de disque ou de serveur : le nouveau serveur est restauré depuis la sauvegarde et devient le nouveau primary ; l'archivage WAL et les sauvegardes continuent dans la même stanza. L'ancien serveur doit impérativement rester arrêté.
- Créer un nouveau standby depuis la sauvegarde (--type=standby) — Nouveau standby sans charge de copie sur le primary : les fichiers viennent de la sauvegarde, les WAL manquants de l'archive puis du streaming. Le primary reste ouvert.
- Les sauvegardes sont-elles vraiment saines ? (info / check / verify et exercice de restauration) — Contrôles en lecture seule et exercice de restauration dans un répertoire séparé, sans toucher au serveur de production. Une tâche de vérification mensuelle (cron) est aussi mise en place.
- Modifier la durée de rétention et purger les anciennes sauvegardes (expire) — Modifie les paramètres repo1-retention-full/diff, montre d'abord avec --dry-run ce qui sera supprimé, puis lance expire. Une sauvegarde supprimée ne peut pas être récupérée.
Avant de commencer
- PostgreSQL … est installé et en fonctionnement (guide pg-install)… ; ce serveur est le primary…. Répertoire de données ….
- Le cluster Patroni … est en fonctionnement (installation de Patroni) : un Leader, les autres en streaming replica. Sur tous les nœuds, le répertoire de données est …, la configuration Patroni … et le mot de passe de l'API REST se trouve dans le fichier /etc/patroni/patroni.env.
- Aucun autre outil d'archivage/sauvegarde (Barman, WAL-G, archive_command écrit à la main) n'est configuré ; s'il y en a un, supprimez-le d'abord. Si deux outils envoient les mêmes WAL à des endroits différents, les deux archives sont incomplètes.… Avec Patroni, la valeur actuelle figure dans la sortie de patronictl show-config.…
- La taille de la base est connue. Le dépôt nécessite à peu près (nombre de full + 1) × taille compressée + archive WAL (avec zst, la plupart des bases se compressent à 1/3–1/5).
- Le répertoire du dépôt … se trouve sur un disque/partage NFS séparé de la base et monté de façon permanente (fstab).
- Un disque séparé avec assez d'espace pour … est monté sur le serveur de sauvegarde. Le serveur de sauvegarde est de la même famille de système d'exploitation que la base.
- Les serveurs résolvent mutuellement leurs noms (…, …) et le port 22/tcp (SSH) est ouvert entre eux.
- Les standbys (………, ……) sont des standbys en streaming qui reçoivent les WAL du primary et utilisent le même chemin PGDATA que le primary (…).
- Le bucket … est créé ; une clé d'accès (access key + secret key) disposant des droits de lecture/écriture/suppression sur ce seul bucket est prête. Le bucket n'a aucune règle de lifecycle qui supprime des objets (la rétention est gérée par pgBackRest). Le serveur peut joindre l'endpoint.
- L'heure est synchronisée (NTP). L'heure cible du PITR et les signatures S3 dépendent d'une heure correcte.
- Les serveurs ont accès aux dépôts PGDG et EPEL (ou à un miroir interne) ; la dépendance libssh2 de pgBackRest vient d'EPEL.
- L'emplacement de stockage de la clé de chiffrement (coffre de mots de passe / vault) est prêt. Si la clé n'est pas conservée hors du serveur, les sauvegardes ne peuvent plus être ouvertes en cas de perte du serveur.
Phases du guide
- Installation du logiciel pgBackRest — Ajouter le dépôt PGDG (serveur de sauvegarde) · Ajouter le dépôt PGDG (serveur de sauvegarde) · Activer le dépôt EPEL · Installer pgBackRest · Créer l'utilisateur pgbackrest · Supprimer l'ancien fichier de configuration
- Préparation du dépôt — Créer le répertoire du dépôt · Créer le répertoire du dépôt · Générer la clé SSH (serveur de sauvegarde) · Générer la clé SSH (serveurs de base de données) · Autoriser la clé du serveur de sauvegarde · Autoriser les clés des serveurs de base de données …
- Configuration de pgBackRest — Écrire le fichier de configuration · Écrire le fichier de configuration (serveur de sauvegarde) · Écrire le fichier de configuration (serveurs de base de données) · Saisir les clés d'accès S3 · Générer la clé de chiffrement · Écrire la clé de chiffrement sur le serveur … …
- Stanza et première sauvegarde — Créer le stanza · Créer le stanza · Vérifier la configuration (check) · Prendre la première sauvegarde full · Prendre la première sauvegarde full · Afficher l'état du dépôt (info) …
- Planification des sauvegardes — Vérifier le chemin de la commande pgbackrest · Écrire le script de sauvegarde · Définir le propriétaire et les droits du script · Créer les services et timers systemd · Tester la planification (déclenchement manuel) · Préparer le service cron …
- Vérification et test de restauration — Vérifier que l'archivage WAL fonctionne · Écrire des données de test et enregistrer l'heure cible · Préparer le répertoire de restauration de test · Restaurer jusqu'à l'heure cible dans un répertoire séparé · Démarrer le cluster de test sur un port séparé · Vérifier les données restaurées …
- Supervision et maintenance — Vérifier l'intégrité du dépôt (verify) · Vérifier l'intégrité du dépôt (verify) · Surveiller l'âge de la dernière sauvegarde · Surveiller l'âge de la dernière sauvegarde · Seconde copie et conservation des clés
- Diagnostic : fichier corrompu ou manquant ? — Trouver l'erreur et le fichier concerné dans le log · Identifier l'objet corrompu · Vérifier qu'il existe une sauvegarde et une archive saines
- Contrôles avant restauration — Lister les sauvegardes · Vérifier les connexions applicatives · Arrêter les standbys · Arrêter PostgreSQL · Copier le répertoire de données actuel (si la place le permet)
- Restauration sur place — Restaurer (--delta) · Démarrer PostgreSQL et attendre la fin du recovery · Contrôler les données sur la cible (pause) · Terminer le recovery et faire le promote
- Vérification — Nettoyer les paramètres de restauration · Vérifier l'état du cluster · Contrôler les données applicatives · Vérifier que la corruption est corrigée (amcheck) · Vérifier que l'archivage se poursuit · Prendre une nouvelle sauvegarde full …
- Avant restauration : arrêter le cluster Patroni — Lister les sauvegardes · Enregistrer l'état du cluster et la configuration dynamique · Arrêter les applications · Arrêter Patroni sur les réplicas · Arrêter Patroni sur le leader · Copier le répertoire de données actuel (si la place le permet)
- Vérification et nettoyage (Patroni) — Vérifier que l'archivage se poursuit · Prendre une nouvelle sauvegarde full · Vérifier le cluster et l'accès applicatif · Supprimer les répertoires de données mis de côté
- Patroni : reconstruire le nœud corrompu (reinit) — Trouver le nœud où se trouve la corruption · Transférer le rôle de leader si le nœud corrompu est leader · Reconstruire le réplica corrompu (reinit)
- Vérification des sauvegardes et exercice de restauration — État des sauvegardes et âge de la dernière sauvegarde (info) · Vérifier que l'archivage fonctionne actuellement (check) · Vérifier l'intégrité du dépôt (verify) · Préparer le répertoire d'exercice · Restaurer la dernière sauvegarde dans le répertoire d'exercice · Démarrer l'instance d'exercice et attendre le recovery …
- Planification de la vérification mensuelle — Écrire le script de vérification mensuelle · Définir les droits du script et le tester avec l'environnement de cron · Écrire la tâche cron mensuelle · Définir les droits du fichier cron
- Modifier la politique de rétention — Paramètre de rétention actuel et sauvegardes · Modifier le paramètre de rétention · Afficher ce qui sera supprimé (dry-run) · Supprimer les anciennes sauvegardes (expire) · Vérifier le remplissage du dépôt et la planification