我有一个要求,我需要拍摄数据库的快照,并在postgres中使用其他预定义名称在同一台机器上恢复它。 我尝试使用以下命令完成上述任务。
CREATE DATABASE destniationDb TEMPLATE sourceDb;
但是当与sourceDb的连接/会话存在时,此选项失败。因此,我需要截断此选项,因为用户很有可能进行读取操作。 所有命令行选项,如restore_db,backup_db都符合我的要求。因此,我需要一些控制台命令/功能/存储过程来实现它,即我需要连接到数据库并调用一些命令/功能/存储过程来实现这个目标
你们中的任何人都可以根据我的要求提出某种解决方案吗?
答案 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秒才能结束会议,所以这个解决方案不应该太具破坏性。