Récupérer une base PostgreSQL à la minute près après une erreur humaine

  • Aucun avis
  • Avancé
  • 2 h 30 min
  • 1 000 crédits

Description

Lundi 14 h 07, un script de migration passe en production. Il devait régulariser les paiements du week-end ; sa dernière requête a perdu sa clause WHERE à la relecture. Personne ne le voit. À 15 h 30, le rapprochement bancaire ne tombe plus : toutes les transactions portent un montant à zéro. Vous restaurez le dump de 2 h du matin, le service repart, et treize heures d'encaissements disparaissent avec la bêtise. Les deux premiers labs du parcours ont réglé le temps de remise en service. Celui-ci s'attaque à l'autre chiffre, celui que personne n'avait demandé : la quantité de données perdues. Avec une sauvegarde par jour, aucune restauration, aussi rapide soit-elle, ne descend sous 24 heures de pertes — ce qui n'a pas été sauvegardé n'existe plus. Il faut changer de mécanisme. Vous mettez en place l'archivage continu des journaux de transactions vers S3, puis vous le prouvez sur un incident que vous déclenchez vous-même : vous relancez le script fautif sur une base vivante, et vous la ramenez à la seconde d'avant. Un plan de reprise qu'on n'a jamais répété n'est pas un plan, c'est un espoir. La sandbox démarre avec la production en marche — une transaction toutes les deux secondes — le dump de 02 h 00 déjà sur S3, et l'archivage des WAL à construire.

Important
La promotion d'une instance restaurée est irréversible : une fois promue, elle ouvre une nouvelle ligne temporelle et n'acceptera plus de rejouer le moindre journal. C'est pour cela que l'étape de vérification vient avant, et qu'on restaure à côté de la production plutôt que par-dessus.
Conseil
Deux réflexes à emporter. Si archive_command échoue, PostgreSQL conserve ses segments et réessaie indéfiniment : pg_wal grossit jusqu'à l'arrêt de la base, sans que rien n'alerte. Surveillez pg_stat_archiver.failed_count. Et notez toujours vos horodatages avec leur fuseau : recovery_target_time s'interprète dans celui du serveur, et une heure d'écart vous fait rater la cible d'une heure.

Compétences travaillées

  • Distinguer RTO et RPO, et chiffrer en transactions ce qu'une sauvegarde quotidienne laisse perdre
  • Activer l'archivage continu des WAL et les déposer sur S3 depuis un serveur de production
  • Reconnaître un archive_command qui échoue en silence avant qu'il ne remplisse le disque
  • Produire une sauvegarde de base cohérente avec pg_basebackup pendant que la base écrit
  • Restaurer à un instant choisi avec recovery_target_time, sans toucher à la production
  • Vérifier une restauration tant qu'elle est encore réversible, puis la promouvoir
  • Mesurer le RPO réellement atteint et le comparer à celui de la méthode précédente

Technologies utilisées

  • PostgreSQL
  • WAL
  • pg_basebackup
  • pg_ctl
  • Amazon S3
  • AWS CLI
  • Bash

Prérequis

  • Avoir fait les deux premiers labs du parcours, ou savoir restaurer un dump PostgreSQL
  • Être à l'aise avec la ligne de commande Linux et l'édition d'un fichier de configuration
  • Avoir déjà déposé et récupéré un objet sur S3 avec l'AWS CLI
  • Savoir lire une sortie de psql et écrire un SELECT avec une clause WHERE
  • postgresql
  • pitr
  • wal
  • restauration
  • rpo
En bref
Domaine
Données et analytique
Niveau
Avancé
Durée estimée
2 h 30 min
Sandbox
4 h, puis suppression automatique
Langue
Français
Mis à jour le
21 septembre 2026