Gestion des sauvegardes
Sauvegardes logiques avec pg_dump
Nous allons nous familiariser avec l'outil pg_dump. Pour ce faire, nous allons utiliser le dataset Pagila.
Rappels sur les options de pg_dump
# Options communes aux outils postgres
-d nom de la base
-h nom d'hôte de l'instance
-p port de l'instance
-U nom d'utilisateur
-W demander le mot de passer à la connexion
# Options propres à pg_dump
-f écrire le résultat du dump dans un fichier/répertoire spécifié
-F c|d|t|p format de sortie (custom, directory, tar, sql)
-j nombre de jobs à exécuter en parallèle
-Z (0-9) niveau de compression
-a uniquement les données
-s uniquement la structure
-t une table en particulier
-n un schema en particulier
Ex :
pg_dump -d pagila -F p -f pagila.sql
Réaliser les sauvegardes suivantes :
- Sauvegarde complète de la base au format SQL
- Même sauvegarde mais avec un facteur de compression.
Quel est le contenu du fichier résultant ? Comment récupérer le fichier sous format lisible ?
- Sauvegarde complète de la base, au format Custom
Ouvrir les fichiers de sauvegarde au format SQL et au format Custom, comparer le contenu de chaque.
- Sauvegarde complète de la base, au format directory
- Sauvegarde partielle de la base, seulement les tables
film
,actor
etcountry
Comment s'assurer que toutes les tables demandées sont bien sauvegardées ? Essayer de sauvegarde une table qui n'existe pas. Essayer à nouveau avec l'option --strict-names
.
Sauvegardes multi-schéma :
Créer un schéma supplémentaire test_dump
et deux tables test_table1
et test_table2
à l'intérieur.
CREATE SCHEMA test_dump;
CREATE TABLE test_dump.test_table1 (num1 bigint, num2 double precision, num3 double precision);
CREATE TABLE test_dump.test_table2 (num1 bigint, num2 double precision, num3 double precision);
Réaliser les sauvegardes :
- Sauvegarde partielle au format directory contenant la structure seule des tables
test_table1
etactor
Bien penser à l'option --strict-names pour s'assurer de bien sauvegarder les tables.
-
Sauvegarde partielle au format directory contenant la structure seule des tables du schéma
test_dump
dont le nom commence partest_
-
Sauvegarde partielle au format SQL de la table
payments
Ouvrir le fichier SQL issu de cette sauvegarde. Les données ne sont pas présentes à l'intérieur, pourquoi ?
Payments est une table partitionnée, ses données sont réparties dans les tables enfant payment_p2020_01/02/03 etc.
- Sauvegarder l'ensemble des tables payments au format SQL. Comparer le SQL générer avec le précédent.
Parallelisation des sauvegardes :
Nous allons insérer quelques données dans les tables de test créees précedemment :
INSERT INTO test_dump.test_table1 (num1, num2, num3)
SELECT round(random()*10), random(), random()*142
FROM generate_series(1, 2000000) s(i);
INSERT INTO test_dump.test_table2 (num1, num2, num3)
SELECT round(random()*10), random(), random()*142
FROM generate_series(1, 2000000) s(i);
Nous allons réaliser deux sauvegardes en mesurant le temps d'exécution de la commande pg_dump : time pg_dump ....
- Sauvegarde partielle au format directory du schema
test_dump
, sans parallelisation - Sauvegarde partielle au format directory du schema
test_dump
, avec parallelisation = 2
Comparer les temps d'exécution puis réaliser les deux sauvegardes suivantes :
- Sauvegarde partielle au format directory de la table
test_dump.test_table1
, sans parallelisation - Sauvegarde partielle au format directory de la table
test_dump.test_table1
, avec parallelisation = 2
Restauration des sauvegardes
Restauration avec psql
La restauration des sauvegardes au format SQL est très simple et se fait avec psql.
Nous allons pour commencer créer une base dédiée à la restauration.
Nuance méconnue, les templates de création de base pouvant contenir des spécificités, il est conseillé de créer une base basée sur
template0
pour qu'elle soit complètement vide et éviter les conflits.
CREATE DATABASE formation_restore TEMPLATE template0;
Il suffit ensuite de se connecter à cette base avec psql et d'exécuter le fichier de sauvegarde :
psql -d formation_restore -f formation.sql
ou
$ psql -d formation_restore
formation_restore=# \i formation.sql
Restauration avec pg_restore
Nous allons mettre en oeuvre les différentes possibilités de restauration avec pg_restore.
Pour se faire nous allons travailler avec une sauvegarde complète de notre base au format Custom
pg_dump -d formation -F c -f formation.dump
Rappel de quelques options utiles de pg_restore
:
-d restaurer dans cette base de données
-f écrire le résultat de la restauration dans un fichier
-a restaurer uniquement les données
-n restaurer uniquement ce schema
-t restaurer uniquement cette table
-l afficher la table des matières de l'archive
-e s'arrêter à la première erreur
-c supprimer les objets avant des les restaurer
-C créer la base avant de restaurer à l'intérieur
Effectuer les opérations suivantes :
- Créer la base
formation_restore2
à la main puis restaurer dans les données dans cette base avec pg_restore - Répéter la dernière restauration telle quelle. Un nombre considérable d'erreurs doivent s'afficher
- Répéter la dernière restauration en ajoutant l'option -e (--exit-on-error)
À partir de maintenant, on s'arrête dès qu'une erreur se produit. C'est mieux, mais cela peut malgré tout laisser la base dans un état incohérent après une restauration partielle. Pour s'en convaincre, on peut exécuter la commande de restauration encore une fois, l'erreur sera différente.
Pour se prémunir de cet effet, le mieux est d'exécuter la restauration dans une seule transaction.
- Supprimer et recréer la base
formation_restore2
- Reprendre la commande précédente, en ajoutant
--single-transaction
, et l'exécuter plusieurs fois de suite
L'erreur doit toujours être la même.
Nous allons maintenant réaliser une restauration partielle en utilisant la table des matières du fichier dump.
Nous devons d'abord écrire cette table des matières dans un fichier :
pg_restore -l formation.dump > formation.toc
- Ouvrir le fichier
formation.toc
- Commenter toutes les lignes (ajouter un
;
devant chaque ligne) - Utiliser pg_restore pour créer un fichier
formation-restore-preview.sql
qui contient les commandes SQL qui seraient exécutées pour effectuer cette restauration
Ce fichier doit être vide car nous avons commenté toutes les lignes
- Décommenter les lignes dans
formation.toc
de sorte à ce que nous restorions la tablefilm
et son contenu - Générer à nouveau le fichier
formatoin-restore-preview.sql
- Vérifier qu'il contient bien la structure de la table
film
et son contenu