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?
źródło
Jeśli tworzysz zrzut tekstowy, możesz wyeksportować bazę danych bez
CREATE DATABASE
bitów (tzn. Nie określaj-c
i -C
opcji dopg_dump
); Zapobiegnie to próbom upuszczenia, utworzenia i połączenia Postgres z bazą danych.Jeśli używasz jednego z formatów archiwum, możesz określić
-d
opcjępg_restore
nazwania bazy danych, którą chcesz przywrócić.Sprawdź strony podręcznika dla
pg_dump
ipg_restore
więcej szczegółów, i nie zapomnij zamontować małpa zarysowania , zanim spróbujesz to na systemach produkcyjnych w przypadku Pominąłem kilka ważnych szczegółów.źródło
pg_dump
powinien utworzyć zrzut, który przywrócisz do dowolnej bazy danych, z którą jesteś podłączony (minęło trochę czasu, odkąd zrobiłem zrzut tekstu i przywróciłem inną bazę danych, ale jeśli nie maCREATE
&\connect
bitów, SQL w zrzutu zrzutu tekstu zostanie wykonany gdziekolwiek jesteś, kiedy\i
mportujesz plik zrzutuTeraz pg_restore ma opcję -d i możesz ustawić nazwę bazy danych do importowania danych.
u źródła :
pg_dump -v -Fc mydb.dmp mydb
na dest :
utworzonob -T szablon1 mydb2
pg_restore -v -e -d mydb2 mydb.dmp
źródło
pg_dump -v -Fc mydb > mydb.dmp
(pg_dump v9.4.5).