Postgres 通知不适用于逻辑复制

Postgres Notify not working with logical replication

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

订阅者有多个触发器将事件记录到单个 table。这个 table 有一个触发器执行另一个函数(returns 一个触发器)来为下游监听器调用 NOTIFY。

审核触发器 table 如下所示:

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()

问题是 none 的听众收到消息,直到我插入 table(读作:在逻辑复制之外)以使触发器触发,然后听众收到所有通知的消息应该从逻辑复制发送。

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

我没有收到任何可以给我任何线索的错误或奇怪消息。我也调高了日志记录的冗长程度,除了我添加到函数中以验证它们是 运行.

的日志语句外,没有看到与 Notify 相关的任何内容

Stack Overflow 上某人的另一份报告:Notify From Trigger On PG Logical Replicated Table

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

更新:看起来这是一个 bug with PostgreSQL 10.4, and at least up to at least 11.4. There's an experimental patch available here


根据 PostgreSQL 邮件列表上的 this post 看来,默认情况下逻辑复制不会导致触发器在副本上触发,因为 tables 通常具有 "local" 复制角色,而在逻辑副本上使用 "replica" 角色插入数据。

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

ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;