Eine PostgreSQL-Datenbank mit einem anderen Namen exportieren und importieren?

39

Gibt es eine Möglichkeit, eine PostgreSQL-Datenbank zu exportieren und später unter einem anderen Namen zu importieren?

Ich verwende PostgreSQL mit Rails und exportiere häufig die Daten aus der Produktion, wo die Datenbank blah_production heißt, und importiere sie bei der Entwicklung oder beim Staging mit den Namen blah_development und blah_staging. Auf MySQL ist dies trivial, da der Export die Datenbank nirgendwo hat (außer einem Kommentar vielleicht), aber auf PostgreSQL scheint es unmöglich zu sein. Es ist unmöglich?

Ich stelle die Datenbank derzeit folgendermaßen ab:

pg_dump blah > blah.dump

Ich verwende nicht die Optionen -c oder -C. Dieser Dump enthält Anweisungen wie:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Wenn ich versuche mit zu importieren

psql blah_devel < blah.dump

Ich bekomme

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Vielleicht liegt das Problem nicht wirklich in der Datenbank, sondern in der Rolle?

Wenn ich es auf diese Weise entleere:

pg_dump --format=c blah > blah.dump

und versuchen Sie es so zu importieren:

pg_restore -d blah_devel < tmp/blah.psql

Ich bekomme diese Fehler:

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

Irgendwelche Ideen?

Ich habe da draußen einige Leute gesehen, die sed-Skripte verwenden, um den Dump zu modifizieren. Ich möchte diese Lösung vermeiden, aber wenn es keine Alternative gibt, nehme ich sie. Hat jemand ein Skript geschrieben, um den Datenbanknamen des Dumps zu ändern und sicherzustellen, dass keine Daten geändert werden?

pupeno
quelle

Antworten:

42

Die Lösung war, es so zu entleeren:

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

und so importieren:

psql blah_devel < blah.psql > /dev/null

Ich bekomme immer noch diese Warnung:

WARNING:  database "blah" does not exist

aber der Rest scheint zu funktionieren.

pupeno
quelle
2
Sie sind ein Lebensretter :)
Sri Harsha Kappala
Lebensretter bro :)
Sie wissen, wer
11

Wenn Sie einen Text-Dump erstellen, können Sie die Datenbank ohne die CREATE DATABASEBits exportieren (dh geben Sie keine -cund C-Optionen an pg_dump). Dies verhindert, dass Postgres versucht, die Datenbank zu löschen, zu erstellen und eine Verbindung mit ihr herzustellen.

Wenn Sie eines der Archivformate verwenden, können Sie die -dOption pg_restorezum Benennen der Datenbank angeben , in die Sie zurückschreiben möchten.

Schauen Sie sich die Manpages pg_dumpund pg_restorefür weitere Einzelheiten und vergessen Sie nicht , zu montieren kratzen Affe , bevor Sie versuchen , diese auf Produktionssystemen im Fall , dass ich einige wichtige Detail ausgelassen.

voretaq7
quelle
Danke. Ich werde -da mit pg_restore versuchen, aber im Moment speichere ich es als Text und in pg_dump gebe ich weder -c noch -C an. Ich rufe nur pg_dump Datenbankname. Vermisse ich etwas?
Schüler
Ohne Optionen pg_dumpsollte ein Speicherauszug erstellt werden, den Sie in der Datenbank wiederherstellen, mit der Sie verbunden sind (es ist eine Weile her, dass ich einen Textspeicherauszug erstellt und in einer anderen Datenbank wiederhergestellt habe. Wenn jedoch kein CREATE& \connectBit vorhanden ist, wird die SQL im Textspeicherauszug ausgeführt Wo immer Sie sind, wenn Sie \idie Dump-Datei
mportieren
pg_dump im Text- oder Binärmodus enthält standardmäßig Tonnen von Erwähnungen des Datenbanknamens.
Schüler
6

Jetzt hat pg_restore die Option -d und Sie können den Datenbanknamen für den Datenimport festlegen.

auf Quelle :

pg_dump -v -Fc mydb.dmp mydb

am Ziel :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

Dmitry Kremer
quelle
3
Diese Syntax hat bei mir funktioniert: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo