23. Sauvegardes et restaurations

23.1. Sauvegarde SQL
23.2. Sauvegarde de niveau système de fichiers
23.3. Archivage continu et récupération d'un instantané (PITR)
23.4. Serveurs de secours semi-automatique (Warm Standby) pour la haute disponibilité
23.5. Migration entre versions

Comme tout ce qui contient des données importantes, les bases de données PostgreSQL™ doivent être sauvegardées régulièrement. Bien que la procédure soit assez simple, il est important de comprendre les techniques et hypothèses sous-jacentes.

Il y a trois approches fondamentalement différentes pour sauvegarder les données de PostgreSQL™ :

Chacune a ses avantages et ses inconvénients.

23.1. Sauvegarde SQL

Le principe est de produire un fichier texte de commandes SQL (appelé « fichier dump »), qui, si on le renvoie au serveur, recrée une base de données identique à celle sauvegardée. PostgreSQL™ propose pour cela le programme utilitaire pg_dump(1). L'usage basique est :

pg_dump base_de_donnees > fichier_de_sortie

pg_dump écrit son résultat sur la sortie standard. Son utilité est expliqué plus loin.

pg_dump est un programme client PostgreSQL™ classique (mais plutôt intelligent). Cela signifie que la sauvegarde peut être effectuée depuis n'importe quel ordinateur ayant accès à la base. Mais pg_dump n'a pas de droits spéciaux. Il doit, en particulier, avoir accès en lecture à toutes les tables à sauvegarder, si bien qu'il doit être lancé pratiquement toujours en tant que superutilisateur de la base.

Pour préciser le serveur de bases de données que pg_dump doit contacter, on utilise les options de ligne de commande -h serveur et -p port. Le serveur par défaut est le serveur local ou celui indiqué par la variable d'environnement PGHOST. De la même façon, le port par défaut est indiqué par la variable d'environnement PGPORT ou, en son absence, par la valeur par défaut précisée à la compilation. Le serveur a normalement reçu les mêmes valeurs par défaut à la compilation.

Comme tout programme client PostgreSQL™, pg_dump se connecte par défaut avec l'utilisateur de base de données de même nom que l'utilisateur système courant. L'utilisation de l'option -U ou de la variable d'environnement PGUSER permettent de modifier le comportement par défaut. Les connexions de pg_dump sont soumises aux mécanismes normaux d'authentification des programmes clients (décrits dans le Chapitre 20, Authentification du client).

Les sauvegardes créées par pg_dump sont cohérentes, ce qui signifie que les modifications effectuées alors que pg_dump est en cours de fonctionnement ne sont pas reprises dans le fichier de résultat. pg_dump ne bloque pas les autres opérations sur la base lorsqu'il fonctionne (sauf celles qui nécessitent un verrou exclusif, comme VACUUM FULL.)

[Important]

Important

Si la base de données utilise les OID (par exemple en tant que clés étrangères), il est impératif d'indiquer à pg_dump de sauvegarder aussi les OID. Pour cela, on utilise l'option -o sur la ligne de commande.

23.1.1. Restaurer la sauvegarde

Les fichiers texte créés par pg_dump peuvent être lus par le programme psql. La syntaxe générale d'une commande de restauration est

psql base_de_donnees < fichier_d_entree

fichier_d_entree est celui précisé comme fichier_de_sortie à la commande pg_dump. La base de données base_de_donnees n'est pas créée par cette commande. Elle doit être créée à partir de template0 avant d'exécuter psql (par exemple avec createdb -T template0 base_de_donnees). psql propose des options similaires à celles de pg_dump pour indiquer le serveur de bases de données sur lequel se connecter et le nom d'utilisateur à utiliser. La page de référence de psql(1) donne plus d'informations.

Tous les utilisateurs possédant des objets ou ayant certains droits sur les objets de la base sauvegardée doivent exister préalablement à la restauration de la sauvegarde. S'ils n'existent pas, la restauration échoue pour la création des objets dont ils sont propriétaires ou sur lesquels ils ont des droits (quelque fois, cela est souhaitable mais ce n'est habituellement pas le cas).

Par défaut, le script psql continue de s'exécuter après la détection d'une erreur SQL. La commande suivante peut être placée au début du script pour modifier ce comportement. psql quitte alors avec un code d'erreur 3 si une erreur SQL survient :

\set ON_ERROR_STOP

Dans tous les cas, une sauvegarde partiellement restaurée est obtenue. Si cela n'est pas souhaitable, il est possible d'indiquer que la sauvegarde complète doit être restaurée au cours d'une transaction unique. De ce fait, soit la restauration est validée dans son ensemble, soit elle est entièrement annulée. Ce mode est choisi en passant l'option -1 ou --single-transaction en ligne de commande à psql. Dans ce mode, la plus petite erreur peut annuler une restauration en cours depuis plusieurs heures. Néanmoins, c'est probablement préférable au nettoyage manuel d'une base rendue complexe par une sauvegarde partiellement restaurée.

La capacité de pg_dump et psql à écrire et à lire dans des tubes permet de sauvegarder une base de données directement d'un serveur sur un autre. Par exemple :

pg_dump -h serveur1 base_de_donnees | psql -h serveur2 base_de_donnees
[Important]

Important

Les fichiers de sauvegarde produits par pg_dump sont relatifs à template0. Cela signifie que chaque langage, procédure, etc. ajouté à template1 est aussi sauvegardé par pg_dump. En conséquence, si une base template1 modifiée est utilisée lors de la restauration, il faut créer la base vide à partir de template0, comme dans l'exemple précédent.

Après la restauration d'une sauvegarde, il est conseillé d'exécuter ANALYZE sur chaque base de données pour que l'optimiseur de requêtes dispose de statistiques utiles. Un moyen simple de le faire est d'exécuter vacuumdb -a -z ; c'est équivalent à exécuter manuellement VACUUM ANALYZE sur chaque base. Pour plus de conseils sur le chargement efficace de grosses quantités de données dans PostgreSQL™, on peut se référer à la Section 13.4, « Remplir une base de données ».

23.1.2. Utilisation de pg_dumpall

pg_dump ne sauvegarde qu'une seule base à la fois, et ne sauvegarde pas les informations relatives aux rôles et tablespaces (parce que ceux-ci portent sur l'ensemble des bases du cluster, et non sur une base particulière). Pour permettre une sauvegarde aisée de tout le contenu d'un cluster, le programme pg_dumpall(1) est fourni. pg_dumpall sauvegarde toutes les bases de données d'un cluster (ensemble des bases d'une instance) PostgreSQL™ et préserve les données communes au cluster, telles que les rôles et tablespaces. L'utilisation basique de cette commande est :

pg_dumpall > fichier_de_sortie

Le fichier de sauvegarde résultant peut être restauré avec psql :

psql -f fichier_d_entree postgres

(N'importe quelle base de données peut être utilisée pour la connexion mais si le rechargement est exécuté sur un cluster vide, il est préférable d'utiliser postgres.) Il faut obligatoirement avoir le profil superutilisateur pour restaurer une sauvegarde faite avec pg_dumpall, afin de pouvoir restaurer les informations sur les rôles et les tablespaces. Si les tablespaces sont utilisés, il faut s'assurer que leurs chemins sauvegardés sont appropriés à la nouvelle installation.

23.1.3. Gérer les grosses bases de données

Comme PostgreSQL™ autorise des tables plus volumineuses que la taille maximale d'un fichier sur le système de fichiers, sauvegarder une telle table en fichier peut poser des problèmes. Puisque pg_dump peut écrire sur la sortie standard, les outils standard d'Unix peuvent être utiliser pour contourner ce problème éventuel.

Compresser le fichier de sauvegarde.  Tout programme de compression habituel est utilisable. Par exemple gzip.

pg_dump base_de_donnees | gzip > nom_fichier.gz

Pour restaurer :

createdb base_de_donnees
gunzip -c nom_fichier.gz | psql base_de_donnees

ou

cat nom_fichier.gz | gunzip | psql base_de_donnees

Couper le fichier avec split La commande split permet de découper le fichier en morceaux de taille acceptable par le système de fichiers sous-jacent. Par exemple, pour faire des morceaux de 1 Mo :

pg_dump base_de_donnees | split -b 1m - nom_fichier

Pour restaurer :

createdb base_de_donnees
cat nom_fichier* | psql base_de_donnees

Utilisation du format de sauvegarde personnalisé.  Si PostgreSQL™ est installé sur un système où la bibliothèque de compression zlib est disponible, le format de sauvegarde personnalisé peut être utilisé pour compresser les données à la volée. Pour les bases de données volumineuses, cela produit un fichier de sauvegarde d'une taille comparable à celle du fichier produit par gzip, avec l'avantage supplémentaire de permettre de restaurer des tables sélectivement. La commande qui suit sauvegarde une base de données en utilisant ce format de sauvegarde :

pg_dump -Fc base_de_donnees > nom_fichier

Le format de sauvegarde personnalisé ne produit pas un script utilisable par psql. Ce script doit être restauré avec pg_restore. Voir les pages de référence de pg_dump(1) et pg_restore(1) pour plus de détails.