0

目前,我正在不同位置的 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 也有可能吗?

4

1 回答 1

1

常见的方法是在配置复制之前进行转储/恢复过程。

所以一个选项将是:

  1. 删除bucardo每个数据库中的架构
  2. 为每个对象做一个bucardo remove(大多数都允许使用all,比如bucardo remove table all
  3. 转储/恢复您的数据
  4. 再次配置复制。只需确保在添加同步时,设置选项onetimecopy=0. 这是默认设置,但我觉得明确表示更安全。

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

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

我是否必须使用 set SESSION_REPLICATION_ROLE = 'replica'; 之类的东西调用 pg_dump?

AFAIK,如果bucardo已经在表中设置了触发器,那么选项应该可以解决--disable-triggers问题。pg_restore

您还可以查看有关使用大型数据库和使用session_replication_role的这些文章

于 2020-07-31T16:55:43.500 回答