2011-06-28 57 views
6

我有一个要求,我需要拍摄一个数据库的快照并在postgres中使用其他预定义名称在同一台机器中恢复它。 我试图用以下命令来完成上述任务。在postgres中复制数据库

CREATE DATABASE destniationDb TEMPLATE sourceDb; 

但是,当连接/会话到SOURCEDB exists.So我需要的,因为是用户在做读操作的可能性高截断此选项,该选项失败。 所有命令行选项,如restore_db,backup_db都适合我的要求。因此,我需要一些控制台命令/函数/存储过程来实现它,即我需要连接到数据库并调用某些实现此功能的命令/函数/存储过程目的。

你们中的任何人都可以为我的要求提供某种解决方案吗?

回答

11

你为什么不只是使用命令

pg_dump sourceDb > destinationDb.sql 

而且在这个SQL转储destinationDb.sql,该数据库名称更改为在CREATE DATABASE线的新创建现有数据库sourceDb的转储。

psql destinationDb < destinationDb.sql 
+0

我试过这个选项,但它不适合我们的要求。 – Patton

+0

为什么?你能详细说明这个特例吗? – nemesisfixx

+0

实际上我们不想使用任何像createb,dropdb这样的postgres命令行选项,在这种情况下pg_dump;我们正在寻找的选项有些不同,比如编程式(使用JDBC)。我提到的选项 CREATE DATABASE destniationDb TEMPLATE sourceDb; 需要不到6秒完成操作。在你提到的情况下,需要一分钟才能完成操作 顺便说一句我已经尝试了这里给出的解决方案http://stackoverflow.com/questions/1237725/how-to- copy-postgres-database-to-another-server – Patton

0

你试过locking the table第一:在这之后,你就可以使用psql像在服务器上创建这个新的数据库?

编辑:我可能是过于简单化了。我在想,如果将写入操作锁定到正在复制操作的表格可能会起作用。但是,克隆整个db似乎并非如此。

从您在评论中提供的链接开始,数据库必须没有活动的会话。我通过在操作之前立即重新启动postgres服务来解决这个问题。如果脚本速度足够快,您的后续副本应该在新会话连接之前运行。我相信postgres会等待长达90秒的会话结束,所以这个解决方案不应该太破坏性。

+0

http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html 请仔细阅读本文。它清楚地表明,当一个会话源Db打开,则操作失败。 顺便说一句我没有尝试这个锁定表可以请给我一个关于如何在目前的情况下做一个例子? – Patton

+0

@Spiff你的解决方案看起来很好,会检查这是否可行。 – Patton