2013-10-07 36 views
6

我今天 使用Postgres的和有问题 我转储数据库这样如何恢复Postgres数据库到另一个数据库名称

pg_dump zeus_development -U test > zeus_development.dump.out 

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

我怎么办?

+1

备注 - 最好使用二进制转储格式而不是纯文本格式。它将加快转储/恢复过程,减小转储文件的大小,并提供一些其他方法来控制恢复过程。详细信息['here'](http://www.postgresql.org/docs/current/static/app-pgdump.html) –

回答

14

简单,首先创建一个使用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选项(或者使用pg_restore如果使用二进制转储,则-C),这是我不建议的,因为它会降低灵活性(如在不同的数据库名称上恢复)。

0

简单地做下面的事情不容易吗?

createdb -U test -T zeus_development zeus_production 
+0

实际上,上述确实有效。原来的问题没有提到他正在转向一台新机器。这只是假设。 -T选项非常有用。 – pedz

2

PostgresSQL文档影响了我使用自定义格式。我一直在使用它多年,似乎有各种优势,但YMMV。这就是说,这里是我工作:

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数据库。

这将从转储(〜/ Desktop/pg_dump)恢复数据库,该转储将使用转储的名称创建它。重命名将数据库命名为任何你想要的。

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

相关问题