首页 > 解决方案 > PostgreSQL 13.3 逻辑复制不会在主服务器中创建复制槽

问题描述

我是 PostgreSQL 的新手。我正在尝试创建位于同一 localhost 和端口中的 2 个数据库的逻辑复制(我不知道这是否是我遇到的问题的一部分)。关键是,我创建发布没有问题,但是,在我创建订阅的那一刻,必须在主服务器中创建的复制槽不会创建。我有wal_level = logical,但我不知道是否需要在postgres.conf or中进行其他配置pg_hba

另一个细节是我无法通过代码创建订阅,Postgres 只是没有响应,就像卡在那里一样,没有显示任何错误消息或确认。我可以创建订阅的唯一方法是在 pgAdmin 4 中,但这里出现了它没有创建复制槽的错误。

任何帮助建议都被接受。顺便说一句,对不起,如果我的英语有点糟糕,我希望我已经解释过了。

标签: postgresqlreplicationlogical-replication

解决方案


您无法从代码创建订阅,因为当您使用 CREATE SUBSCRIPTION 创建复制槽(默认行为)时,无法在事务块内执行。

现在,在创建连接到同一数据库集群的订阅时(例如,在同一集群中的数据库之间进行复制或在同一数据库内进行复制)只有在复制槽不是作为同一命令的一部分创建时才会成功。否则,CREATE SUBSCRIPTION 调用将挂起。为了使这个工作,单独创建复制槽(使用函数 pg_create_logical_replication_slot 和插件名称 pgoutput)并使用参数 create_slot = false 创建订阅。这是一个实施限制,可能会在未来的版本中取消。

请参阅https://www.postgresql.org/docs/current/sql-createsubscription.html的注释部分


推荐阅读