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?
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.
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.
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