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?