Как восстановить базу данных postgres в другое имя базы данных

Я использую postgres сегодня и возникла проблема Я сбрасываю базу данных таким образом

 pg_dump zeus_development -U test > zeus_development.dump.out

что делать, если я хочу восстановить другую базу данных zeus_production

Как я могу сделать?

Ответ 1

Простой, сначала создайте свою базу данных с помощью template0 в качестве базы данных шаблонов:

createdb -U test -T template0 zeus_production

Затем восстановите дамп в этой базе данных:

psql -U test zeus_production -f /path/to/zeus_development.dump.out

При восстановлении всегда используйте template0 explicit, так как это всегда пустая и немодифицируемая база данных. Если вы не используете явный шаблон, PostgreSQL будет принимать template1, и если у него есть некоторые объекты, такие как таблица или функция, которые уже имеются в вашей базе данных, вы получите некоторые ошибки при восстановлении.

Тем не менее, даже если вы восстанавливали базу данных с тем же именем (zeus_development), вы должны создать (или воссоздать) ее таким же образом. Если вы не использовали параметр -C во время демпинга (или -C из pg_restore, если используете двоичный дамп), что я не рекомендую, потому что это даст вам меньшую гибкость (например, восстановление на другое имя базы данных).

Ответ 2

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

pg_restore --no-owner --dbname postgres --create ~/Desktop/pg_dump 
psql --dbname postgres -c 'ALTER DATABASE foodog_production RENAME TO foodog_development'

До этой последовательности не foodog_development ни foodog_production данных ни foodog_development ни foodog_production.

Это восстановит базу данных из дампа (~/Desktop/pg_dump), которая создаст ее с именем, под которым она была сохранена. Переименование имен БД на все, что вы хотите.

--no-owner может не понадобиться, если ваше имя пользователя одинаково на обеих машинах. В моем случае дамп был сделан как user1 а восстановление сделано как user2. Новые объекты должны принадлежать пользователю user2 и --no-owner этого добивается.

Ответ 3

Не проще ли просто сделать следующее?

createdb -U test -T zeus_development zeus_production

Ответ 4

Это ответ на dba.stackexchange, который я воспроизвожу здесь:

Давайте определим несколько переменных, чтобы упростить копирование/вставку остальных

old_db=my_old_database
new_db=new_database_name
db_dump_file=backups/my_old_database.dump
user=postgres

Далее предполагается, что ваша резервная копия была создана в "пользовательском" формате, подобном следующему:

pg_dump -U $user -F custom $old_db > "$db_dump_file"

Чтобы восстановить $db_dump_file новое имя базы данных $new_db:

dropdb   -U $user --if-exists  $new_db
createdb -U $user -T template0 $new_db

pg_restore -U $user -d $new_db "$db_dump_file"