目前,我正在不同位置的 5 个节点之间使用 bucardo 设置主/主复制(应该提供位置透明性)。该数据库包含大约 500 个应该被复制的表。我根据它们彼此的依赖关系,将它们分成最多 50 个表的较小的复制群。所有表都定义了主键,并且每个节点上的排序器都设置为提供系统范围的唯一身份(基于残基类)
为了在每个节点上获得一个初始数据库,我将--data-only
自定义格式 pg_dump 制作成一个文件,并通过pg_restore
. Bucardo 同步设置了bucardo_latest
解决冲突的策略。现在,当我开始同步 bucardo 时,首先删除原始数据库中的所有数据集,然后从其中一个恢复的节点再次插入它,因为所有恢复的数据集都有一个“稍后的时间戳”(我调用 pg_restore 的时间点)。这最终会阻止初始启动,因为 bucardo 需要非常多的时间并且也会失败,因为有很多数据集需要解决并且超时通常太短。
我在每个表上也有“last_modified”时间戳,由 UPDATE 触发器管理,但据我了解,pg_dump 通过 COPY 插入数据,因此这些触发器不会被触发。
- bucardo 使用哪个时间戳来找出是谁
bucardo_latest
? - 我必须
pg_dump
用类似的东西打电话set SESSION_REPLICATION_ROLE = 'replica';
吗?
我只想让 bucardo 跟踪每个新更改,而不是因为还原而执行伪更改。
编辑:pg_restore 在恢复时肯定触发了几个触发器......正如我所说的,我在每个表中跟踪用户和最后修改日期,并且这些值在恢复完成时设置为用户和时间戳。我知道,我可以设置 SESSION_REPLICATION_ROLE 以通过psql
. 这对 pg_restore 也有可能吗?