Sauvegardes automatisées (pgBackRest/Barman/Xtrabackup/cron)
Symptôme
Objectif : automatiser les sauvegardes des bases ; construire une chaîne de récupération fiable avec complètes+incrémentales+archivage WAL/binlog planifiés, rétention, vérification et copie hors site.
1. Choisissez le bon outil de sauvegarde
Choisissez un outil pour votre moteur : pgBackRest ou Barman pour PostgreSQL (sauvegarde physique + archive WAL + PITR) ; Percona XtraBackup (sauvegarde physique en ligne) pour MySQL/MariaDB, ou mysqldump/mydumper (logique) pour les petits volumes. Les outils physiques offrent des sauvegardes rapides et cohérentes + la restauration à un instant donné sur les grandes bases ; les dumps logiques sont portables mais lents sur de gros volumes.
PostgreSQL
# pgBackRest or BarmanMySQL
# physical: xtrabackup
# logical: mysqldump / mydumper2. Construisez la chaîne complète + incrémentale + archivage continu
Mettez en place la restauration à un instant donné avec des sauvegardes complètes hebdomadaires/quotidiennes, des sauvegardes incrémentales/différentielles entre les deux et un archivage continu du WAL (PostgreSQL) ou du binlog (MySQL). pgBackRest gère les types de sauvegarde full/diff/incrémentale et l'archive WAL ; dans PostgreSQL, vous faites pointer archive_command vers pgBackRest. Les sauvegardes incrémentales + l'archive permettent de revenir à n'importe quel instant.
PostgreSQL
# postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=appdb archive-push %p'
# full backup
pgbackrest --stanza=appdb --type=full backup
# incremental
pgbackrest --stanza=appdb --type=incr backupMySQL
# full
xtrabackup --backup --target-dir=/backup/full
# incremental
xtrabackup --backup --target-dir=/backup/incr1 \
--incremental-basedir=/backup/full3. Planifiez les sauvegardes avec cron/un timer
Exécutez régulièrement les commandes de sauvegarde avec cron ou un timer systemd : par exemple une sauvegarde complète le dimanche soir et des incrémentales les autres nuits. Planifiez hors des heures ouvrées et assurez-vous que les jobs full et incr ne se chevauchent pas. Écrivez les logs de sortie quelque part et déclenchez une alerte en cas d'échec.
PostgreSQL
# crontab
0 1 * * 0 pgbackrest --stanza=appdb --type=full backup
0 1 * * 1-6 pgbackrest --stanza=appdb --type=incr backup4. Définissez une politique de rétention
N'accumulez pas les sauvegardes indéfiniment ; fixez le nombre de sauvegardes complètes et de jours d'archives à conserver, et laissez l'outil faire expirer automatiquement les anciennes. Dans pgBackRest, cela se gère avec repo1-retention-full et les paramètres de rétention des archives ; dans Barman, avec retention_policy. La rétention doit correspondre à vos objectifs de récupération (jusqu'à combien de jours en arrière vous devez pouvoir revenir).
PostgreSQL
# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8MySQL
# purge old backups with cron (example)
find /backup -type d -mtime +14 -exec rm -rf {} +5. Copiez les sauvegardes hors site / vers S3
Les sauvegardes ne doivent pas rester sur la même machine/région que la base ; copiez-les vers un autre emplacement ou un stockage objet (S3, GCS). pgBackRest peut écrire directement sur un stockage compatible S3 ; sinon, synchronisez vers une cible hors site avec rsync/rclone. En cas de sinistre (perte du disque local/de la région), seule la copie hors site vous sauvera.
PostgreSQL
# pgbackrest.conf S3 repository
[global]
repo1-type=s3
repo1-s3-bucket=company-backup
repo1-s3-region=eu-central-1
repo1-s3-endpoint=s3.eu-central-1.amazonaws.com6. Vérifiez la sauvegarde
L'existence d'une sauvegarde ne signifie pas qu'elle peut être restaurée ; vérifiez régulièrement son intégrité. Dans pgBackRest, la commande 'verify' et les contrôles de cohérence de l'archive, et dans XtraBackup une étape prepare (--prepare) réussie, montrent que la sauvegarde est saine. Exécutez la vérification automatiquement après chaque sauvegarde et déclenchez une alarme en cas d'échec.
PostgreSQL
pgbackrest --stanza=appdb verifyMySQL
# make the backup consistent (verification)
xtrabackup --prepare --target-dir=/backup/full7. Faites des exercices de restauration réguliers
L'étape la plus critique : restaurez périodiquement et RÉELLEMENT la sauvegarde sur un serveur séparé et vérifiez que la base s'ouvre et que les données sont cohérentes. Cet exercice vous permet de mesurer votre temps de récupération (RTO) et de repérer les lacunes de la procédure en dehors d'un incident. Une sauvegarde non testée n'est pas une sauvegarde.
PostgreSQL
# restore + PITR on a separate server
pgbackrest --stanza=appdb \
--type=time --target="2026-07-01 03:00:00" restoreMySQL
# copy the prepared backup back to the data directory
xtrabackup --copy-back --target-dir=/backup/full