Bootstrap pg_restore 之后的 bucardo 复制

Bootstrap bucardo replication after pg_restore

目前我正在设置 Master/Master 在不同位置的 5 个节点之间使用 bucardo 进行复制(应该提供位置透明性)。该数据库包含 ~500 个应该被复制的表。我根据它们之间的相互依赖性将它们分组为最多 50 个表的较小复制群。所有 table 都定义了主键,并且每个节点上的定序器都设置为提供系统范围内的唯一标识(基于残基 class)

为了在每个节点上获得一个初始数据库,我将一个 --data-only 自定义格式 pg_dump 放入一个文件中,并通过 pg_restore 在每个节点上恢复它。 Bucardo 同步设置了 bucardo_latest 策略来解决冲突。现在,当我开始同步时,bucardo 首先删除原始数据库中的所有数据集,然后从其中一个恢复的节点再次插入它,因为所有恢复的数据集都有一个“后来的时间戳”(我调用 pg_restore 的时间点) .这最终禁止了初始启动,因为 bucardo 需要很多时间并且也会失败,因为有很多数据集需要解决并且超时通常太短。

我在每个 table 上也有 'last_modified' 时间戳,由 UPDATE 触发器管理,但据我了解,pg_dump 通过 COPY 插入数据,因此这些触发器不会不会被解雇。

我只是想让 bucardo 跟踪每个新的更改,而不是因为还原而执行伪更改。

编辑:pg_restore 确实在恢复时触发了多个触发器...如前所述,我在每个 table 中跟踪用户和最后修改日期,并且这些值设置给用户和恢复完成时的时间戳。我知道,我可以通过 psql 为纯文本格式恢复设置 SESSION_REPLICATION_ROLE。这对 pg_restore 也有可能吗?

common approach 是在配置复制之前进行 dump/restore 处理。

所以一个选项是:

  1. 删除每个数据库中的 bucardo 模式
  2. 为每个对象做一个bucardo remove(大多数允许使用all,比如bucardo remove table all
  3. dump/restore 你的数据
  4. 重新配置复制。只需确保在添加同步时设置选项 onetimecopy=0。这是默认设置,但我觉得把它明确化会更安全。

bucardo用哪个时间戳来查出谁是bucardo_latest?

bucardo 处理自己的时间戳值。每个 table 都应该有一个名为 bucardo.delta_myschema_mytable 的触发器,它创建并插入一个名为 bucardo.delta_myschema_mytable 的 table。此 table 有一列 txntime timestamp with time zone not null default now(),这是使用的时间戳。

我是否必须用类似 set SESSION_REPLICATION_ROLE = 'replica';?

的方式调用 pg_dump

AFAIK,如果 bucardo 触发器已在 table 中设置,则 pg_restore 的选项 --disable-triggers 应该可以解决问题。

您还可以查看这些关于使用 large databases and the use of session_replication_role

的文章