Экспортировать и импортировать базу данных 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 для изменения дампа. Я бы хотел избежать этого решения, но если нет альтернативы, я его приму. Кто-нибудь написал скрипт для изменения имени базы данных дампа, чтобы гарантировать, что данные никогда не изменяются?

pupeno
источник

Ответы:

42

Решение было сбросить это так:

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

и импортировать это так:

psql blah_devel < blah.psql > /dev/null

Я все еще получаю это предупреждение:

WARNING:  database "blah" does not exist

но остальное похоже на работу.

pupeno
источник
2
Вы спасатель жизни :)
Шри Харша Каппала
спасатель, братан :)
Ты
11

Если вы создаете текстовый дамп, вы можете экспортировать базу данных без CREATE DATABASEбитов (т.е. не указывайте -cи - Cопции для pg_dump); Это предотвратит попытки Postgres удалить, создать и подключиться к базе данных.

Если вы используете один из форматов архива, вы можете указать -dопцию pg_restoreдля имени базы данных, в которую вы хотите восстановить.

Проверьте man-страницы pg_dumpи pg_restoreузнайте больше, и не забудьте смонтировать « скрэтч-обезьяну» перед тем, как попробовать ее на производственных системах, на случай, если я пропущу некоторые важные детали.

voretaq7
источник
Спасибо. Я дам -da попробовать с pg_restore, но я пока что выкидываю его как текст, а в pg_dump я не указываю ни -c, ни -C. Я просто вызываю pg_dump databasename. Я что-то пропустил?
Пупено
без опций pg_dumpследует создать дамп, который вы восстанавливаете в любую базу данных, к которой вы подключены (прошло много времени с тех пор, как я сделал дамп текста и восстановил в другой БД, но если нет CREATE& \connectбитов, SQL в текстовом дампе будет выполнен где бы вы ни находились, когда вы \iимпортируете файл дампа
voretaq7
В текстовом или двоичном режиме pg_dump по умолчанию содержит массу упоминаний имени базы данных.
Пупено
6

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

по источнику :

pg_dump -v -Fc mydb.dmp mydb

на десте :

создалb -T шаблон1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

Дмитрий Кремер
источник
3
Этот синтаксис работал для меня: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Паоло