Sauvegardes et restauration testée
Disque mort, DROP TABLE malencontreux, migration foireuse : sans backup testé, chacun de ces classiques est une fin.
Prérequis : cours 4.1 (rôles) ; sauvegardes et monitoring pour les bases.
Pourquoi
Disque mort, DROP TABLE malencontreux, migration foireuse : sans backup testé, chacun de ces classiques est une fin. Avec, une anecdote de 20 minutes.
Concepts
- RTO / RPO (définis ici, détaillés au chapitre 8) : RTO = durée max d'interruption acceptable (« on peut être down 1 h »), RPO = perte de données max acceptable (« on peut perdre 24 h de données »). Ils dimensionnent tout : fréquence des dumps, rapidité de restauration.
- 3-2-1 : 3 copies, 2 supports, 1 hors site. La copie hors site est chiffrée avant envoi — avec
age(chiffreur moderne simple :age -r clé-publique -o backup.sql.gz.age), car un backup en clair chez un tiers est une fuite en attente. - Objet storage (S3 et compatibles) : stockage de fichiers via API, seconde maison idéale pour les dumps : versionné, loin du serveur.
Exemple : dumper, vérifier, restaurer
pg_dump -U monapp -d monapp | gzip > /backups/monapp-$(date +%F).sql.gz
ls -la /backups/ # 0 octet = fausse sécurité : le script doit sortir en erreur
# Restauration test (trimestrielle minimum) :
createdb -U monapp monapp_restored
gunzip -c monapp-2026-01-01.sql.gz | psql -U monapp -d monapp_restored
psql -U monapp -d monapp_restored -c "SELECT count(*) FROM table_metier;"
Quotidien via timer systemd, rétention 7 + 4. On chronomètre : si ça prend 40 minutes, le « RTO de 10 minutes » est un mensonge — mieux vaut le savoir un dimanche calme.
Cas réel
Backup qui tournait depuis un an… vers un disque plein depuis 6 mois : dumps de 0 octet, alerte inexistante. Le jour du besoin : rien. D'où la règle : taille vérifiée à chaque dump, restauration testée, chiffrement testé (déchiffrer un vieux fichier 1×/trimestre).
Pièges
- Sauvegarder la base mais pas les volumes (uploads),
.envet confs proxy : lister tout ce qui n'est pas en base. - Tester la restauration sur la prod (écrase !) : toujours une base
_restoredséparée. - Chiffrer sans tester le déchiffrement : clé perdue = backups perdus.
À retenir
Dump quotidien vérifié, 3-2-1 chiffré, restauration testée et chronométrée, RTO/RPO honnêtes.