postgresql 为什么我的逻辑复制失败并显示“无法删除复制插槽...不存在”?

vh0rcniy  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(2)|浏览(621)

我们的逻辑复制已经开始失败,订阅服务器上出现了许多这样的错误:

ERROR:  could not create replication slot 
"pg_148211637_sync_148178452_7161337762731575223": ERROR:  all replication slots are in use
May  2 07:43:01 psql-06 postgres[1195903]: [2]  HINT:  Free one or increase max_replication_slots.
May  2 07:43:01 psql-06 postgres[1181479]: [1] LOG:  background worker "logical replication worker" (PID 1195903) exited with exit code 1
May  2 07:43:01 psql-06 postgres[1195905]: [1] LOG:  logical replication table synchronization worker for subscription "sub_production", table "products" has started
May  2 07:43:01 psql-06 postgres[1195901]: [1] LOG:  could not drop replication slot "pg_148211637_sync_148183118_7161337762731575223" on publisher: ERROR:  replication slot "pg_148211637_sync_148183118_7161337762731575223" does not exist

它似乎一直在尝试删除发布服务器上的复制插槽pg_148211637_sync_148183118_7161337762731575223,但不知何故它不存在?
这种情况是如何发生的?如何解决/恢复复制?

u7up0aaq

u7up0aaq1#

连接到主服务器并在其中查找已放弃的复制插槽:

SELECT slot_name, slot_type, restart_lsn
FROM pg_replication_slots
WHERE NOT active;

其中任何不属于备用服务器但仍需要的服务器都应该去:

SELECT pg_drop_replication_slot('name of the slot');

如果需要10个以上的复制插槽,请在主服务器上增加max_replication_slots并重新启动它。
很难说你是如何陷入困境的,但可能是这样的:只要您说CREATE SUBSCRIPTION,备用服务器就会连接到主服务器并创建一个逻辑复制插槽(除非您明确告诉它不要这样做)。如果创建订阅时出现问题,或者复制中断,则复制插槽仍在主服务器上。因此,可能需要多次失败的尝试才能使逻辑复制运行,而您忽略了在失败尝试后进行清理。

lvmkulzt

lvmkulzt2#

你误解了错误。主要错误是无法创建插槽,因为所有允许的插槽都已在使用中。
但是复制副本随后尝试在其自身之后进行清理,其通过尝试丢弃其首先未能创建的槽来进行,这当然不起作用,因为没有什么可清理的。所以这部分失败了,但它不是整个失败中有趣的部分。

相关问题