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 备份),我需要更新所有序列以从之前的位置开始写入。
默认情况下,触发器不会在逻辑备用服务器上执行,因为该参数session_replication_role设置为replica应用更改的时间。
您可以更改触发器,以便它即使在复制期间也会触发:
ALTER TABLE mytab
ENABLE ALWAYS TRIGGER atrigger;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2995 次 |
| 最近记录: |