首批通过分布式安全可靠测评,为关键业务系统打造
如何处理数据不一致问题?
更新时间:2023-06-25 11:15:00
由于数据的迁移任务和删除任务是分开的,在迁移任务运行完成,到删除任务开启之前,应用有可能会由于各种各样的原因对数据造成再次修改,导致删除的时候出现数据不一致的情况。按历史库平台的设计逻辑,有三种数据不一致的场景会导致删除任务失败,历史库平台把这三种不一致的场景定义为:CHECK_COLUMN_COUNT_NOT_MATCH,CHECK_RECORD_COUNT_NOT_MATCH,CHECK_COLUMN_NOT_MATCH。
- CHECK_COLUMN_COUNT_NOT_MATCH: 表示源端和目标端数据表的列数不一致,通常是由于在线库端数据表增加了字段,没有同步到历史库端。这种情况需要在历史库端增加对应字段,再重启任务即可。
- CHECK_RECORD_COUNT_NOT_MATCH: 表示源端的某个主键范围内获取到了200行数据,但这个主键范围内的目标端数据少于200行,说明迁移任务完成后,目标端符合条件的数据又增加了。这种情况需要点击 项目-具体报错项目的详情-具体报错的逻辑表-更多操作-修改 ,将逻辑表配置中的 enable_imprecise_save_point 改为 true ,这样源端的这一批次数据就会继续被保留在源端,下一次配置迁移任务的时候把这些数据包含进来重新迁移即可。
- CHECK_COLUMN_NOT_MATCH: 表示在删除时发现源端某个字段的值和目标端的数据不一致,说明由于某些原因应用在迁移之后对数据进行了修改,这种情况下我们可以选择跳过这些记录,让它们继续保留在源端,等待下次迁移。修改方法是点击 项目-具体报错项目的详情-具体报错的逻辑表-更多操作-修改 ,将逻辑表配置中的 dirty_row_action 修改为 跳过(SKIP) ,allowed_dirty_columns 填写数据不一致的列,多列可用逗号隔开,max_allowed_dirty_row_count 填写-1表示不限制,填大于零的正整数表示最多允许多少行不一致。 当然,如果业务本身允许这种不一致,需要直接删除,也可以将dirty_row_action 修改为 忽略错误(CHEAT_AS_NORMAL) 。