Point In Time Recovery

Module I2

Dalibo SCOP

26.09

10 septembre 2026

Sur ce document

Formation Module I2
Titre Point In Time Recovery
Révision 26.09
PDF https://dali.bo/i2_pdf
EPUB https://dali.bo/i2_epub
HTML https://dali.bo/i2_html
Slides https://dali.bo/i2_slides
TP https://dali.bo/i2_tp
TP (solutions) https://dali.bo/i2_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale (y compris IA)
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 14 à 18.

Sauvegarde physique à chaud et PITR

Introduction

  • Sauvegarde traditionnelle
    • sauvegarde pg_dump à chaud
    • sauvegarde des fichiers à froid
  • Insuffisant pour les grosses bases
    • long à sauvegarder
    • encore plus long à restaurer
  • Perte de données potentiellement importante
    • car impossible de réaliser fréquemment une sauvegarde
  • Une solution : la sauvegarde PITR

Au menu

  • Rappel sur la journalisation
  • Principe de la sauvegarde PITR
  • Mise en place
    • sauvegarde : manuelle, ou avec pg_basebackup
    • archivage : manuel, ou avec pg_receivewal
  • Restaurer une sauvegarde PITR
  • Archivage & compression
  • Des outils

Rappel sur la journalisation

Journaux de transaction

  • Write Ahead Logs (WAL)
  • Chaque donnée est écrite 2 fois sur le disque !
  • Avantages :
    • sécurité infaillible (après COMMIT), intégrité, durabilité
    • écriture séquentielle rapide, et un seul sync sur le WAL
    • fichiers de données écrits en asynchrone
    • sauvegarde PITR et réplication fiables

PITR

  • Point In Time Recovery
  • À chaud
  • En continu
  • Cohérente

Sauvegarde physique

Image de la base au niveau des fichiers

Principe du PITR

Archiver tous les journaux et le base backup

Restauration PITR

  • Les journaux de transactions contiennent toutes les modifications
  • Il faut les archiver
    • …et avoir une image des fichiers à un instant t (base backup)
  • La restauration se fait en restaurant cette image
    • puis en rejouant les journaux
    • dans l’ordre
    • sans trou
    • entièrement
    • au moins jusqu’au point de cohérence
    • toute l’activité de la base
    • tous… ou jusqu’au moment voulu

Avantages du PITR

  • Sauvegarde à chaud
  • Choix du moment d’arrêt du rejeu
  • Moins de perte de données
  • Grandes bases : plus réaliste que pg_dump

Inconvénients du PITR

  • Sauvegarde/restauration de l’instance complète
  • Impossible de changer d’architecture (même OS conseillé)
  • Nécessite un grand espace de stockage (données + journaux)
  • Interdiction de perdre un journal
  • Risque d’accumulation des journaux
    • dans pg_wal/ si échec d’archivage… et arrêt si plein !
    • dans le dépôt d’archivage si échec des sauvegardes
  • Plus complexe

Copie physique à chaud ponctuelle avec pg_basebackup

(Non PITR)

Introduction à pg_basebackup

  • Simple & efficace
  • Fourni avec PostgreSQL
  • Réalise les 2 étapes d’une sauvegarde
    • « base backup »
    • journaux nécessaires (mais pas plus)
    • fichiers ou archives
  • Pas de reprise si échec
  • Pas de PITR
    • peut servir de base
  • Configuration : streaming (rôle, droits, slots)
$ pg_basebackup --format=tar --wal-method=stream \
 --checkpoint=fast --progress -h 127.0.0.1 -U sauve \
 -D /var/lib/postgresql/backups/
  • Restauration : décompresser/copier la sauvegarde

Archivage des journaux & archiver

Rappel des étapes d’une sauvegarde PITR

  • D’abord :
    • archivage des journaux de transactions
  • Puis : sauvegarde des fichiers
    • pg_basebackup
    • ou manuellement (outils de copie classiques)

Méthodes d’archivage

Deux méthodes :

  • Généralement :
    • processus interne archiver
  • Alternative :
    • pg_receivewal (flux de réplication)

Choix du répertoire d’archivage

  • À faire quelle que soit la méthode d’archivage
  • Attention aux droits d’écriture dans le répertoire
    • la commande configurée pour la copie doit pouvoir écrire dedans
    • et potentiellement y lire

Processus archiver : configuration (1/4)

Préalables :

  • Dans postgresql.conf :
    • wal_level = replica
    • archive_mode = on (ou always)

Processus archiver : configuration (2/4)

La commande d’archivage :

  • Dans postgresql.conf :
    • archive_command = '… une commande …'
    • ou : archive_library = '… une bibliothèque …' (v15+)

Processus archiver : configuration (3/4)

  • Exemples d’archive_command :
archive_command='cp %p /mnt/nfs1/archivage/%f && sync /mnt/nfs1/'
archive_command='test ! -f /arch/%f && cp %p /arch/%f'
archive_command='/usr/bin/rsync -az %p postgres@10.9.8.7:/archives/%f'
archive_command='/opt/mon_script.sh %p %f'
archive_command='/usr/bin/pgbackrest --stanza=prod archive-push %p'
archive_command='/usr/bin/barman-wal-archive backup prod %p'
archive_command='/bin/true'  # désactivation
  • Ne pas oublier de forcer l’écriture de l’archive sur disque
  • Code retour de l’archivage entre 0 (ok) et 125

Processus archiver : configuration (4/4)

  • Dans postgresql.conf (suite) :
    • période maximale entre deux archivages
    • archive_timeout = '… min'

Processus archiver : lancement

  • Redémarrage de PostgreSQL
    • si modification de wal_level et/ou archive_mode
  • ou rechargement de la configuration

Processus archiver : supervision

  • Vue pg_stat_archiver
  • pg_wal/archive_status/
    • fichiers .ready et .done
  • Archivage dans l’ordre des fichiers
  • Taille de pg_wal
    • si saturation : Arrêt !
  • Traces

Archivage avec pg_receivewal

pg_receivewal : principe

  • Alternative à archive_command
  • Copie les journaux via le protocole de réplication
    • au fil de l’eau
  • Slot de réplication obligatoire
  • Synchrone possible
  • Pour RPO à 0 sans secondaire

Sauvegarde PITR manuelle

Étapes d’une sauvegarde PITR manuelle

  • 3 étapes :
    • fonction de démarrage
    • copie des fichiers par outil externe
    • fonction d’arrêt
  • Exclusive : simple… & obsolète ! (< v15)
  • Concurrente : plus complexe à scripter
  • Aucun impact pour les utilisateurs ; pas de verrou
  • Préférer des outils dédiés qu’un script maison

Sauvegarde manuelle - 1/3 : pg_backup_start

SELECT pg_backup_start (

  • un_label : texte
  • fast : forcer un checkpoint ?

)

Sauvegarde manuelle - 2/3 : copie des fichiers

  • Cas courant : snapshot
    • cohérence ? redondance ?
  • Sauvegarde des fichiers à chaud
    • répertoire principal des données
    • tablespaces
  • Copie forcément incohérente (la restauration des journaux corrigera)
  • rsync et autres outils
  • Ignorer :
    • postmaster.pid, log, pg_wal, pg_replslot et quelques autres
  • Ne pas oublier : configuration !

Sauvegarde manuelle - 3/3 : pg_backup_stop

Ne pas oublier !!

SELECT * FROM pg_backup_stop (

  • true : attente de l’archivage

)

Sauvegarde de base à chaud : pg_basebackup

Outil de sauvegarde pouvant aussi servir au sauvegarde basique

  • Backup de base ici sans les journaux :
$ pg_basebackup --format=tar --wal-method=none \
 --checkpoint=fast --progress -h 127.0.0.1 -U sauve \
 -D /var/lib/postgresql/backups/

Fréquence de la sauvegarde de base

  • Dépend des besoins
  • De tous les jours à tous les mois
  • Plus elles sont espacées, plus la restauration est longue
    • et plus le risque d’un journal corrompu ou absent est important

Suivi de la sauvegarde de base

  • Vue pg_stat_progress_basebackup
SELECT *, pg_size_pretty (backup_total) AS total,
round(100.0*backup_streamed/backup_total::numeric,2) AS "%"
FROM  pg_stat_progress_basebackup  \gx
-[ RECORD 1 ]--------+-------------------------
pid                  | 3608155
phase                | streaming database files
backup_total         | 925114368
backup_streamed      | 197094400
tablespaces_total    | 1
tablespaces_streamed | 0
total                | 882 MB
%                    | 21.30

Restaurer une sauvegarde PITR

Simple, mais à appliquer rigoureusement

Exemple de scénario : sauvegarde

Exemple de scénario : restauration

Restaurer une sauvegarde PITR (1/5)

  • S’il s’agit du même serveur
    • arrêter PostgreSQL
  • Nettoyer les répertoires des données
    • y compris les tablespaces
    • sauf outil travaillant en mode delta

Restaurer une sauvegarde PITR (2/5)

  • Restaurer les fichiers de la sauvegarde
    • où ? (pas à la racine)
  • Peut-être besoin de nettoyer les fichiers restaurés
    • ex : pg_wal, postmaster.pid, log/
    • un bon outil ne les a pas copiés
  • Si restauration après crash :
    • récupérer le dernier journal de transactions connu (si disponible)

Restaurer une sauvegarde PITR (3/5)

  • Indiquer qu’on est en restauration
    • fichier vide recovery.signal
  • Commande de restauration
    • restore_command = '… une commande …'
    • directement dans pg_wal/
    • dans postgresql.[auto.]conf

Restaurer une sauvegarde PITR (4/5)

  • Jusqu’où restaurer :
    • recovery_target_name, recovery_target_time
    • recovery_target_xid, recovery_target_lsn
    • recovery_target_inclusive
  • Le backup de base doit être antérieur !
  • Suivi de timeline :
    • recovery_target_timeline : latest (en général)
  • Et on fait quoi ?
    • recovery_target_action : pause
    • pg_wal_replay_resume pour ouvrir immédiatement
    • ou modifier & redémarrer

Restaurer une sauvegarde PITR (5/5)

  • Démarrer PostgreSQL
  • Rejeu des journaux
  • Vérifier que le point de cohérence est atteint !
  • Ne jamais effacer recovery.signal volontairement

Restauration PITR : durée

  • Durée dépendante du nombre de journaux
    • rejeu séquentiel des WAL
  • Accéléré en version 15 (prefetch)

Restauration PITR : différentes timelines

  • Fin de recovery => changement de timeline :
    • l’historique des données prend une autre voie
    • le nom des WAL change (ex : 00000002000000000000000C)
    • fichiers .history
  • Permet plusieurs restaurations PITR à partir du même basebackup
  • Choix :recovery_target_timeline
    • défaut : latest

Restauration PITR : illustration des timelines

Après la restauration

  • Bien vérifier que l’archivage a repris
    • et que les archives des journaux sont complètes
  • Ne pas hésiter à reprendre une sauvegarde complète
  • Bien vérifier que les secondaires ont suivi

Archivage & compression

  • Limiter la volumétrie des journaux sauvegardés
  • Quels sont les outils PITR ?

Réduire le nombre de journaux sauvegardés

  • Monter
    • checkpoint_timeout
    • max_wal_size

Compresser les journaux de transactions

  • wal_compression = on
    • moins de journaux
    • un peu plus de CPU
    • à activer : pglz (on), lz4, zstd (v15+)
  • Outils de compression standards : gzip, bzip2, lzma
    • attention à ne pas ralentir l’archivage

Outils de sauvegarde PITR

  • Ne réinventez pas la roue !
  • Avantage des outils éprouvés :
    • gestion des backups & de leur rétention
    • commande sûre pour l’archivage
    • commandes pour la restauration
    • nombreuses optimisations
    • tranquillité d’esprit

pgBackRest

  • Gère la sauvegarde et la restauration PITR
    • pull ou push, multidépôts
    • mono- ou multiserveur
  • Indépendant des commandes système
    • protocole dédié
  • Sauvegardes complètes, différentielles ou incrémentales
  • Compression, multi-dépôts
  • Multithread, sauvegarde depuis un secondaire, archivage asynchrone…
  • Projet mature

barman

  • Gère la sauvegarde et la restauration
    • mode pull
    • multiserveurs
  • Une seule commande (barman)
  • Et de nombreuses actions
    • list-server, backup, list-backup, recover
  • Utilise pg_basebackup, pg_receivewal
  • Utilisé par CloudNativePG

WAL-G

  • Successeur de WAL-E, par Citus Data & Yandex
  • Orientation cloud
  • Aussi pour MySQL et SQL Server

Autres outils de l’écosystème

  • De nombreux autres outils existent
  • …ou ont existé
    • pitrery, WAL-E, OmniPITR, pg_rman, walmgr…

Définir ses besoins

  • Sauvegardes physiques ? Logiques ?
  • Sauvegarde locale (NFS ?) / distante (SSH ? S3 ?)
  • Push/pull ?
  • Ressources à disposition ?
  • Accès ? OS/environnement ?
  • Rétention ?
  • Compression ? Performances ?
  • Pérennité, historique ?
  • Supervision ?

Conclusion

  • Une sauvegarde
    • fiable
    • éprouvée
    • rapide
    • continue
  • Mais
    • plus complexe à mettre en place que pg_dump
    • qui restaure toute l’instance

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux pratiques

pg_basebackup : sauvegarde ponctuelle & restauration

pg_basebackup : sauvegarde ponctuelle & restauration des journaux suivants

Travaux pratiques (solutions)