dimanche 18 octobre 2009
En phase de développement d'un projet, on a généralement tendance à programmer initialement la base de données et à mettre le tout en production une fois terminé. Lorsque le client demande des modifications au système, c'est une très mauvaise idée d'appliquer les changements sur la version en production. Un truc simple consiste à dupliquer la base de données et à poursuivre le développement localement, en redirigeant la connexion à la BD dupliquée, ce qui minimise le risque d'erreurs.
Avec un serveur PostgreSQL, on a deux choix :
- créer une copie à partir d'un gabarit
- utiliser une copie de sauvegarde
C'est la façon la plus simple de réaliser une copie complète d'une base de données (structure et données). Cependant, je passerai rapidement sur cette méthode car j'en ai parlé en détails dans un autre article. En gros, ça consiste à utiliser la commande SQL suivante :
CREATE DATABASE db_copie TEMPLATE db_source;
2. Restaurer une copie de sauvegarde
Pour restaurer un backup postgres, on doit d'abord en créer un. Sur le serveur, ouvrez un terminal et repérez l'utilitaire pg_dump qui créera un script de la base de données que psql est capable d'interpréter (dans le répertoire bin du dossier d'installation).
Si vous êtes connecté sur le serveur en tant qu'un autre utilisateur, je vous recommande d'invoquer les commandes en tant que l'utilisateur postgres (-U postgres).
pg_dump -U postgres -f /tmp/db.src -c -x -h localhost db_source
Où :
- -f spécifie l'emplacement du fichier où créer le backup
- -c pour ajouter en sortie les lignes de commandes qui créent la base de donnés
- -x pour ne pas tenir compte des privilèges (ACL)
- -h pour spécifier le serveur hôte
Avant d'utiliser le script db.src, il est nécessaire de créer une base de données vierge sur laquelle on exécutera le script. Il faut appeler la commande createdb :
createdb -U postgres db_new_name
Enfin, on appliquera le script qui créera la totalité de la structure et y insérera les données :
psql -U postgres newdb < /tmp/db.src
En conclusion
Copier une base de données à partir de la restauration d'un backup est pratique si on a besoin d'une version spécifique dans le temps. Sinon, rien ne nous empêche de dupliquer la BD selon un modèle tel que décrit à la méthode 1, ou encore de faire la même chose avec l'utilitaire createdb en prenant soin de spécifier le flag -T qui permet d'indiquer la base de données à utiliser comme modèle :
createdb -U postgres -T db_source db_copie
Finalement, si vous avez une BD volumineuse, je vous recommande de compresser le script au moment d'utiliser pg_dump.