【问题标题】:Bootstrap bucardo replication after pg_restorepg_restore 后引导 bucardo 复制
【发布时间】:2020-07-30 13:22:42
【问题描述】:

目前,我正在不同位置的 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 是谁?
  • 我是否必须使用set SESSION_REPLICATION_ROLE = 'replica'; 之类的方式致电pg_dump

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

编辑:pg_restore 在恢复时肯定触发了几个触发器......正如我所说的,我在每个表中跟踪用户和最后修改日期,并且这些值在恢复完成时设置为用户和时间戳。我知道,我可以通过psql 为纯文本格式恢复设置 SESSION_REPLICATION_ROLE。 pg_restore 是否也可以这样做?

【问题讨论】:

    标签: postgresql replication pg-dump pg-restore bucardo


    【解决方案1】:

    common approach 是在配置复制之前进行转储/恢复过程。

    所以一个选项是:

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

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

    bucardo 处理自己的时间戳值。每个表都应该有一个名为bucardo.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 触发器已经在表中设置,pg_restore 的选项 --disable-triggers 应该可以解决问题。

    您还可以查看这些关于使用large databases 和使用session_replication_role 的文章

    【讨论】:

    • 我错误地认为 pg_dump 使用 COPY 来加载行,而 COPY 无论如何都不会触发触发器。感谢您的提示,我发现pg_dump 上有一个--disable-triggers 开关,它确实按预期工作(oh-myy)......也感谢大量资源和文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多