web-dev-qa-db-fra.com

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

Existe-t-il un moyen d'exporter une base de données PostgreSQL et de l'importer ultérieurement avec un autre nom?

J'utilise PostgreSQL avec Rails et j'exporte souvent les données de production, où la base de données s'appelle blah_production et l'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'export n'a la base de données nulle part (sauf un commentaire peut-être), mais sur PostgreSQL cela semble impossible. Est-ce impossible?

Je vide actuellement la base de données de cette façon:

pg_dump blah > blah.dump

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

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Lorsque j'essaie d'importer avec

psql blah_devel < blah.dump

Je reçois

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

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

Si je le vide de cette façon:

pg_dump --format=c blah > blah.dump

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

pg_restore -d blah_devel < tmp/blah.psql

Je reçois ces erreurs:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

Des idées?

J'ai vu des gens utiliser des scripts sed pour modifier le vidage. Je voudrais é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 du vidage pour garantir qu'aucune donnée n'est jamais modifiée?

40
pupeno

La solution était de le vider comme ceci:

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

et l'importer comme ceci:

psql blah_devel < blah.psql > /dev/null

Je reçois toujours cet avertissement:

WARNING:  database "blah" does not exist

mais le reste semble fonctionner.

44
pupeno

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

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

Consultez les pages de manuel pour pg_dump et pg_restore pour plus de détails, et n'oubliez pas de monter un scratch monkey avant d'essayer ceci sur les systèmes de production au cas où j'aurais omis quelques détails importants.

11
voretaq7

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

sur la source :

pg_dump -v -Fc mydb.dmp mydb

sur dest :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

6
Dmitry Kremer