2010-11-16 3 views
34

Уважаемого Все,
я взял дамп базы данных с именем 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
Любой другой метод также будет оценен!
Заранее благодарим!

+6

Я просто не могу согласиться с тем, что это все еще происходит в 2017 году, и решение состоит в том, чтобы взломать файл дампа. – Sharky

ответ

9

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

7

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

ALTER SCHEMA my_schema RENAME TO temp_schema 

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

+0

Это решение может сделать много беспорядков, не так ли? – abubacker

+3

Каким образом? Оператор SQL является единственным безопасным способом изменения имени схемы. Другое решение также предлагается в другом ответе, и мы оба объясняем, что это рискованно. Плохое нисходящее. – Hamish

+1

Я изменил имя схемы, но после этого я не могу изменить путь сыгранности! Пользователь не может выполнить поиск в любой таблице после переименования! –

3

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

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

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

32

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

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) renam е схемы в соответствии с потребностями:

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

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

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

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

SET search_path TO myschema;

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

Psql -f pub.backup.sql

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

+0

Есть ли опрятный способ редактировать только заголовок большого файла дампа? Даже такие вещи включают дублирование: http: // superuser.com/questions/246837/how-do-i-add-text-to-the-of-a-file-in-bash –

+0

@PeterEhrlich В зависимости от того, насколько велики ваши файлы и доступная оперативная память, вы можете использовать vim для откройте файл дампа gzip'd напрямую. Он по-прежнему расширяется в памяти, но я смог открыть, отредактировать и сохранить файл 750 МБ (.gz) с небольшой паузой при сохранении. YMMV. – David

+0

Я обнаружил, что у моих дампов уже был один или несколько SET search_path TO ...; которые мне нужно было удалить. Вы можете захотеть найти «search_path» при редактировании и до восстановления. У вас будет хотя бы один SET search_path TO ...; для каждой схемы, из которой были сброшены объекты. Было бы неплохо, если бы была опция -without-schema, которая работала как опция -no-owner. – David

0

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

Экспорт схемы:

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 в верхней части.