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

时间:2013-10-07 11:21:10

标签: postgresql

我今天使用postgres 并遇到了问题 我以那种方式转储数据库

 pg_dump zeus_development -U test > zeus_development.dump.out

如果我想恢复到另一个数据库zeus_production

该怎么办?

我该怎么办?

5 个答案:

答案 0 :(得分:20)

简单,首先使用template0作为template database创建数据库:

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选项(如果使用二进制转储,则使用-C pg_restore),我不建议这样做,因为这样会减少灵活性(例如恢复不同数据库名称)。

答案 1 :(得分:8)

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)恢复数据库,转储将使用转储的名称创建它。重命名将DB命名为您想要的任何内容。

如果两台计算机上的用户名相同,则可能不需要--no-owner。在我的情况下,转储以user1完成,恢复完成为user2。新对象需要由user2拥有,而--no-owner才能实现此目标。

答案 2 :(得分:1)

简单地执行以下操作是否更容易?

createdb -U test -T zeus_development zeus_production

答案 3 :(得分:0)

它有一个answer on 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"

答案 4 :(得分:0)

这是一种 hacky 的实现方式,如果您有足够的时间和空间使用常规$ npm outdated -g Package Current Wanted Latest Location eslint 6.7.0 6.8.0 6.8.0 global generator-wombytes-cpp 0.2.0 0.2.0 0.3.0 global n 6.1.0 6.2.0 6.2.0 global 格式,并且可以安全地.sql列出您的数据库名称和用户。

sed