Sauvegarde et restauration

Module I1

Dalibo SCOP

24.04

17 avril 2024

Sur ce document

Formation Module I1
Titre Sauvegarde et restauration
Révision 24.04
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 12 à 16.

PostgreSQL : Sauvegarde et restauration

PostgreSQL

Introduction

  • Opération essentielle 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
  • Sauvegarde physique à froid des fichiers

Sauvegardes logiques

  • À 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 - Format de sortie

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

Choix du format de sortie

  • Format plain (SQL)
    • restaurations partielles très difficiles (ou manuelles)
  • Parallélisation du dump
    • uniquement format directory
  • Utilisez les formats binaires
pg_dump -Fc
pg_dump -Fd
  • Et en compléments, les objets globaux
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 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

pg_dump - Sélection de sections

  • --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

pg_dump - Option de parallélisation

  • --jobs <nombre_de_threads>
  • format directory (-Fd) uniquement

pg_dump - Options diverses

  • --create (-C) : recréer la base

    • y compris paramétrage utilisateur sur base (>v11 et format plain)
    • inutile dans les autres formats
  • --no-owner : ignorer le propriétaire

  • --no-privileges : ignorer les droits

  • --no-tablespaces : ignorer les tablespaces

  • --inserts : remplacer COPY par INSERT

  • --rows-per-insert , --on-conflict-do-nothing

  • divers paramètres pour les tables partitionnées

  • -v : progression

pg_dumpall

  • Sauvegarde d’une instance complète
    • objets globaux (utilisateurs, tablespaces…)
    • toutes les bases de données
  • Format texte (SQL) uniquement

pg_dumpall - Fichier ou sortie standard

  • -f nomfichier.dmp
    • fichier de la sauvegarde
  • ou -f -
    • sortie standard

pg_dumpall - Sélection des objets

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

pg_dumpall - Exclure une base

  • --exclude-database (v12+)

pg_dumpall - Options diverses

  • Quelques options partagées avec pg_dump
  • Très peu utilisées

pg_dump/pg_dumpall - Options de connexions

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

Impact des privilèges

  • 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)

Traiter automatiquement la sortie

  • Pour compresser 1 fichier : pg_dump | bzip2
    • utile avec formats plain,tar,custom
  • Outils multi-threads de compression, bien plus rapides :
    • pbzip2, pigz
    • xz, zstd

Objets binaires

  • Deux types dans PostgreSQL : bytea et Large Objects
  • Option -b
    • uniquement si utilisation des options -n/-N et/ou -t/-T
  • Option --no-blobs
    • pour ne pas sauvegarder les Large Objects
  • Option bytea_output
    • escape
    • hex

Extensions

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

Restauration d’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

psql - Options

  • -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 - 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

pg_restore - Fichiers en entrée / sortie

  • Entrée : Fichier à restaurer en dernier argument de la ligne de commande
  • Sortie :
    • -f : fichier SQL ou liste (-l)
    • sortie standard : défaut si < v12, sinon -f -
  • 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

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 - Option de parallélisation

  • -j <nombre_de_threads>
    • 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 le tablespace
  • -1 (--single-transaction) : pour tout restaurer en une seule transaction
  • -c (--clean) : pour détruire un objet avant de le restaurer

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
  • 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
  • Outils client >= v11
    • sinon reprendre les paramètres des rôles sur les bases :
    ALTER role xxx IN DATABASE xxx SET param=valeur;
  • 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+)

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

  • 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 des fichiers par snapshot de partition

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

Sauvegarde à chaud des fichiers avec PostgreSQL

  • PITR : Point In Time Recovery
    • nécessite d’avoir activé l’archivage des WAL
    • technique avancée, complexe à mettre en place et à maintenir
    • pas de coupure de service
    • outils dédiés (pgBackRest, barman)
  • pg_basebackup
    • sauvegarde ponctuelle

Recommandations générales

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

Matrice

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)