使用canal做数据备份而不用mysql自带的主从备份的场景主要为:
跨数据库的数据备份,例如mysql=> oracle
数据异构,即对同一份数据做不同的分库分表查询。例如卖家和买家各自分库索引
单机单点消费mysql的log-bin后直接更新到备份数据库中,数据一致性没有问题。但是如果变成分布式环境以及消费mysql的log-bin后将更新数据推到MQ中由多节点消费更新到多个备份数据库中,则会出现数据更新时序和数据一致性的问题。
而以上代码在update sql中除了获取值变化了的字段,也反查数据库获取了未变化的字段。因此每次update的sql实际上是该条记录的全量数据。
通过在表中加上时间戳字段作为记录的版本号,用逻辑删除取代物理删除delete,修改以上代码的sql拼接,insert操作时忽略主键冲突、update操作时仅更新版本号(时间戳)旧的记录,可以极大避免数据不一致的现象,也解决了MQ重复消费的问题。
再通过定时任务,每天一次增量数据更新,每周一次全量数据更新,保证数据的最终一致性。