【问题标题】:Postgres Notify not working with logical replicationPostgres Notify 不适用于逻辑复制
【发布时间】:2018-12-29 14:54:41
【问题描述】:

我正在使用逻辑复制将数据从 Postgres 10.4 复制到另一个 Postgres 10.4 实例。

订阅者有多个将事件记录到单个表的触发器。此表有一个触发器,它执行另一个函数(返回触发器)来为下游侦听器调用 NOTIFY。

审计表上的触发器如下所示:

CREATE TRIGGER queue_insert
    AFTER INSERT ON schema_name.table_name FOR EACH ROW
     EXECUTE PROCEDURE notify_downstream()
GO

通知下游定义:

CREATE OR REPLACE FUNCTION schema_name.notify_downstream () RETURNS trigger AS
'
declare
message character varying;
begin

raise log ''notify running!'';

message := ''
{ "id": 'edited for brevity' }

'';
execute ''notify chan_name, '''''' || message || '''''''';

raise log ''Value: %'', message;
return new;
end;
'
LANGUAGE 'plpgsql'
GO

使用日志记录,我能够证明这是触发。我还可以看到有数据使用:

select pg_notification_queue_usage()

问题是,在我插入表(读作:逻辑复制之外)以使触发器触发之前,没有一个侦听器收到消息,然后侦听器接收到所有通知应该从逻辑发送的消息复制。

在我们转向逻辑复制之前,所有这些都运行良好(我们有一个已停用的本土解决方案,我对此一无所知)。

我没有收到任何可以给我任何线索的错误或奇怪的消息。我也发现了日志的详细程度,除了我添加到函数中以验证它们是否正在运行的日志语句之外,没有看到任何与通知相关的内容。

另一个来自 Stack Overflow 的人的报告:Notify From Trigger On PG Logical Replicated Table

问题:如何调试此问题?如何让听众接收消息而不手动插入一行让它们突然出现?

【问题讨论】:

    标签: postgresql logical-replication


    【解决方案1】:

    更新:看起来这是一个bug with PostgreSQL 10.4,至少达到至少11.4。有一个实验性补丁可用here


    根据 PostgreSQL 邮件列表上的this post,默认情况下,逻辑复制似乎不会导致触发器在副本上触发,因为表通常具有“本地”复制角色,而在逻辑副本上,数据以“副本”角色插入.

    看起来您可以通过执行以下操作更改表以始终触发触发器,包括在复制时(请参阅文档here):

    ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;
    

    【讨论】:

    • 触发器正在触发,如问题中所述。它们已设置为“始终”。
    • 我能想到几件事:您确定上游查询已提交其事务吗? NOTIFY 不会触发 until the current transaction is committed。另外,您确定要在副本生成之前订阅该事件吗?
    • 我不确定如何检查它是否通过逻辑复制提交,除非我可以确认在查询受影响的表时可以看到数据。是的,我确信有一个客户端正在监听事件,因为如果我插入到触发逻辑复制之外的通知的表中,所有事件都会转到侦听器,包括来自逻辑复制的事件。
    • 与此同时,我每分钟运行一个 cron 任务以插入触发的表中以不断刷新通知。请注意,有两个通道用于侦听,在复制之外插入一个通道允许两个通道都被使用。
    • 我能够使用steps outlined here 复制您所看到的内容。在浏览了几次文档并尝试了不同的事情之后,我个人的感觉是这似乎是一个错误。我已经填写了PostgreSQL bug ticket。希望邮件列表上的人会知道更多。
    猜你喜欢
    • 2018-02-24
    • 2019-12-29
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2021-11-29
    相关资源
    最近更新 更多