Я хочу восстановить базу данных с другой схемой
-
10-10-2019 - |
Вопрос
Я взял свалку из базы данных под названием 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
командование?
Любой другой метод также будет оценен!
Решение
В самом PG_Restore нет способа. Что вы можете сделать, так это использовать PG_Restore для генерации вывода SQL, а затем отправить его, например, скрипт SED, чтобы изменить его. Вы должны быть осторожны с тем, как вы пишете этот скрипт SED, поэтому он не соответствует и не меняет вещи внутри ваших данных.
Другие советы
Есть простое решение:
- Создайте дамп резервного копирования в простом формате SQL (формат «P», используя параметр
--format=p
или же-F p
) - Отредактируйте свой дамп pub.backup.sql с вашим любимым редактором и добавьте следующие две строки в верхней части вашего файла:
create schema myschema;
SET search_path TO myschema;
Теперь вы можете восстановить свой резервный дамп с помощью команды
psql -f pub.backup.sql
А set search_path to <schema>
Команда установит Myschema в качестве по умолчанию, так что в этой схеме создаются новые таблицы и другие объекты, независимо от схемы «по умолчанию», где они жили раньше.
Быстрый и грязный способ:
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;
Вероятно, самым простым методом было бы просто переименовать схему после восстановления, т.е. со следующим SQL:
ALTER SCHEMA my_schema RENAME TO temp_schema
Я считаю, что, поскольку вы используете формат сжатого архива для вывода PG_DUMP, вы не можете изменить его перед восстановлением. Вариант будет заключаться в использовании вывода по умолчанию и выполнить поиск и заменить имя схемы, но это было бы рискованно и, возможно, может привести к повреждению данных, если вы не были осторожны.
Если у вас есть только несколько таблиц, то вы можете восстановить по одному столу за раз, pg_restore
принимает -d database
Когда вы указываете -t tablename
. Анкет Конечно, вам придется настроить схему перед восстановлением таблиц, а затем разобраться в индексах и ограничениях, когда вы закончите восстановить таблицы.
В качестве альтернативы, настройте другой сервер на другом порту, восстановите, используя новый сервер PostgreSQL, переименуйте схему, сбросьте ее и восстановите в исходную базу данных. Конечно, это немного Kludge, но это выполнит работу.
Если вы авантюрны, вы можете изменить имя базы данных в файле дампа с помощью редактора HEX. Я думаю, что это упоминается только в одном месте в свалке, и пока новые и старые имена баз данных одинаковы, что должно работать. YMMV, не делайте ничего подобного в производственной среде, не вините меня, если это дует и выровняет ваш родной город, и все остальные обычные отказы от ответственности.
Переименовать схему в временной базе данных.
Экспортируйте схему:
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
наверху.
Как уже отмечалось, в PG_DUMP, PSQL или PG_Restore нет прямой поддержки, чтобы изменить имя схемы в процессе дампа/восстановления. Но довольно просто экспортировать, используя «простой» формат, а затем изменить файл .sql. Этот сценарий BASH делает основы:
rename_schema () {
# Change search path so by default everything will go into the specified schema
perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"
# Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"
# Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"
}
Применение:
pg_dump --format plain --schema=foo --file dump.sql MYDB
rename_schema dump.sql foo bar
psql -d MYDB -c 'CREATE SCHEMA bar;'
psql -d MYDB -f dumpsql