PostgreSQL 10逻辑复制触发函数未执行

Seb*_*ano 2 postgresql replication database-replication multi-master-replication

我已经在 2 个不同服务器的 2 db 内实现了 PostgreSQL 10 中的逻辑复制,并且我知道序列不同步,因此我在两个数据库中创建了如下触发器函数:

CREATE FUNCTION update_ogc_fid()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF 
AS $BODY$
Declare 
iInt integer;
BEGIN
execute 'Select nextval('|| chr(39) || 'address_ogc_fid_seq' || chr(39) ||');' into iInt;
NEW.ogc_fid = iInt;
RETURN NEW;
END;
$BODY$;

CREATE TRIGGER update_ogc_fid_address
    BEFORE INSERT 
    ON address
    FOR EACH ROW
    EXECUTE PROCEDURE update_ogc_fid();
Run Code Online (Sandbox Code Playgroud)

事实上,实际上ID在 DB1 中只使用奇数,而在 DB2 中使用偶数,为什么在第二个数据库中没有触发该函数?

如果我在 DB1 中插入一条记录,我有ID3,它会进行复制,并且在 DB2 中我有相同的记录ID,我将检查 DB2 中的序列,它仍然是 1,而不是 3。

现在我要在 DB2 中插入一条记录,我有ID2 条记录,然后是 4 条记录。

对于我想要实现的目标是一个主主系统,如果一个系统出现故障,我可以在第二个系统中写入我并不太关心,但考虑在发生灾难时我要恢复数据库在已关闭的服务器中(可能使用 pg-dump 备份),我需要更新所有序列以从之前的位置开始写入。

Lau*_*lbe 8

默认情况下,触发器不会在逻辑备用服务器上执行,因为该参数session_replication_role设置为replica应用更改的时间。

您可以更改触发器,以便它即使在复制期间也会触发:

ALTER TABLE mytab
   ENABLE ALWAYS TRIGGER atrigger;
Run Code Online (Sandbox Code Playgroud)