Я использую postgres сегодня и возникла проблема Я сбрасываю базу данных таким образом
pg_dump zeus_development -U test > zeus_development.dump.out
что делать, если я хочу восстановить другую базу данных zeus_production
Как я могу сделать?
Я использую postgres сегодня и возникла проблема Я сбрасываю базу данных таким образом
pg_dump zeus_development -U test > zeus_development.dump.out
что делать, если я хочу восстановить другую базу данных zeus_production
Как я могу сделать?
Простой, сначала создайте свою базу данных с помощью 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
, если используете двоичный дамп), что я не рекомендую, потому что это даст вам меньшую гибкость (например, восстановление на другое имя базы данных).
Документация 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
этого добивается.
Не проще ли просто сделать следующее?
createdb -U test -T zeus_development zeus_production
Это ответ на 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"