Est-il possible d'exporter une base de données PostgreSQL et de l'importer ultérieurement sous 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 les importe lors du développement ou de la mise en scène avec les noms blah_development et blah_staging. Sur MySQL, ceci est trivial car l’export n’a pas de base de données (sauf un commentaire), 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 déclarations telles que:
COMMENT ON DATABASE blah IS 'blah';
ALTER TABLE public.checks OWNER TO blah;
ALTER TABLE public.users OWNER TO blah;
Quand 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 personnes utiliser des scripts sed pour modifier le vidage. J'aimerais é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 cliché afin de s'assurer qu'aucune donnée n'est altérée?
la source
Si vous créez un vidage de texte, vous pouvez exporter la base de données sans les
CREATE DATABASE
bits (c.-à-d. Ne spécifiez pas-c
et -C
options topg_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'
-d
option permettantpg_restore
de nommer la base de données vers laquelle vous souhaitez effectuer la restauration.Consultez les pages de manuel pour
pg_dump
etpg_restore
pour plus de détails, et ne pas oublier de monter un singe à gratter avant de l' essayer sur les systèmes de production au cas où j'oublié des détails importants.la source
pg_dump
devraient créer une décharge que vous restaurer dans quelque base de données que vous êtes connecté à (ça fait un moment que je l'ai fait une décharge texte et restauré à un autre DB, mais s'il n'y a pasCREATE
et les\connect
bits SQL dans la décharge texte est exécuté où que vous soyez lorsque vous\i
importez le fichier de vidageMaintenant, pg_restore a l'option -d et vous pouvez définir le nom de la base de données pour importer des données.
sur source :
pg_dump -v -Fc mydb.dmp mydb
sur dest :
createdb -T template1 mydb2
pg_restore -v -e -d mydb2 mydb.dmp
la source
pg_dump -v -Fc mydb > mydb.dmp
(pg_dump v9.4.5).