目前,我正在设置不同位置的5节点之间的主/主复制(应该提供位置透明性)。该数据库保存了大约500个应该复制的表。根据它们之间的依赖性,我将它们分组为最多由50个表组成的较小的复制群。所有表都定义了主键,每个节点上的排序器被设置为提供系统范围的唯一标识(基于剩余类)。
为了在每个节点上获得一个初始数据库,我将一个--data-only自定义格式的pg_dump设置为一个文件,并通过pg_restore在每个节点上恢复这个格式。通过使用bucardo_latest策略来解决冲突,可以设置布卡多同步。现在,当我开始同步时,bucardo首先删除原始数据库中的所有数据集,然后从还原的节点中再次插入它,因为所有还原的数据集都有一个“较晚的时间戳”(我调用pg_restore的时间点)。这最终禁止了这项创业,因为布卡多需要很长时间,而且也失败了,因为有很多数据集需要解决,超时时间往往太短。
我还在每个表上都有“last_modified”时间戳,这些表由UPDATE触发器管理,但据我所知,pg_dump通过复制插入数据,因此不会触发这些触发器。
bucardo_latestpg_dump的东西给set SESSION_REPLICATION_ROLE = 'replica';打电话吗?我只想让布卡多跟踪每一个新的更改,而不是因为恢复而执行伪更改。
编辑: pg_restore肯定在restore上触发了几个触发器,time...as说我跟踪每个表中的用户和最后修改日期,这些值在还原完成时被设置为用户和时间戳。我知道,我可以通过SESSION_REPLICATION_ROLE将psql设置为纯文本格式的还原。对于pg_restore来说,这也是可能的吗?
发布于 2020-07-31 16:55:43
共同方法是在配置复制之前进行转储/还原过程。
因此,一种选择是:
bucardo模式bucardo remove (大多数对象允许使用all,如bucardo remove table all )onetimecopy=0。这是默认的,但我觉得说得更清楚些。,布卡多用来找出谁是bucardo_latest?的时间戳
bucardo处理自己的时间戳值。每个表都应该有一个名为bucardo.delta_myschema_mytable的触发器,该触发器可以在名为bucardo.delta_myschema_mytable的表中生成和插入。这个表有一个列txntime timestamp with time zone not null default now(),这是使用的时间戳。
,我必须用set SESSION_REPLICATION_ROLE =‘SESSION_REPLICATION_ROLE’;?之类的东西来调用pg_dump吗?
AFAIK,如果表中已经设置了bucardo触发器,则选项--disable-triggers of pg_restore应该可以做到这一点。
https://stackoverflow.com/questions/63174155
复制相似问题