43 votes

Exporter et importer une base de données PostgreSQL avec un nom différent?

Y a-t-il un moyen d'exporter une base de données PostgreSQL et de l'importer plus tard avec un autre nom?

Je suis PostgreSQL avec Rails et j'exporte souvent les données de la production, où la base de données s'appelle blah_production et les importe sur le développement ou la mise en scène avec les noms blah_development et blah_staging. Sur MySQL, c'est trivial car l'exportation ne contient nulle part la base de données (sauf peut-être un commentaire), mais sur PostgreSQL, cela semble impossible. Est-ce impossible?

Je fais actuellement une sauvegarde de la base de données de cette manière:

pg_dump blah > blah.dump

Je n'utilise pas les options -c ou -C. Cette sauvegarde contient des instructions telles que:

COMMENTAIRE SUR LA BASE DE DONNÉES blah IS 'blah';

MODIFIER LA TABLE public.checks PROPRIÉTAIRE À blah;

MODIFIER LA TABLE public.users PROPRIÉTAIRE À blah;

Quand j'essaie d'importer avec

psql blah_devel < blah.dump

Je reçois

AVERTISSEMENT: la base de données "blah" n'existe pas

ERREUR: le rôle "blah" n'existe pas

Peut-être que le problème n'est pas vraiment la base de données mais le rôle?

Si je le fais de cette façon:

pg_dump --format=c blah > blah.dump

et essaye de l'importer de cette façon:

pg_restore -d blah_devel < tmp/blah.psql

Je reçois ces erreurs:

pg_restore: AVERTISSEMENT: la base de données "blah" n'existe pas
pg_restore: [archiver (db)] Erreur lors du TRAITEMENT DE TOC:
pg_restore: [archiver (db)] Erreur dans l'entrée TOC 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] impossible d'exécuter la requête: ERREUR: le rôle "blah" n'existe pas
    La commande était: MODIFIER LA TABLE public.checks PROPRIÉTAIRE À blah;
pg_restore: [archiver (db)] Erreur dans l'entrée TOC 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] impossible d'exécuter la requête: ERREUR: le rôle "blah" n'existe pas
    La commande était: MODIFIER LA TABLE public.users PROPRIÉTAIRE À blah;
pg_restore: [archiver (db)] Erreur dans l'entrée TOC 1508; 1259 16407 SÉQUENCE users_id_seq blah
pg_restore: [archiver (db)] impossible d'exécuter la requête: ERREUR: le rôle "blah" n'existe pas
    La commande était: MODIFIER LA TABLE public.users_id_seq PROPRIÉTAIRE À blah;
pg_restore: [archiver (db)] Erreur dans l'entrée TOC 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] impossible d'exécuter la requête: ERREUR: le rôle "postgres" n'existe pas
    La commande était: RÉVOQUEZ TOUT SUR LE SCHÉMA public PAR postgres;
pg_restore: [archiver (db)] impossible d'exécuter la requête: ERREUR: le rôle "postgres" n'existe pas
    La commande était: ACCORDER TOUT SUR LE SCHÉMA public À postgres;
AVERTISSEMENT: erreurs ignorées lors de la restauration: 11

Des idées?

J'ai vu des gens utiliser des scripts sed pour modifier la sauvegarde. Je préférerais éviter cette solution mais s'il n'y a pas d'alternative, je la prendrai. Quelqu'un a-t-il écrit un script pour modifier le nom de la base de données de la sauvegarde pour s'assurer qu'aucune donnée n'est jamais modifiée?

46voto

Pablo Points 7119

La solution était de le décharger comme ceci :

pg_dump --no-owner --no-acl blah > blah.psql

et de l'importer comme ceci :

psql blah_devel < blah.psql > /dev/null

Je reçois toujours cet avertissement :

AVERTISSEMENT : la base de données "blah" n'existe pas

mais le reste semble fonctionner.

12voto

voretaq7 Points 78924

Si vous créez une version texte, vous pouvez exporter la base de données sans les parties CREATE DATABASE (c'est-à-dire ne pas spécifier les options -c et -C à pg_dump) ; Cela empêchera Postgres d'essayer de supprimer, créer et se connecter à la base de données.

Si vous utilisez l'un des formats d'archive, vous pouvez spécifier l'option -d à pg_restore pour nommer la base de données à restaurer.

Consultez les pages man de pg_dump et pg_restore pour plus de détails, et n'oubliez pas de monter un singe de test avant d'essayer ceci sur des systèmes de production au cas où j'aurais omis un détail important.

8voto

FuzzyAmi Points 141

Maintenant, pg_restore dispose de l'option -d et vous pouvez définir le nom de la base de données pour l'importation de données.

Sur la source:

pg_dump -v -Fc mydb.dmp mydb

Sur la destination:

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X