Експортувати та імпортувати базу даних PostgreSQL з іншим ім'ям?


39

Чи є можливість експортувати базу даних PostgreSQL і пізніше імпортувати її з іншим ім'ям?

Я використовую PostgreSQL з Rails, і я часто експортую дані з виробництва, де база даних називається blah_production та імпортую її на розробку або постановку з іменами blah_development і blah_staging. У MySQL це банально, оскільки експорт не має ніде бази даних (крім коментаря, можливо), але на PostgreSQL це здається неможливим. Це неможливо?

Зараз я скидаю базу даних таким чином:

pg_dump blah > blah.dump

Я не використовую параметри -c або -C. Цей дамп містить такі заяви, як:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

Коли я намагаюся імпортувати с

psql blah_devel < blah.dump

я отримав

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Може бути, проблема полягає не в базі даних, а в ролі?

Якщо я скидаю це так:

pg_dump --format=c blah > blah.dump

і спробуйте імпортувати його таким чином:

pg_restore -d blah_devel < tmp/blah.psql

Я отримую ці помилки:

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

Будь-які ідеї?

Я бачив там, де деякі люди використовують сценарії sed для модифікації дампа. Я хотів би уникнути цього рішення, але якщо немає альтернативи, я прийму його. Хтось написав сценарій, щоб змінити ім’я бази даних дампа, гарантуючи, що дані ніколи не змінюються?

Відповіді:


42

Рішення було демпінгом так:

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

і імпортувати його так:

psql blah_devel < blah.psql > /dev/null

Я все одно отримую це попередження:

WARNING:  database "blah" does not exist

але все, здається, працює.


2
Ви рятувальник життя :)
Шрі Харша Каппала

life saver bro :)
Ви знаєте, хто

11

Якщо ви створюєте текстовий дамп, ви можете експортувати базу даних без CREATE DATABASEбітів (тобто не вказуйте -cта - Cпараметри для pg_dump); Це не дозволить Postgres намагатися скидати, створювати та підключатись до бази даних.

Якщо ви використовуєте один з форматів архіву, ви можете вказати -dопцію pg_restoreімені бази даних, до якої потрібно відновити.

Перевірте сторінки людини для pg_dumpі pg_restoreдля більш докладної інформації, і не забудьте змонтувати дряпання мавпу , перш ніж спробувати це на виробничих системах в разі , якщо я залишив деякі важливі деталі.


Дякую. Я спробую -da спробувати pg_restore, але я на даний момент перекидаю його як текст, а в pg_dump я не вказую ні -c, ні -C. Я просто кличу ім'я бази даних pg_dump. Я щось пропускаю?
pupeno

без жодних параметрів не pg_dumpслід створювати дамп, який ви відновлюєте в будь-яку базу даних, до якої ви підключені (минуло деякий час, коли я робив текстовий дамп і відновлювався в іншій БД, але якщо немає CREATEі \connectбітів, SQL у текстовому дампі виконується де ви знаходитесь, коли ви \iімпортуєте дамп-файл.
voretaq7,

pg_dump в текстовому або двійковому режимі за замовчуванням містить багато згаданих назв бази даних.
pupeno

6

Тепер у pg_restore є опція -d, і ви можете встановити ім'я бази даних для імпорту даних.

на джерело :

pg_dump -v -Fc mydb.dmp mydb

на dest :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
Цей синтаксис працював для мене: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Паоло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.