Eksportować i importować bazę danych PostgreSQL pod inną nazwą?

39

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?

pupeno
źródło

Odpowiedzi:

42

Rozwiązaniem było zrzucenie tego w następujący sposób:

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

i importując go w następujący sposób:

psql blah_devel < blah.psql > /dev/null

Nadal pojawia się to ostrzeżenie:

WARNING:  database "blah" does not exist

ale reszta wydaje się działać.

pupeno
źródło
2
Jesteś
ratownikiem
life saver bro :)
Wiesz, kogo
11

Jeśli tworzysz zrzut tekstowy, możesz wyeksportować bazę danych bez CREATE DATABASEbitów (tzn. Nie określaj -ci - Copcji do pg_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ć -dopcję pg_restorenazwania bazy danych, którą chcesz przywrócić.

Sprawdź strony podręcznika dla pg_dumpi pg_restorewię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.

voretaq7
źródło
Dziękuję Ci. Spróbuję -da wypróbować z pg_restore, ale na razie wyrzucam go jako tekst, aw pg_dump nie określam ani -c, ani -C. Właśnie dzwonię do pg_dump nazwa_bazy_danych. Czy coś brakuje?
pupeno
bez żadnych opcji pg_dumppowinien 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 ma CREATE& \connectbitów, SQL w zrzutu zrzutu tekstu zostanie wykonany gdziekolwiek jesteś, kiedy \importujesz plik zrzutu
voretaq7 28.01.11
pg_dump w trybie tekstowym lub binarnym domyślnie ma mnóstwo wzmianek o nazwie bazy danych.
pupeno
6

Teraz 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

Dmitrij Kremer
źródło
3
Ta składnia działała dla mnie: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo,