Подтвердить что ты не робот

Я хочу восстановить базу данных с другой схемой

Дорогой Все,
Я взял дамп базы данных с именем temp1, используя команду follwing

$  pg_dump -i -h localhost  -U postgres -F c -b -v -f pub.backup temp1 

Теперь я хочу восстановить дамп в другой базе данных под названием "db_temp", но в этом я просто хочу, чтобы все таблицы были созданы в "temp_schema" (а не по умолчанию, которая находится в базе данных fms temp1) который находится в базе данных "db_temp".

Есть ли способ сделать это, используя команду pg_restore
Также будет оценен любой другой метод!
Заранее спасибо!

4b9b3361

Ответ 1

Нет никакого способа в pg_restore. Вы можете использовать pg_restore для генерации вывода SQL, а затем отправить это, например, sed script, чтобы изменить его. Вам нужно быть осторожным в том, как вы пишете sed script, хотя, чтобы он не соответствовал и не менял вещи внутри ваших данных.

Ответ 2

Существует простое решение:

  • Создайте резервную копию в простом формате SQL (формат "p" с помощью параметра "--format = p" или "-F p" )
  • Отредактируйте дамп pub.backup.sql с вашим любимым редактором и добавьте следующие две строки вверху вашего файла:

создать схему myschema;

SET search_path TO myschema;

Теперь вы можете восстановить резервный дамп с помощью команды

psql -f pub.backup.sql

Команда "set search_path to" установит myschema как значение по умолчанию, так что в этой схеме создаются новые таблицы и другие объекты независимо от схемы "по умолчанию", в которой они жили раньше.

Ответ 3

Быстрый и грязный способ:

1) переименуйте схему по умолчанию:

alter schema public rename to public_save;

2) создать новую схему как схему по умолчанию:

create schema public;

3) восстановить данные

pg_restore -f pub.backup db_temp [and whatever other options]

4) переименовать схемы в зависимости от необходимости:

alter schema public rename to temp_schema;
alter schema public_save rename to public;

Ответ 4

Вероятно, самым простым методом было бы просто переименовать схему после восстановления, то есть со следующим SQL:

ALTER SCHEMA my_schema RENAME TO temp_schema

Я считаю, что, поскольку вы используете сжатый формат архива для вывода pg_dump, вы не можете изменить его перед восстановлением. Опция должна была бы использовать вывод по умолчанию и выполнять поиск и замену имени схемы, но это было бы рискованно и могло привести к повреждению данных, если вы не были осторожны.

Ответ 5

Если у вас есть только несколько таблиц, вы можете восстановить одну таблицу за раз, pg_restore принимает -d database, когда вы указываете -t tablename. Конечно, вам нужно будет настроить схему перед восстановлением таблиц, а затем отсортировать индексы и ограничения, когда вы закончите восстановление таблиц.

В качестве альтернативы, настройте другой сервер на другом порту, восстановите его с помощью нового сервера PostgreSQL, переименуйте схему, выгрузите ее и восстановите в исходную базу данных. Это, конечно, немного клочья, но он выполнит свою работу.

Если вы предприимчивы, вы можете изменить имя базы данных в файле дампа, используя шестнадцатеричный редактор. Я думаю, что это упоминается только в одном месте на дампе, и пока новые и старые имена баз данных одинаковы, он должен работать. YMMV, не делайте ничего подобного в производственной среде, не обвиняйте меня, если это взрывает и выравнивает ваш родной город и все остальные обычные отказы.

Ответ 6

Переименуйте схему во временную базу данных.

Экспортировать схему:

pg_dump --schema-only --schema=prod > prod.sql

Создайте новую базу данных. Восстановить экспорт:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

pg_dump --schema-only --schema=somethingelse > somethingelse.sql

(удалить базу данных)

Для данных вы можете просто изменить набор search_path вверху.