Chapitre 22. Sauvegardes et restaurations

Table des matières
22.1. Sauvegarde SQL
22.1.1. Restaurer la sauvegarde
22.1.2. Utilisation de pg_dumpall
22.1.3. Grosses bases de données
22.1.4. Limitations
22.2. Sauvegarde de niveau système de fichiers
22.3. Migration entre les différentes 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 plutôt simple, il est important de comprendre les techniques et les suppositions sous-jacentes à celle-ci.

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

22.1. Sauvegarde SQL

Le principe est de générer 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. L'usage basique est :

pg_dump base_de_donnees > fichier_de_sortie

Comme vous le voyez, pg_dump écrit son résultat sur la sortie standard. Nous verrons plus loin que cela peut être pratique.

pg_dump est un programme client PostgreSQL classique (mais plutôt intelligent). Ceci veut dire que vous pouvez faire une sauvegarde depuis n'importe quel ordinateur ayant accès à la base. Mais rappelez-vous que pg_dump n'a pas de droits spéciaux. En particulier, vous devez avoir accès en lecture à toutes les tables que vous voulez sauvegarder, si bien qu'en pratique vous devez pratiquement toujours être le super-utilisateur de la base.

Pour préciser quel serveur de bases de données pg_dump doit contacter, utilisez les options de ligne de commande -h serveur et -p port. Le serveur par défaut est le serveur local, ou bien celui spécifié 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. Heureusement, la serveur a normalement la même valeur 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. Pour passer outre, précisez l'option -U ou donnez une valeur à la variable d'environnement PGUSER. Rappelez-vous que les connexions de pg_dump sont soumises aux mécanismes normaux d'authentification des programmes clients (qui sont décrits dans le Chapitre 19).

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

Important : Lorsque votre base de données dépend des OID (par exemple en tant que clés étrangères), vous devez indiquer à pg_dump de sauvegarder aussi les OID. Pour cela, utilisez l'option -o sur la ligne de commande. Les << gros objets >> ne sont pas non plus sauvegardés par défaut. Consultez la page de référence de la commande pg_dump si vous utilisez les << gros objets >>.

22.1.1. Restaurer la sauvegarde

Les fichiers texte créés par pg_dump sont prévus pour ê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 ce que vous avez 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. Vous devez la créer vous-même à 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 contrôler l'emplacement du serveur de bases de données et le nom d'utilisateur. Voyez sa page de référence pour plus d'informations.

Si les objets de la base de données originale appartenaient à plusieurs utilisateurs, alors le fichier de sauvegarde ordonne à psql de se connecter comme chacun de ces utilisateurs tour à tour et crée les objets correspondants. Ainsi, le propriétaire initial est maintenu. Cela signifie aussi, cependant, que tous ces utilisateurs doivent déjà exister et que vous devez avoir le droit de vous connecter comme chacun d'entre eux. Il peut être nécessaire pour cela de relâcher temporairement les règles d'identification des clients.

Il est recommandé de lancer ANALYZE sur chacune des bases de données restaurées, afin que l'optimiseur de requêtes dispose de statistiques utiles. Vous pouvez aussi lancer la commande vacuumdb -a -z pour lancer ANALYZE sur toutes les bases de données.

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 : Les fichiers de sauvegarde produits par pg_dump sont relatifs à template0. Cela signifie que chaque langage, procédure, etc. ajoutés à template1 seront aussi sauvegardés par pg_dump. En conséquence, si vous utilisez une base template1 modifiée, vous devez créer la base vide à partir de template0, comme dans l'exemple précédent.

Astuce : La vitesse de restauration peut être améliorée en augmentant le paramètre sort_mem (voir la Section 16.4.2.1).

22.1.2. Utilisation de pg_dumpall

Le mécanisme précédent est peu pratique pour sauvegarder un serveur de bases de données complet. pg_dumpall est prévu pour cela. pg_dumpall sauvegarde toutes les bases de données d'un groupe de bases de données PostgreSQL (appelé cluster) et préserve les données communes au groupe de bases comme les utilisateurs et les groupes. La syntaxe d'appel est simplement

pg_dumpall > fichier_de_sortie

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

psql template1 < fichier_d_entree

(Vous pouvez utiliser n'importe quelle base de données pour vous connecter mais si vous êtes en train de recharger un serveur vide, template1 est la seule base de données disponible.) Il faut obligatoirement être le super-utilisateur de la base pour restaurer une sauvegarde faite avec pg_dumpall, pour pouvoir restaurer les informations sur les utilisateurs et les groupes.

22.1.3. Grosses bases de données

Comme PostgreSQL permet que des tables soient plus grandes que la taille maximale d'un fichier sur votre système de fichiers, sauvegarder une telle table en fichier peut poser des problèmes. Comme pg_dump peut écrire sur la sortie standard, vous pouvez utiliser des outils standard d'Unix pour contourner ce problème éventuel.

Compresser le fichier de sauvegarde. Vous pouvez utiliser votre programme de compression habituel. 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 vous permet de découper le fichier en morceaux d'une taille acceptable pour 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 spécial. Si PostgreSQL est installé sur un système où la bibliothèque de compression zlib est disponible, ce format de sauvegarde spécial peut être utilisé. Pour les grandes bases de données, cela produira un fichier de sauvegarde d'une taille comparable à celle de 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 le format de sauvegarde spécial :

pg_dump -Fc base_de_donnees > nom_fichier

Voyez les pages de référence de pg_dump et pg_restore pour plus de détails.

22.1.4. Limitations

pg_dump (et du coup pg_dumpall) a un certain nombre de limitations dûes à la difficulté de reconstruire certaines informations du catalogue système.

Notamment, l'ordre dans lequel pg_dump écrit les objets n'est pas très sophistiqué. Cela peut créer des problèmes, par exemple quand des fonctions sont utilisées pour préciser les valeurs par défaut de colonnes. La seule solution est alors de réordonner le fichier de sauvegarde à la main. Si vous avez créé des références circulaires dans votre modèle de données, alors vous aurez encore plus de travail.

Pour des raisons de compatibilité avec les versions précédentes, pg_dump ne sauvegarde pas les gros objets par défaut. Pour les sauvegarder, vous devez utiliser soit le format de sauvegarde spécial soit le format TAR, et passer l'option -b à pg_dump. Voyez la page de référence pour plus de détails. Le répertoire contrib/pg_dumplo des fichiers sources de PostgreSQL contient aussi un programme qui peut sauvegarder les gros objets.

Merci de vous familiariser avec la page de référence de pg_dump.