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