繁体   English   中英

如何将 postgres 数据库恢复为另一个数据库名称

[英]How to restore postgres database into another database name

我今天使用 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 ,因为它始终是一个空且不可修改的数据库。 如果您不使用显式模板,PostgreSQL 将假定为template1 ,并且如果它有一些对象,例如您转储的数据库已经拥有的表或函数,您将在恢复时遇到一些错误。

尽管如此,即使您正在恢复具有相同名称 ( zeus_development ) 的数据库,您也应该以相同的方式创建(或重新创建)它。 除非你使用-C同时倾销(或选项-Cpg_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_developmentfoodog_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恢复$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"

下面是做这件事的哈克的方式,只有工作,如果你能负担得起的空间和时间,使用常规.sql格式,如果你可以放心sed你的数据库名称和用户。

$ pg_dump -U my_production_user -h localhost my_production > my_prod_dump.sql
$ sed -i 's/my_production_user/my_staging_user/g' my_prod_dump.sql
$ sed -i 's/my_production/my_staging/g' my_prod_dump.sql
$ mv my_prod_dump.sql my_staging_dump.sql

$ sudo su postgres -c psql
psql> drop database my_staging;
psql> create database my_staging owner my_staging_user;
psql> \c my_staging;
psql> \i my_staging_dump.sql

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM