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

new*_*ike 18 postgresql

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

 pg_dump zeus_development -U test > zeus_development.dump.out
Run Code Online (Sandbox Code Playgroud)

如果我想恢复到另一个数据库zeus_production怎么办?

我该怎么办?

Mat*_*sOl 22

简单,首先使用创建数据库template0作为你的模板数据库:

createdb -U test -T template0 zeus_production
Run Code Online (Sandbox Code Playgroud)

然后,在此数据库上恢复转储:

psql -U test zeus_production -f /path/to/zeus_development.dump.out
Run Code Online (Sandbox Code Playgroud)

在恢复时,始终使用template0显式,因为它始终是一个空的且不可修改的数据库.如果你不使用显式模板,PostgreSQL会假设template1,如果它有一些对象,比如你的转储数据库已有的表或函数,你将在恢复时遇到一些错误.

尽管如此,即使您使用相同的名称(zeus_development)恢复数据库,您也应该以相同的方式创建(或重新创建)它.除非你使用的-C选项,同时倾销(或-Cpg_restore如果使用的是二进制转储),我不建议,因为会给你少的灵活性(如恢复在不同的数据库名).


ped*_*edz 12

PostgresSQL文档影响了我使用自定义格式.我已经使用它多年了,它似乎有各种优点,但你的里程可能会有所不同.那就是说,这对我有用:

pg_restore --no-owner --dbname postgres --create ~/Desktop/pg_dump 
psql --dbname postgres -c 'ALTER DATABASE foodog_production RENAME TO foodog_development'
Run Code Online (Sandbox Code Playgroud)

有没有foodog_development也不foodog_production序列之前,现有的数据库.

这将从dump(~/Desktop/pg_dump)恢复数据库,dump()将使用转储的名称创建它.重命名将DB命名为您想要的任何名称.

--no-owner,如果你的用户名是在两台机器上同样可能不需要.在我的情况下,转储完成,user1恢复完成user2.新对象需要拥有user2--no-owner实现这一目标.

  • 我普遍使用自定义格式,因为文本格式通常在还原时失败.这个答案对我来说最有用. (3认同)

小智 6

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

createdb -U test -T zeus_development zeus_production
Run Code Online (Sandbox Code Playgroud)


miv*_*ivk 6

在 dba.stackexchange 上有一个答案,我在这里复制:

让我们定义一些变量,以使其余的变量更容易复制/粘贴

old_db=my_old_database
new_db=new_database_name
db_dump_file=backups/my_old_database.dump
user=postgres
Run Code Online (Sandbox Code Playgroud)

以下假设您的备份是使用“自定义”格式创建的,如下所示:

pg_dump -U $user -F custom $old_db > "$db_dump_file"
Run Code Online (Sandbox Code Playgroud)

要恢复$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"
Run Code Online (Sandbox Code Playgroud)