gpt4 book ai didi

postgresql - Postgres 通知不适用于逻辑复制

转载 作者:行者123 更新时间:2023-11-29 11:36:37 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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


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

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

ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;

关于postgresql - Postgres 通知不适用于逻辑复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51457034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com