记一次垂直分表后的数据迁移工作
我们为什么要垂直分表
因为项目前期设计考虑不到位赶工期等问题,导致最后订单单表字段达到100个,其中还有很多字段的数据类型选择并不合理。在数据量小的时候还没事,随着现在数据量越来越大,该表性能也出现了性能瓶颈。
我们拆分的原则
根据业务与需求我们将原有表拆分为三张新表:拆分原则如下:
one表:经常更新、参与业务流程、频繁查询、作为筛选条件在列表中展示的字段
two表:很少更新、只参与特定业务流程的字段。例如:订单取消相关字段只在订单取消的流程中会使用
three表:赋值后基本不更新,也基本不参与业务流程,只在详情查看时使用,主要是订单地址和里程相关的字段
数据迁移要求
因业务需要我们的服务器不能停服,数据迁移不能影响到用户的正常使用。经考察最后选择使用专业的ETL工具kettle来进行。
数据迁移工具
工具用的是kettle,关于kettle的介绍和基础操作这里就不展开了,可以参考:kettle入门实战
数据迁移过程
因为不能影响用户体验,所以我们迁移采用定时分批迁移。每个10秒迁移150条数据。
kettle“作业”概览
作业参数配置
start-作业定时调度
检查迁移完成判断
当page到达3百万时迁移结束。
迁移完成终止作业
转换-数据迁移
数据库连接配置
我们的数据库是mysql8
连接数据库之前需要去mysql官网下载连接驱动程序,我用的是mysql-connector-j-8.0.33
mysql8以上版本直接在kettle中选择mysql连接类型,需要自定义连接
自定义连接URL用代码中的URL就可以了。
原订单表
SQL里是获取订单数据的条件,page和pageSize是在作业里配置的。
插入one、two、three表
三张表操作都差不多,以one表为例子
id = id: 通过id来判定是否存在数据,存在更新,不存在保存
更新字段:通过右边的获取和更新字段按钮可以编辑映射,两张表名称一样的字段可以进行自动映射。
转换-更新page
每次任务完成后都需要更新page。
通过sql更新page
通过SQL计算出新的page
设置新的page变量
更新page变量到作业