【问题标题】:PostgreSQL 10 logical replication trigger function not executedPostgreSQL 10 逻辑复制触发功能未执行
【发布时间】:2019-11-02 10:15:31
【问题描述】:

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

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 的事实的一部分,为什么在第二个数据库中没有触发该函数?

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

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

对于我想要实现的是一个主主系统,万一那个坏了我可以写第二个我不太在乎,但是当我要去的时候会考虑以防万一恢复服务器中已关闭的数据库(可能使用 pg-dump 备份)我需要更新所有序列以从之前的位置开始写入。

【问题讨论】:

    标签: postgresql replication database-replication multi-master-replication


    【解决方案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 它不起作用。我不知道为什么)))

    【讨论】:

      【解决方案2】:

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

      您可以更改触发器,使其即使在复制期间也能触发:

      ALTER TABLE mytab
         ENABLE ALWAYS TRIGGER atrigger;
      

      【讨论】:

      • 这将使触发器触发,但如果目标是在多主设置中保持序列同步,我认为这个触发器不会这样做......
      • 这个教程我用过,我用的是wal_level = logicaldigitalocean.com/community/tutorials/…
      • @NickBarnes 我同意。我只是试图解释为什么触发器不触发。
      • 我试试看会发生什么
      猜你喜欢
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多