关于postgresql:在postgres中复制数据库

Copy database in postgres

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

1
CREATE DATABASE destniationDb TEMPLATE sourceDb;

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

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


为什么不使用该命令创建现有数据库sourceDb的转储

1
pg_dump sourceDb > destinationDb.sql

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

1
psql destinationDb < destinationDb.sql


你有没有尝试先锁定桌子?

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

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