Kes到Kes的持续业务不停机数据比对修复方案
关键字:
Kingbase FlySync、不停机、数据比对修复
背景
在数据实时同步到目标端之前,通过详细比对-数据修复将数据同步到了目标端,导致实时同步的目标端入库出现大量的主键冲突报错,而错误处理跳过主键冲突性能较低,导致目标端入库无法追平源端。通过比对修复方案,在源端不停业务的情况下,修复目标端数据,且修复后目标端同步服务正常,不会出现主键冲突报错。
操作步骤
2.1校验设置-启用V8快照校验
如果开启大对象校验,则建议开启记录大对象数据,避免校验修复时查询源端大对象数据报错。
2.2目标端offline
执行以下命令,将目标端offline,使目标端数据静止,保障比对结果:
fsrepctl -service servicename offline
2.3新建比对任务,执行数据比对
比对逻辑(原理)如下,若用Web端进行比对则不用执行以下操作:
- 校验任务开始执行,源端开启事务,通过查询lsn生成快照,查询快照号:
begin;
set transaction_isolation to "repeatable read";--kes可重复读级别,无幻读的问题,生成快照时有未提交的事务,比对中提交,不会被查询到
select sys_current_xlog_location();--V8R3查询当前lsn
SELECT sys_current_wal_lsn();--V8R6 ORACLE兼容模式,当前wal日志写入位置
SELECT pg_current_wal_lsn();--V8R6 其他兼容模式
select sys_export_snapshot();--查询到的内容是事务中第一个非事务控制语句执行时的快照,快照号格式:0000000B-0000F3CE-1
- 每张表的比对:
begin;
set transaction_isolation to "repeatable read";
set transaction snapshot '0000000B-0000F3CE-1';--一个snapshot-importing事务的隔离级只能是SERIALIZABLE或者REPEATABLE READ
select表
比对
比对完成关闭每张表的事务
- 校验任务结束,关闭校验任务的事务
2.4数据校验-查看结果-校验修复
在web端进行校验修复数据
2.5数据校验-查看结果-查看断点
断点即lsn号,示例:kb:1153439928,对应kufl的kb:oldlsn:commitlsn中的commitlsn
2.6目标端指定-skip-event断点号online
通过下列命令,使目标端从断点处开始online,即只同步断点以后的数据:
fsrepctl -service servicename online -skip-event 断点
(注:判断每个seqno,seqno最后一个frag的EVENTID的后半部分<断点号,则跳过
即:<断点号的数据,通过比对修复拉平,>=断点号的数据,通过实时同步入库)
示例:
SEQ# = 217 / FRAG# = 0 (last frag)
-
TIME = 2023-07-27 14:38:37.596
-
EPOCH# = 1
-
EVENTID = kb:6626314008:7474922488
-
SOURCEID = 10.10.0.7
适用场景
KesV8源端不停业务,目标端允许offline,库级别的比对修复:
- 源端为KesV8
- 目标端同步服务允许offline
- 整库数据比对耗时:参考值5M/s,估算比对耗时是否可接受
- 差异数据量:对于差异条数500W条以上的表,推荐使用搬迁修复
- 增量业务量:目标端需要追平比对修复期间及之后产生的增量,如果业务量很大,需评估追平耗时是否可接受
注意事项
- 快照比对不支持暂停、恢复:暂停恢复会丢失快照,多表比对时暂停、恢复无法保证使用的是同一快照
- 增量比对不支持快照比对,是否开启快照比对不影响增量比对
- 任务执行中修改校验配置,开启快照校验,仍会按未开启快照校验执行
- 生成快照后,修改源端表结构,不影响快照比对
- skip event过程中不能重启replicator或者offline、online目标端服务,会从重启前已入库的位置开始入库
- 目前只优先验证了高法场景,KesV8R6(oracle)-KesV8R6(oracle)