1.数据迁移场景描述

以下只列举几个特殊场景:

scala 那边的表字段名和现在微服务中的字段名大部分不一致

scala 项目 A 表中的大部分字段需要迁移到微服务中的 A’ 表中,但是有一小部分字段需要和 B 表中的所有字段关联后迁移到微服务的 B’ 表中

scala 项目中的一些枚举与现在微服务中重新规定的枚举有一些差异

待迁移表中有一个特别大的待迁移字段:

`value` varchar(10000) NOT NULL COMMENT '属性值';

术语约定:

​ 源表:scala 中待迁移到微服务中的表

​ 目的表:微服务中的表

2、验证函数选择

网上介绍更多的方法是借助 pt-table-chum 工具进行验证,下面是其原理介绍:

pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的chec七墨博客ksum值,由此判断主从数据是否一致…

根据其原理发现这个工具基于当前特殊场景好像不是很适合,但是还是很有借鉴意义的,比如原理中提到的比较主从库上相同数据块的 checksum 值,那我们这边也可以对源表与目的表分别进行分组并取 checksum 值,最后对比相同数据块的checksum值就可以了。所以搜索下 checksum 是如何计算的,找到如下内容:

计算checksum值时的函数,默认是CRC32,其他还有FNV1A_64, MURMUR_HASH, SHA1, MD5等

通过测试发现 MySQL 目前仅支持:CRC32、SHA1、MD5这三个函数。通过翻阅资料,这三个函数的算法的性能对比文章还是很多的,可以参考博客,结论:MD5的计算速度明显优于另外两个函数。经查询资料,发现md5意外冲突的概率为2 ^ -128,针对本文这种验证情况,可忽略不计。故选择MD5进七墨博客行数据一致性验证。

3、一致性验证流程

通过 count 函数验证迁移前后数据条数是否一致

这个比较简单,其实就是通过数据迁移时的数据规划,确定哪些数据该迁移到哪个表,然后对源表和目的表分别取count值进行对比即可。

通过 md5 函数验证迁移前后数据内容是否一致

首先使用 MySQL 提供的contact函数来合并字段的值,但是假如CONCAT中含有NULL值,那么就会导致最终的结果为NULL,所以我们要先用IFNULL函数来替换NULL值,比如:

CONCAT(IFNULL(pname,''),IFNULL(dname,''))

https://qimok.cn

简单拼接下sql:

SELECT

id, MD5(CONCAT(

id,

IFNULL(pname,''),

IFNULL(dname,''))

) AS md5_value

FROM sub

order by id;

我们对源表与目的表都执行上面的sql,然后把结果拿到软件beyond compare中对比下,很容易就能找出不相同的行以及主键 ID。

解决特殊场景:手写sql是很容易解决上文提到的特殊场景1~3。对与特殊场景4,其实单独对特别长的字段先取一次md5值,就变为32个字节了,也得到了解决。

但是数据量小一点还行,假如数据量特别大(千万级别),那么执行的结果集也是相当大的,千万级别的数据量对比一整天也够呛能搞完呀!

此时,可以尝试缩小结果集,可以将多行记录的MD5值合并起来再求MD5值,如果最后MD5的值相同,说明这些行也是相同的,如果不同的话肯定是有差异的,我们再对比这些行就可以了。

如果需要将分言七墨组后的结果合并,需要使用GROUP_CONCAT函数,注意在GROUP_CONCAT函数中添加排序保证合并数据的顺序, SQL如下:

SELECT Min(id) AS min_id,

Max(id) AS max_id,

Count(id) AS row_count,

md5(group_concat(

md5(concat(id, pname, dname))

ORDER BY id

)) AS md5_value

FROM sub

GROUP BY (id DIV 32);

解释下id DIV 32:group_concat函数可以拼接的最大长度是1024个字节,md5的值最长占32个字节,1024/32=32。为了防止拼接被截断,故id对32取商进行分组。

执行结果:

min_id max_id row_count md5_value

46527776 46527807 32 b23eb8a7a034e33ae2e270fb4959fd59

46527808 46527839 32 f6b404e432fa0518cea10444947fd719

46527840 46527871 32 5c4838332396b5067b40f31122b06185

46527872 46527903 32 129b297ddc4d1908fe847782cb281c58

46527904 46527935 32 7c88bad5ee173777df5c37f8efc091da

46527936 46527967 32 15d6422ff3f52fc791d8244f5eefb164

46527968 46527990 23 927d5d1c6d1eebcb2e33e7786d3daa6e

46563126 46563130 5 784db028250312c34e0671b6aabaabf9

46563787 46563787 1 b0f83065c2026e4988fa6580e3e9570a

这样效率提升了32倍。

4、拓展

由于生产数据量是千万级别的,即使每32条数据分成一组,那至少也要30多万条的md5值需要对比,工作量也是相当大的,故作出以下拓展:

拓展1:

当生产要求不是很严格的时候,可以在凌晨(用户活跃度很低的情况下),执行以下语句(扩大group_concat的长度限制,当前会话生效):

SET SESSION group_concat_max_len = 102400;

此时id对3200取商进行分组,然后再进行md5方式验证,如果担心此种方式对服务器造成很大七墨博客的压力,可参考拓展2。

拓展2:

数据迁移后,找运维人员将源表和目的表都同步到测试数据库,然后扩大 group_concat 的长度限制,比如还是扩大到102400字节,再进行md5验证,然后对比迁移前后的结果,此时对比的效率扩大到初始的3200倍。具体group_concat 可以搞到多大,可以自行参考 MySQL 官方文档。

拓展3:

双写打开后,也可以通过md5的方式验证源表与目的表中双写的新数据是否一致,只需要在where子句中对created进行限制一下即可。

注意:

对于数据迁移不一致的情况,我认为不一致基本都是批量问题,主要还是因为迁移脚本导致迁移前后数据的批量不一致。

​另外,数据迁移前,一定要首先对比一下源表和目的表对应字段的类型是否一致,比如varchar类型的字段,假如目的表中设定的字段类型的长度小于源表中的字段类型长度,迁移时,长字符串有被截断的风险。

5、总结md5方式的验证流程:

1、对源表和目的表中的数据每条都先取md5值(长字段可以单独先取md5值)

2、再统一按n条数据进行分组拼接,即 id DIV n,此sql定义为原sql

3、然后分别计算md5值

4、将源表与目的表的结果全部放在软件beyond compare中

5、比对结果值,如果一致,则迁移前后的数据是一致的

6、如果不一致,从上往下比对每条md5值,找到第m条不一致

7、不一致的数据在id:(m-1)*n ~ mn之间,可以直接定位范围

8、如果范围不大,可以一条条的对比

9、如果范围很大,可以将原sql添加where过滤条件,并对n缩小分组范围验证,仅针对范围内的数据进行md5方式的验证

6、线上验证暴露出的问题

迁移时最好连主键一起迁移,否则需要通过 [SELECT @rownum:=@rownum+1 AS rownum] 生成伪主键,具体使用请自行搜索

校验脚本依赖迁移脚本,业务相关的迁移错误无法验证出来

发布成功后,隔段时间需要再验证下增量数据的正确性(主要验证代码的业务逻辑)

7、总结

本文仅对数据迁移后的一致性校验提供一种简单思路,适合场景:增量数据迁移验证、双写时数据验证、数据迁移后的抽样验证、迁移时最好连主键一起迁移的场景。

参考

相关资源:MySQLReplicaIntegrityCheck:MySQL在线复制一致性检查工具-它通过...

mysql数据迁移数据一致性检校验相关推荐

  1. mysql数据迁移数据一致性检教6_如何在数据库迁移中保证数据一致性?

    原标题:如何在数据库迁移中保证数据一致性? 作者 | 王斌 译者 | 平川 策划 | 万佳 在分布式系统中,保持数据一致非常困难,而且很容易出错.在本文中,我们将探索一种在迁移期间保持数据一致性的方法 ...

  2. centos mysql数据迁移_Mysql 5.7.17 离线版安装和数据迁移(centos 7)

    总结下离线版 MySQL 5.7.17 的安装步骤: 1.从官网下载mysql 离线版版安装包 mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz: 2.上传安装包my ...

  3. python做mysql数据迁移_Python中MySQL数据迁移到MongoDB脚本的方法

    MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库 ...

  4. mysql数据迁移 脚本_PHP将数据从Oracle向Mysql数据迁移实例

    为什么要迁移? 首先从运营成本考虑,用Mysql可以节约不少的费用.另一方面,Mysql的稳定性及功能不断地提高与增强,基本上可以满足客户的需求,如支持多 节点部署,数据分区等.还有就是Mysql使用 ...

  5. 在Linux中进行MySQL数据迁移

    由于项目升级或者服务器更换,需要将数据从一个数据库服务转移到另一个数据库服务中.两个数据库所在的服务器的公网IP分别为x.x.x.x和y.y.y.y. 进行MySQL数据迁移之前,需要做一些准备工作, ...

  6. DM 数据迁移工具——DTS(MySQL数据迁移到DM8数据库 Windows环境)

    DM 数据迁移工具--DTS MySQL数据迁移到DM8数据库 Windows环境 DM 数据迁移工具 DM DTS 提供了主流大型数据库迁移到 DM.DM 到 DM.文件迁移到 DM 以及 DM 迁 ...

  7. Python + Mysql数据迁移

    导言:数据迁移对于软件开发过程中是必不可少的,有些公司会有专门的DBA,那数据迁移就归DBA搞定就好了,但大部分的公司不会单独去设立DBA这个职位,面对版本升级,数据库有所大改动的时候,测试人员可以利 ...

  8. Mysql数据迁移到SqlServer

    Mysql数据迁移到SqlServer 我们想要将Mysql的数据库迁移到SqlServer中,怎么办呢? 首先安装mysql-connector-odbc 官网下载地址:https://dev.my ...

  9. MySQL数据迁移报错1067 - Invalid default value for ‘xxx‘

    本文使用Navicat解决MySQL数据迁移时候的报错1067 - Invalid default value for 'xxx'. 现象描述: 源数据库版本:5.6.36 目标数据库版本:5.7.2 ...

最新文章

  1. CCIE-MPLS基础篇-实验手册
  2. 推荐一款超牛逼的Web SSH 客户端工具
  3. 注意ajax的同步和异步请求
  4. (Python)from collections import Counter统计包
  5. AJAX的表单请求POST请求方式
  6. 延迟开学不停学|网易云信在线教育解决方案为“空中课堂”保驾护航
  7. spark写mysql优化简书_spark——通过jdbc连接数据库中遇到的问题
  8. 【渝粤题库】国家开放大学2021春2238个案工作题目
  9. maatkit使用总结
  10. Thread1:EXC_BAD_ACCESS 错误
  11. mysql中什么是空集合_mysql 中使用笛卡尔积 避免其中一方为空集时结果就是空集的方法...
  12. Flink + Hudi 在 Linkflow 构建实时数据湖的生产实践
  13. 【硬件】串口422的DB9接法
  14. 【历史上的今天】8 月 21 日:谷歌创始人诞生;百度 360 搜索大战
  15. 【读书】卡勒德·胡赛尼《群山回唱》 摘录
  16. Windows电脑微信多开方法
  17. Win32 API 列表5 (格式有点乱)
  18. xhprof安装使用
  19. Oracle SQL 批量修改资料库邮箱后缀名称
  20. 多旋翼无人机组合导航系统-多源信息融合算法附Matlab代码

热门文章

  1. URI是什么,在Android中有什么作用?
  2. 利用POI生成带表头的Excel
  3. 【艾米莉娅】Sicily:1001. Alphacode 代码分享
  4. 星星表情符号的html代码,表情符号emojiUTF-8编码、Unicode、HTML显示
  5. el-select 多选设置默认值后无法操作问题处理
  6. java处理奇偶校验位_串口起始位、数据位、奇偶校验位、停止位、波特率与时间等问题的解读...
  7. 一文搞懂嵌入式数据库sqlite,从命令到C操作,收藏即可
  8. 函数式编程(Lambda表达式、Optional、Stream流)
  9. 高防CDN的知识了解
  10. 2020年html5竞赛作品,盘点2020年惊艳的HTML5网页效果样式