PostgreSQL 10逻辑复制触发功能未执行

时间:2019-06-19 15:49:39

标签: 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();

在DB1甚至在DB2中实际上仅使用奇数ID的事实的一部分,为什么在第二个数据库中未触发该功能?

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

现在,我将在DB2中插入一条记录,我有ID 2和4。

对于我想要实现的目标是一个主控主系统,如果一个主控系统崩溃了,我可以写第二个主控系统,我并不是很在乎,但是在发生灾难时要考虑在停机的服务器上恢复数据库(也许使用pg-dump备份),我需要更新所有序列以从以前的位置开始写入。

2 个答案:

答案 0 :(得分:1)

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

您可以更改触发器,以便即使在复制过程中也能触发它:

ALTER TABLE mytab
   ENABLE ALWAYS TRIGGER atrigger;

答案 1 :(得分:1)

CREATE  TRIGGER yours_trigger_name
AFTER INSERT OR UPDATE ON yours_table_name
FOR EACH ROW
EXECUTE PROCEDURE yours_trigger_procedure_name();

alter table yours_table_name enable always trigger yours_trigger_name;
alter table yours_table_name enable replica trigger yours_trigger_name;

此构造在复制中有效,但如果您想使用 UPDATE OF yours_field_name 而不是仅使用 UPDATE,则它不起作用。我不知道为什么)))