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?
quelle
Wenn Sie einen Text-Dump erstellen, können Sie die Datenbank ohne die
CREATE DATABASE
Bits exportieren (dh geben Sie keine-c
undC
-Optionen anpg_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
-d
Optionpg_restore
zum Benennen der Datenbank angeben , in die Sie zurückschreiben möchten.Schauen Sie sich die Manpages
pg_dump
undpg_restore
fü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.quelle
pg_dump
sollte 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 keinCREATE
&\connect
Bit vorhanden ist, wird die SQL im Textspeicherauszug ausgeführt Wo immer Sie sind, wenn Sie\i
die Dump-DateiJetzt 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
quelle
pg_dump -v -Fc mydb > mydb.dmp
(pg_dump v9.4.5).