PostgreSQL逻辑复制-创建订阅挂起

6
我正在尝试在两个云实例之间设置逻辑复制,两个实例都运行Debian 9和PG 11.1。在主实例上成功执行了CREATE PUBLICATION命令,但是当我在预期的逻辑副本上启动CREATE SUBSCRIPTION命令时,该命令无限期挂起。
在主实例上,我可以看到复制插槽已创建并处于活动状态,并且我可以看到一个新的walsender进程被创建并处于“等待”状态,在主日志中,我看到以下内容:
2019-01-14 14:20:39.924 UTC [8349] repl_user@db LOG:  logical decoding found initial starting point at 7B0/6C777D10
2019-01-14 14:20:39.924 UTC [8349] repl_user@db DETAIL:  Waiting for transactions (approximately 2) older than 827339177 to end.

但仅此而已。命令CREATE SUBSCRIPTION永远不会结束。

主数据库有大量插入操作,例如每分钟100次,但它们总是被提交的。因此不应该有任何长时间未提交的事务。

我尝试在谷歌上搜索这个问题,但没有找到任何相关内容。我错过了什么吗?


这两个数据库是否在同一集群中,即它们是否具有相同的主机名和端口? - Laurenz Albe
@LaurenzAlbe 他们位于不同的云实例上,具有不同的主机名,但两者的端口都是标准的5432。 - JosMac
1
我不知道什么是“云实例”,但我会再次确认它们确实位于不同的集群中。尝试先创建复制槽,然后使用复制槽创建订阅。如果我的怀疑是正确的,那将避免问题。 - Laurenz Albe
@LaurenzAlbe 您是正确的,它起作用了。请将其发布为答案,以便我可以接受它。非常感谢。 - JosMac
1个回答

7
由于数据库在“云”中,您不知道它们实际上在哪里。很有可能它们实际上在同一个数据库集群中,这可以解释您看到的死锁:CREATE SUBSCRIPTION等待包含复制源数据库的群集上的所有并发事务完成,然后才能创建其复制插槽,但由于两个数据库位于同一群集中,因此它等待自己完成,这显然是不可能的。解决方案是在源数据库中明确创建逻辑复制插槽,并在创建订阅时使用该现有插槽。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接