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

StackOverflow https://stackoverflow.com/questions/4191653

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top