Postgres Notify不适用于逻辑复制

时间:2018-07-21 14:35:55

标签: postgresql logical-replication

我正在使用逻辑复制将数据从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()

问题在于,直到我将其插入表中(在逻辑复制外部读取)以触发触发器,所有侦听器都未收到消息,然后侦听器接收到所有应从逻辑发送的通知消息复制。

在我们转向逻辑复制之前,所有这些方法都运行良好(我们有一个自行开发的解决方案,该解决方案已经淘汰,对此我一无所知)。

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

某人关于堆栈溢出的另一份报告:Notify From Trigger On PG Logical Replicated Table

问题:如何调试此问题?如何让收听者接收消息而无需手动插入一行以使其突然出现?

1 个答案:

答案 0 :(得分:0)

更新:看来这是bug with PostgreSQL 10.4here有一个实验性补丁。


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

您似乎可以通过执行以下操作将表更改为始终触发触发器,包括在复制时触发触发器(请参见文档here):

ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;