Назад | Перейти на главную страницу

Экспортировать и импортировать базу данных PostgreSQL с другим именем?

Есть ли способ экспортировать базу данных 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