分公司有个OA的产品是10年前的老版本,私有化的数据库MYSQL。现在想将数据库迁移到总公司这边,OA产品的版本也顺带升级成现在最新的版本,新的数据库是TDSQL。数据库迁移完成后,新/旧数据库进行数据比对核验,老板的意思想用python自动化或者shell脚本实现这个数据核验。
10年的数据库的数据量暂时还不能确定,不确定有哪些数据类型。OA产品的话,他们平常接口大多是用socket发送请求或者是MQ发送请求,不是常用的http接口。从新旧数据库比较数据的话,可能数据量很大,怎么写脚本才能具有比较好的灵活性,可以方便调试,公司电脑是不给连外网的(因为保密原因),最好方便先在自己电脑模拟以下场景上面调试好代码,在移植过去减少报错调试吧,本人Python基础也是比较弱的,所以感觉还是有点压力
想请教以下问题:
1.目前行业内针对数据库迁移后的数据核验工作,都有哪些解决方案?
2.具体实施起来,哪种方式比较简单实现?具体的实现过程是怎么样的?如果新旧数据库比对的过程中,老的数据库还在产生数据(也就是老数据库还在线上运行),有什么比较好的解决方式?
3.有没有类似的demo程序,本人第一次做这种,加上时间比较紧,感觉无从下手,
请各位大佬指教,提出宝贵意见或者建议,非常感谢!(因为我们霍格的课程是Python,所以倾向于python吧,用shell的话,短时间比较难上手)
TDSQL是一种兼容MySQL的关系数据库,所以
第一步:
- 保险起见可以先在tdsql数据库初始化表结构,然后验证所有迁移表的表结构,也就是校验schema信息的一致性,这部分完全可以使用代码实现
1.1 可以查询mysql表的schema信息,看看迁移的表总共有多少种数据类型,然后每种数据类型迁移到tdsql应该是什么类型,这部分可以校验相同字段数据类型是否一致,不一致用什么类型来兼容替换?
1.2 校验mysql和tdsql相同表,tdsql建表时字段是否有缺失
1.3 校验mysql和tdsql相同表,tdsql表相同字段varchar类型长度设置是否一致,是否存在截断或置空
1.4 校验mysql和tdsql相同表,索引设置是否一致
1.5 校验mysql和tdsql相同表,主键设置是否一致
第二步:
- 然后确定要迁移的范围,比如总共多少张表,迁移的表数据量从大到小大概是多少
2.1 如果在表初始化验证通过之后,条件支持,可以与人员协同将数据进行双写,即写mysql也写tdsql,互不影响,写tdsql出问题了,可以及时调整,直到兼容发现的数据异常。等平稳了之后,删除tdsql表数据,直接将数据进行批量迁移
2.2 另一种方式是先进行数据量小的表的数据迁移,等稳定后再进行大数据量的迁移
第三步:
- 数据迁移完成后,以一个时间周期为结束点,进行数据相同表的数据总量的对比
3.1 根据表主键分组,对比总行数和分组聚合的数据行数
3.3 以一个时间周期为结束点,表相同字段空值率对比
3.4 抽查部分数据进行人工对比检验,看看数据写入后是否有异常,现在的大数据基本都是几百上千万,甚至上亿的数据,想全量对比全部的数据,全部的字段,不太现实,成本和技术手段,能力等等上来说也是问题
3.5 还有就是数据库从mysql切换到tdsql,总是会有变化的,公司的应用接入tdsql之后,服务代码是否兼容,这部分也是很可能出问题。也需要考虑,方向大概就是这样,多的自己多想下吧
以上的内容都是可以开发脚本进行自动化验证的
好的,非常感谢老师的回答。,目前项目的具体方案还没出来,只是口头上提了这么这个想法,应该最近会有具体方案要求出来。
一、之前网上查了个想法,请老师帮忙看看,大致是这3步:
1、在两个数据库内询出所有符合条件的值
2、将两个值写入两个字典,并以 id (主键或者索引)作为两个字典的key
3、进行对比,循环取字典1的值,并将字典1的key (原数据库中的id)作为字典2的key去取字典2内该key对应的值,再进行对比
但是这种方法针对数据量很大的情况,估计应该很难实现,还要考虑不同的数据库支持的数据类型。据说旧的数据库(mysql)表的结构到新的数据库(tdSQL),表的结构发生了拆分和重组。要求从数据库和功能的层面去验证迁移后的数据,请问一下老师,这个想法怎么实现比较简单一些?您回答的可能考虑的比较全面,针对表结构发生了变化的,之前几个表,现在合并成一个表的,或者之前一个表,现在拆成几个表的情况,这种靠SQL查询的方式去解决的方式怎么去实现比较简单呢?
二、上面说的检查表的主键,索引,字段类型等,这些一般数据库工具导出的时候,然后在导入的时候就可以校验了吧?这些如果用代码实现有没有相关的例子呢,这部分实现起来难度大不大呢?
三、您说的第二步先小批量数据迁移感觉很好:
3.1.“比如总共多少张表,迁移的表数据量从大到小大概是多少 ” 这个是数据库迁移工具上面人工看的,还是怎么样查看的呢?
3.2. 这个先进行数据量小的表的数据迁移后,怎么去核验新旧库的数据呢?像表的相同字段的空值率这些是有专门的工具去检查吗?
3.3. 目前数据库的迁移应该有很多工具能够实现数据迁移吧,一般数据库工程师在数据迁移时都是会使用工具进行导出和导入吧?工具在导出和导入的时候,应该有一些校验的功能吧?
3.4. 如老师说的,抽样会比较现实一些,具体怎么去实现一个小的范围的数据不同表结构的数据校验呢?我感觉就是从一个很小的方面,先实现一个数据校验功能吧,太大的方向能力目前也达不到,老师上面说的那么多方面,就目前我python做的项目也不是很多,基础也一般,shell也不会。哪一个小的方向会比较好实现一些?有没有类似的demo例子可以学习参考一下呢?
3.5.那天测试经理说shell脚本校验会更快,如果懂得shell脚本编写会更好,其实我一直不明白,shell脚本校验是怎么样的原理?怎么会更快呢?后来用Python也是可以的,老师可以帮忙解释一下shell校验的这方面的原理吗?
shell无非也是连上数据库进行对比操作,与用python没啥区别。shell代码写起来繁琐程度比python还复杂,没必要。shell写一些数据迁移操作就可以了,不过你们都有工具进行导入导出了,那就没必要了。
mysql迁移tdsql:相同表的关系相当于是–多对多的关系
First:
在表结构schema验证上就要去做适配,将多转化成一,也就是自己去获取字段,组装成一个表,然后与另一个数据库的相同表做对比
Second:
数据验证上,也很好解决,可以将 “多” 这种情况转化成 “一”,也就是创建虚拟视图,然后通过查询视图的数据进行对比
啥工具迁移能校验这些啊?导出来,再导入到另一个数据库(这里也得先建表吧?)。而且你说的,还做了子表拆分,多表合并等等之类的,依赖工具是行不通的
表结构对比网上还是能找到一些的,不过都太简单,而且很多情况都不兼容,你的根据你需要测试的范围去开发验证的脚本,对代码能力还是有一定要求的