Я хочу восстановить базу данных с другой схемой - PullRequest
52 голосов
/ 16 ноября 2010

Я сделал дамп базы данных с именем temp1 с помощью следующей команды

$  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?

Любой другой метод также приветствуется!

Ответы [ 7 ]

56 голосов
/ 01 июня 2013

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

  • Создайте свой резервный дамп в формате обычного 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 по умолчанию, поэтому в этой схеме будут созданы новые таблицы и другие объекты независимо от схемы "по умолчанию", в которой они жили раньше.

44 голосов
/ 01 мая 2013

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

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;
10 голосов
/ 16 ноября 2010

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

10 голосов
/ 16 ноября 2010

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

ALTER SCHEMA my_schema RENAME TO temp_schema

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

3 голосов
/ 17 ноября 2010

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

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

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

2 голосов
/ 09 октября 2017

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

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

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 вверху.

1 голос
/ 21 мая 2018

Как уже отмечалось, в 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
...