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

39

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?

pupeno
la source

Réponses:

42

La solution était le dumping comme ceci:

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

et l'importer comme ceci:

psql blah_devel < blah.psql > /dev/null

J'ai toujours cet avertissement:

WARNING:  database "blah" does not exist

mais le reste semble fonctionner.

pupeno
la source
2
Vous êtes une
bouée de sauvetage
sauveur de vie bro :)
Vous savez qui
11

Si vous créez un vidage de texte, vous pouvez exporter la base de données sans les CREATE DATABASEbits (c.-à-d. Ne spécifiez pas -cet - Coptions to 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' -doption permettant pg_restorede nommer la base de données vers laquelle vous souhaitez effectuer la restauration.

Consultez les pages de manuel pour pg_dumpet pg_restorepour 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.

voretaq7
la source
Merci. Je vais essayer -da avec pg_restore, mais je suis pour le moment en train de le vider sous forme de texte. Dans pg_dump, je ne spécifie ni -c ni -C. J'appelle simplement pg_dump databasename. Est-ce que je manque quelque chose?
Le
sans options pg_dumpdevraient 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 pas CREATEet les \connectbits SQL dans la décharge texte est exécuté où que vous soyez lorsque vous \iimportez le fichier de vidage
voretaq7
pg_dump en mode texte ou binaire, par défaut, contient des tonnes de mentions du nom de la base de données.
pupeno
6

Maintenant, 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

Dmitry Kremer
la source
3
Cette syntaxe a fonctionné pour moi: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo