Есть ли способ экспортировать базу данных 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 для изменения дампа. Я бы хотел избежать этого решения, но если нет альтернативы, я воспользуюсь им. Кто-нибудь написал сценарий для изменения имени базы данных дампа, чтобы никакие данные никогда не изменялись?
Решение сбрасывало это так:
pg_dump --no-owner --no-acl blah > blah.psql
и импортируем это так:
psql blah_devel < blah.psql > /dev/null
Я все еще получаю это предупреждение:
WARNING: database "blah" does not exist
но остальное вроде работает.
Если вы создаете текстовый дамп, вы можете экспортировать базу данных без CREATE DATABASE
биты (т.е. не указывать -c
и -C
варианты для pg_dump
); Это предотвратит попытки Postgres сбросить, создать и подключиться к базе данных.
Если вы используете один из форматов архива, вы можете указать -d
возможность pg_restore
чтобы назвать базу данных, в которую вы хотите восстановить.
Проверьте страницы руководства для pg_dump
и pg_restore
для получения более подробной информации, и не забудьте установить царапина обезьяна прежде чем попробовать это в производственных системах, на случай, если я упустил некоторые важные детали.
Теперь у pg_restore есть опция -d, и вы можете установить имя базы данных для импорта данных.
на источнике:
pg_dump -v -Fc mydb.dmp mydb
на месте:
createdb -T template1 mydb2
pg_restore -v -e -d mydb2 mydb.dmp