Sauvegarde et restauration

Module I1

Dalibo SCOP

24.12

18 décembre 2024

Sur ce document

Formation Module I1
Titre Sauvegarde et restauration
Révision 24.12
PDF https://dali.bo/i1_pdf
EPUB https://dali.bo/i1_epub
HTML https://dali.bo/i1_html
Slides https://dali.bo/i1_slides
TP https://dali.bo/i1_tp
TP (solutions) https://dali.bo/i1_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
  • 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 13 à 17.

PostgreSQL : Sauvegarde et restauration

PostgreSQL

Introduction

Les sauvegardes sont essentielles pour la sécurisation des données :

  • PostgreSQL propose différentes solutions
    • de sauvegarde à froid ou à chaud, mais cohérentes
    • des méthodes de restauration partielle ou complète

Au menu

  • Sauvegardes logiques
    • et restauration
  • Sauvegarde physique à froid des fichiers
  • Sauvegardes à chaud

Sauvegardes logiques

Sauvegardes logiques : caractéristiques

  • À chaud
  • Cohérente
  • Locale ou à distance
  • 2 outils
    • pg_dump
    • pg_dumpall
  • Pas d’impact sur les utilisateurs
    • sauf certaines opérations DDL
  • Jamais inclus :
    • tables systèmes
    • fichiers de configuration

pg_dump

  • Sauvegarde une base de données :
  pg_dump nombase > nombase.dump
  • Sauvegarde complète ou partielle

pg_dump : formats de sauvegarde

Format Dump Restore
plain (SQL) pg_dump -Fp ou pg_dumpall psql
tar pg_dump -Ft pg_restore
custom pg_dump -Fc pg_restore
directory pg_dump -Fd pg_restore

pg_dump : choisir le format de sauvegarde

  • Format plain (SQL)
    • restaurations partielles très difficiles (ou manuelles)
  • Parallélisation de la sauvegarde :
    • uniquement format directory
  • Préférer les formats binaires
pg_dump -Fc
pg_dump -Fd
  • Ajouter les objets globaux (rôles…)
pg_dumpall -g

pg_dump : compression

  • -z/--compress : compression par zlib
    • de 0 à 9 (défaut : 6)
  • (v16) mieux : zstd, lz4
pg_dump -Z1  # gzip
# v16+
pg_dump -Z gzip:3
pg_dump -Z lz4:'level=12'
pg_dump -Z zstd:'level=22,long'

pg_dump : fichier ou sortie standard

  • -f : fichier/répertoire où stocker la sauvegarde
  • sinon : sortie standard

pg_dump : structure ou données

  • --schema-only / -s : uniquement la structure
  • --data-only / -a : uniquement les données ou :
  • --section
    • pre-data : définition des objets (hors contraintes et index)
    • data : les données
    • post-data : définition des contraintes et index

pg_dump : sélection d’objets

  • -n <schema> : uniquement ce schéma
  • -N <schema> : tous les schémas sauf celui-là
  • -t <table> : uniquement cette relation (sans dépendances !)
  • -T <table> : toutes les tables sauf celle-là
  • En option
    • possibilité d’en mettre plusieurs
    • exclure les données : --exclude-table-data=<table>
    • avoir une erreur si l’objet est inconnu : --strict-names
  • --filter & fichier avec include/exclude des objets (v17)
  • Attention : pas de dépendance automatique si sélection !

pg_dump : parallélisation

  • --jobs <nombre_de_threads>
  • Format directory (-Fd) uniquement
  • Granularité : la table
    • optimal quand la volumétrie est bien répartie

pg_dump : objets binaires

  • Deux types dans PostgreSQL :
    • bytea
    • Large Objects
  • Option --large-objects
    • si filtrage (-n/-N/-t/-T/--filter)
  • Option --no-blobs
    • pour ne pas sauvegarder les Large Objects
  • Option bytea_output
    • escape
    • hex

pg_dump : extensions

  • --extension (-e)
    • uniquement si sélection/exclusion (-n/-N et/ou -t/-T)
  • --exclude-extension (v17)

pg_dump : options diverses

  • --create (-C) : recréer la base
    • y compris paramétrage utilisateur sur base (format plain)
    • inutile dans les autres formats
  • --no-owner, --no-privileges
  • --no-tablespaces
  • --inserts/--rows-per-insert : INSERT au lieu de COPY
  • --on-conflict-do-nothing
  • divers paramètres pour les tables partitionnées
  • -v : progression

pg_dumpall

  • Outil dédié à la sauvegarde d’une instance complète
    • objets globaux (utilisateurs, tablespaces…)
    • toutes les bases de données
    • sauf --exclude-database
  • Format texte (SQL) uniquement (--f nomfichier.dmp)

pg_dumpall : sélection des objets

  • -g : tous les objets globaux (conseillé)
  • -r : uniquement les rôles
  • -t : uniquement les tablespaces
  • --no-role-passwords : sans les mots de passe
    • permet de ne pas être superutilisateur

pg_dump/pg_dumpall : options de connexions

  • -h / $PGHOST (serveur ou socket Unix)
  • -p / $PGPORT (5432)
  • -U / $PGUSER (utilisateur du système)
  • -W/ $PGPASSWORD
    • ou .pgpass

pg_dump/pg_dumpall : privilèges nécessaires

  • Les outils se comportent comme des clients pour PostgreSQL
  • Préférer un rôle superutilisateur
  • Sinon :
    • connexion à autoriser
    • le rôle doit pouvoir lire tous les objets à exporter (pg_read_all_data)

pg_dump/pg_dumpall : compresser la sortie

  • Compresser 1 fichier
    • utile avec formats plain,tar,custom
    pg_dump | bzip2
  • Outils multithreads de compression, bien plus rapides :
    • pbzip2, pigz
    • xz, zstd

Restauration d’une sauvegarde logique

Quel outil pour restaurer une sauvegarde logique ?

  • psql
    • restauration de SQL (option -Fp) :
  • pg_restore
    • restauration binaire (-Ft/-Fc/-Fd)

psql

  • Client standard PostgreSQL
  • Capable d’exécuter des requêtes
    • donc de restaurer une sauvegarde texte (plain)
  • Très limité dans les options de restauration
    • ni sélection ni parallélisation

psql : options pour une restauration

  • -f
    • pour indiquer le fichier contenant la sauvegarde
    • sans -f : lit l’entrée standard
  • -1 (--single-transaction)
    • pour tout restaurer en une seule transaction
  • -e
    • pour afficher les ordres SQL exécutés
  • ON_ERROR_ROLLBACK/ON_ERROR_STOP

pg_restore

  • Restaure uniquement les sauvegardes au format binaire
    • format autodétecté (-F inutile)
  • Nombreuses options très intéressantes
  • Restaure une base de données
    • complètement ou partiellement

pg_restore : indiquer la base de données

  • -d : base de données de connexion
  • -C (--create) :
    • connexion (-d) et CREATE DATABASE
    • connexion à la nouvelle base et exécute le SQL
    • aussi : --clean --if-exists

pg_restore : fichiers en entrée/sortie

  • Entrée : Fichier à restaurer en dernier argument de la ligne de commande
  • Sortie :
    • -l : liste
    • -f : fichier SQL
    • -f - pour sortie standard
  • Attention à ne pas écraser la sauvegarde !

pg_restore : structure ou données

  • --schema-only : uniquement la structure
  • --data-only : uniquement les données

ou :

  • --section
    • pre-data
    • data
    • post-data

pg_restore : sélection d’objets

  • -n <schema> : uniquement ce schéma
  • -N <schema> : tous les schémas sauf ce schéma
  • -t <table> : cette relation
  • -T <trigger> : ce trigger
  • -I <index> : cet index
  • -P <fonction> : cette fonction
  • En option
    • possibilité d’en mettre plusieurs
    • --strict-names, pour avoir une erreur si l’objet est inconnu
  • --filter & fichier avec include/exclude des objets (v17)

pg_restore : sélection avancée

  • -l : récupération de la liste des objets
  • -L <liste_objets> : restauration uniquement des objets listés dans ce fichier

pg_restore : parallélisation

  • --jobs <nombre_de_threads> / -jN
    • formats custom ou directory

pg_restore : options diverses

  • -O/--no-owner : ignorer le propriétaire
  • -x/--no-privileges : ignorer les droits
  • --no-comments : ignorer les commentaires
  • --no-tablespaces : ignorer les tablespaces
  • -1/--single-transaction : tout restaurer en une seule transaction
    • ou --transaction-size = N pour regrouper les ordres (v17)
  • -c/--clean --if-exists : détruire un objet avant de le restaurer
  • -v/--verbose

Autres considérations sur la sauvegarde logique

  • Versions des outils & version du serveur
  • Script de sauvegarde
  • Sauvegarder sans passer par un fichier
  • Statistiques et maintenance après import
  • Durée d’exécution d’une sauvegarde
  • Taille d’une sauvegarde

Versions des outils clients et version de l’instance

  • pg_dump :
    • reconnaît les versions de PG antérieures
    • serveur 9.2 minimum si pg_dump récent (v15+)
  • pg_restore
    • minimum la version du pg_dump utilisé
    • si possible celle du serveur cible
  • Pas de problème entre OS différents

Script de sauvegarde idéal

  • Objets globaux :
pg_dumpall -g
  • Chaque base :
pg_dump -Fc
pg_dump -Fd
  • Bien tester !

pg_back - Présentation

  • https://github.com/orgrim/pg_back
  • Type de sauvegardes : logiques (pg_dump)
  • Langage : bash (v1) / go (v2)
  • Licence : BSD (libre)
  • Type de stockage : local + export cloud
  • Planification : crontab
  • Unix/Linux (v1 & 2) / Windows (v2)
  • Compression : via pg_dump
  • Versions compatibles : toutes
  • Rétention : durée

Sauvegarde et restauration sans fichier intermédiaire

  • pg_dump -Fp | psql
  • pg_dump -Ft | pg_restore
  • pg_dump -Fc | pg_restore
  • Utilisation des options -h, -p, -d
  • Attention à la gestion des erreurs !

Statistiques et maintenance après import

  • Statistiques non sauvegardées
    • ANALYZE impérativement après une restauration !
  • Pour les performances :
    • VACUUM (ou VACUUM ANALYZE)
  • À plus long terme :
    • VACUUM FREEZE

Durée d’exécution

  • Difficile à chiffrer
  • Dépend de l’activité sur le serveur
  • Option -v
  • Suivre les COPY
    • vue pg_stat_progress_copy (v14+)
  • Suivre l’indexation
    • vue pg_stat_progress_create_index

Taille d’une sauvegarde logique

  • Difficile à évaluer
  • Contenu des index non sauvegardé
    • donc sauvegarde plus petite
  • Objets binaires :
    • entre 2 et 4 fois plus gros
    • donc sauvegarde plus grosse

Avantages de la sauvegarde logique

  • Simple et rapide
  • Sans interruption de service
  • Indépendante de la version de PostgreSQL
  • Granularité de sélection à l’objet
  • Taille réduite
  • Ne conserve pas la fragmentation des tables et des index
  • Éventuellement depuis un serveur secondaire

Inconvénients de la sauvegarde logique

  • Durée : dépendante des données et de l’activité
  • Restauration : uniquement au démarrage de l’export
  • Efficace si < 200 Go
  • Plusieurs outils pour sauvegarder une instance complète
  • ANALYZE, VACUUM ANALYZE, VACUUM FREEZE après import

Sauvegarde physique à froid des fichiers

Sauvegarde physique à froid : principe

  • Instance arrêtée : sauvegarde cohérente
  • Ne pas oublier : journaux, tablespaces, configuration !
  • Outils : système, aucun spécifique à PostgreSQL
    • cp, tar
    • souvent : rsync en 2 étapes : à chaud puis à froid
    • snapshots SAN/LVM (attention à la cohérence)

Avantages des sauvegardes à froid

  • Simple
  • Rapide à la sauvegarde
  • Rapide à la restauration
  • Beaucoup d’outils disponibles

Inconvénients des sauvegardes à froid

  • Arrêt de la production
  • Sauvegarde de l’instance complète (donc aucune granularité)
  • Restauration de l’instance complète
  • Conservation de la fragmentation
  • Impossible de changer d’architecture
    • Réindexation si changement OS

Diminuer l’immobilisation

  • Utilisation de rsync
  • Une fois avant l’arrêt
  • Une fois après

Sauvegarde à chaud

Snapshot, ou les outils de PostgreSQL ?

Sauvegarde à chaud des fichiers par snapshot de partition : principe

  • Avec certains systèmes de fichiers
  • Avec LVM
  • Avec la majorité des SAN
  • Attention : cohérence entre partitions

Sauvegarde à chaud des fichiers avec PostgreSQL

  • pg_basebackup
    • sauvegarde ponctuelle
  • PITR : Point In Time Recovery
    • restauration à la transaction près
    • technique avancée, complexe à mettre en place et à maintenir
    • pas de coupure de service
    • outils dédiés (pgBackRest, barman)
    • et archivage des journaux de transaction
    • outils conseillés : pgBackRest, barman

Recommandations générales

  • Prendre le temps de bien choisir sa méthode
  • Ne pas oublier les fichiers de configuration
  • Bien la tester
  • Bien tester la restauration
  • Et tester régulièrement !

Matrice des options de sauvegarde

Simplicité Coupure Restauration Fragmentation
copie à froid facile longue rapide conservée
snapshot FS facile aucune rapide conservée
pg_dump facile aucune lente perdue
rsync + copie à froid moyen courte rapide conservée
PITR difficile aucune rapide conservée

Conclusion

  • Plusieurs solutions pour la sauvegarde et la restauration
  • Sauvegarde/Restauration complète ou partielle
  • Toutes cohérentes
  • La plupart à chaud
  • Méthode de sauvegarde avancée : PITR

Questions

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

Quiz

Travaux pratiques

Sauvegardes logiques

Restaurations logiques

Sauvegarde et restauration partielle

(Optionnel) Sauvegarde et restauration par parties avec modification

(Optionnel) Sauvegardes d’objets isolés

Travaux pratiques (solutions)