Czy istnieje sposób na wyeksportowanie bazy danych PostgreSQL, a następnie zaimportowanie jej pod inną nazwą?
Korzystam z PostgreSQL z Railsami i często eksportuję dane z produkcji, gdzie baza danych nazywa się blah_production i importuję je podczas programowania lub tworzenia scen o nazwach blah_development i blah_staging. Na MySQL jest to trywialne, ponieważ eksport nie ma nigdzie bazy danych (może z wyjątkiem komentarza), ale na PostgreSQL wydaje się to niemożliwe. Czy to niemożliwe?
Obecnie zrzucam bazę danych w ten sposób:
pg_dump blah > blah.dump
Nie używam opcji -c ani -C. Ten zrzut zawiera takie oświadczenia, jak:
COMMENT ON DATABASE blah IS 'blah';
ALTER TABLE public.checks OWNER TO blah;
ALTER TABLE public.users OWNER TO blah;
Kiedy próbuję zaimportować za pomocą
psql blah_devel < blah.dump
dostaję
WARNING: database "blah" does not exist
ERROR: role "blah" does not exist
Może problemem nie jest tak naprawdę baza danych, ale rola?
Jeśli zrzucę to w ten sposób:
pg_dump --format=c blah > blah.dump
i spróbuj zaimportować w ten sposób:
pg_restore -d blah_devel < tmp/blah.psql
Otrzymuję te błędy:
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
Jakieś pomysły?
Widziałem, że niektórzy ludzie używają skryptów sed do modyfikowania zrzutu. Chciałbym uniknąć tego rozwiązania, ale jeśli nie będzie alternatywy, wezmę to. Czy ktoś napisał skrypt zmieniający nazwę bazy danych zrzutu, aby upewnić się, że dane nigdy nie zostaną zmienione?