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.