数据迁移前后一致性问题

493 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

我们在数据迁移过程中,一般都会涉及到全量迁移增量迁移,迁移完成之后还要涉及到数据的一致性问题,校验迁移后,新旧数据库的数据是否完全一致,是否涉及到中间状态的数据是否需要修改,一般的话如果新旧数据库是完全一样的产品,那按照正常的数据库写入数据的客户端使用就行,如果前后数据库产品不一样,比如从Oracle迁移到MySQL,我们需要注意一些语法上的问题、数据存储类型问题等等,本小节,我们只讨论数据迁移前后数据一致性的问题。

1.全量数据迁移

全量数据迁移,顾名思义,就是把全部数据进行迁移,一般针对静态数据,就是一些没有状态变化的数据,我们在进行全量迁移的时候,一般是截止到某个时间点的数据进行迁移,我们的目标数据源可能是单库单表,也可能是多库多表,具体的分片方案可以根据实际业务来,一般是我们会通过一些全量迁移的工具进行迁移,那么我们针对全量迁移数据一致性校验有以下几个方法。

在迁移之前我们可以先记录好要迁移的数据范围,在通过自研的迁移工具,或者开源的工具比如阿里开源的DataX进行迁移之后,我们要对迁移前后的数据量进行对比,如果迁移前后数据量对的上那就没啥问题。

如果对不上咋办呢?一搬表中的每条数据都有一条唯一ID,我们可以根据迁移前后的ID数据集求差集,求出来的差集就是迁移过程中缺失的数据,这些数据通过我们的迁移工具在搞一遍,然后再对比一下数据量,如果完全一样就没问题。

2.增量数据迁移

增量数据迁移的话,一般我们的方案是监听数据库Binlog写新数据源,或者在代码里边写双写的逻辑,在写一段时间之后,我们在把新数据库写入时间点之前的数据,从老数据库迁移过来,但是会存在一些问题,以订单表为例,中间涉及到订单状态的修改,老数据库有一条数据的状态是未完成状态,新的数据库就把这条数据写入了,没有修改订单的状态。这个的话在这边的解决方案是,通过监听老数据库迁移时间点之前的数据,如果有变化,将这写数据放入消息队列,通过异步的方式将这些数据在新的数据库进行修改。

等双写一段时间之后我们,在通过对比前后数据库的数量是否完全一致,如果一致说明迁移OK。

22_数据迁移程序.png