Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres Notify不使用逻辑复制_Postgresql_Logical Replication - Fatal编程技术网

Postgresql Postgres Notify不使用逻辑复制

Postgresql Postgres Notify不使用逻辑复制,postgresql,logical-replication,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()

我正在使用逻辑复制将数据从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相关的内容

另一份来自某人的关于堆栈溢出的报告:


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

更新:看起来这是一个,至少是一个。有一个实验补丁可用


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

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


触发器正在触发,如问题中所述。它们已经被设置为“总是”。我可以想到两件事:你确定上游查询已经提交了它的事务吗?通知不会开火。另外,您确定要在生成复制副本之前订阅该事件吗?我不确定如何检查它是否通过逻辑复制提交,但我可以确认在查询受影响的表时可以看到数据。是的,我确信有一个客户端正在侦听事件,因为如果我在逻辑复制之外插入触发notify的表,所有事件都会发送到侦听器,包括来自逻辑复制的事件。与此同时,我每分钟运行一个cron任务,将其插入到触发的表中,以不断刷新通知。请注意,有两个通道用于侦听,插入复制之外的一个通道允许从中使用两个通道。我可以使用复制复制您看到的内容。在浏览了几次文档并尝试了不同的东西之后,我个人的感觉是这似乎是一个bug。我填了一份表格。希望邮件列表上的人能知道更多。
ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;