在postgres中复制数据库

时间:2011-06-28 06:31:30

标签: postgresql

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

CREATE DATABASE destniationDb TEMPLATE sourceDb;

但是当与sourceDb的连接/会话存在时,此选项失败。因此,我需要截断此选项,因为用户很有可能进行读取操作。 所有命令行选项,如restore_db,backup_db都符合我的要求。因此,我需要一些控制台命令/功能/存储过程来实现它,即我需要连接到数据库并调用一些命令/功能/存储过程来实现这个目标

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

2 个答案:

答案 0 :(得分:11)

为什么不使用命令

创建现有数据库sourceDb的转储
pg_dump sourceDb > destinationDb.sql

在此SQL转储destinationDb.sql中,将数据库名称更改为CREATE DATABASE行中的新名称。之后,您可以使用psql在服务器上创建此新数据库,如:

psql destinationDb < destinationDb.sql

答案 1 :(得分:0)

你先试过locking the table吗?

编辑:我可能过于简单了。我在想如果你锁定写入你正在复制的表可能会有效。但是在克隆整个数据库时似乎并非如此。

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