Есть ли способ экспортировать базу данных 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 для изменения дампа. Я бы хотел избежать этого решения, но если нет альтернативы, я его приму. Кто-нибудь написал скрипт для изменения имени базы данных дампа, чтобы гарантировать, что данные никогда не изменяются?
источник
Если вы создаете текстовый дамп, вы можете экспортировать базу данных без
CREATE DATABASE
битов (т.е. не указывайте-c
и -C
опции дляpg_dump
); Это предотвратит попытки Postgres удалить, создать и подключиться к базе данных.Если вы используете один из форматов архива, вы можете указать
-d
опциюpg_restore
для имени базы данных, в которую вы хотите восстановить.Проверьте man-страницы
pg_dump
иpg_restore
узнайте больше, и не забудьте смонтировать « скрэтч-обезьяну» перед тем, как попробовать ее на производственных системах, на случай, если я пропущу некоторые важные детали.источник
pg_dump
следует создать дамп, который вы восстанавливаете в любую базу данных, к которой вы подключены (прошло много времени с тех пор, как я сделал дамп текста и восстановил в другой БД, но если нетCREATE
&\connect
битов, SQL в текстовом дампе будет выполнен где бы вы ни находились, когда вы\i
импортируете файл дампаТеперь в pg_restore есть опция -d, и вы можете установить имя базы данных для импорта данных.
по источнику :
pg_dump -v -Fc mydb.dmp mydb
на десте :
создалb -T шаблон1 mydb2
pg_restore -v -e -d mydb2 mydb.dmp
источник
pg_dump -v -Fc mydb > mydb.dmp
(pg_dump v9.4.5).