赞
踩
在一家发展中的公司搬砖,正好遇到分库分表,数据迁移的需求比较多,就入坑了。最近有个系统重构,一直做数据重构、迁移、校验等工作,基本能覆盖数据迁移的各个基本点,所以趁机整理一下。
本文主要讲述DB-DB全量迁移的通用解决方案,主要是解决几个问题:
使用 offset
SELECT … LIMIT row_count OFFSET offset
显然不行,查询到千万的时候执行一个 sql 要30s了,越到后面,sql执行速度越慢。[深抠系列]大家都说offset慢,但为什么呢?
结合索引与limit
SELECT * FROM schemaAndTableWHERE{key} >= minIndexORDERBY{key} LIMIT ${row_count}
就是对 key 字段排序,取大于minIndex的row_count 行记录,然后取这row_count行记录的最大值,做下一页查询的minIndex。参考:分页查询的那些坑
只讨论 mysql 的情况,可以直接使用批量insert sql,也可以使用批量 insert …on duplicate key update sql。
insert ,但不支持重试,每次重试都要先清理表,才能执行批量 insert操作,否则就主键冲突或者重复了,而且清理大表时需要花费不少的等待时间。
insert …on duplicate key update, 可以做到在不存在主键或唯一键的情况下,执行insert 操作,否则执行 update 操作,支持多次重试。在生产环境先清空表,再做全量迁移,更为保险。Demo SQL:
INSERT INTO`test`(`value`,`value2`,`value3`) VALUES ('v','g', 9), ('w','g', 5) ON DUPLICATE KEY UPDATE value=VALUES(value), value2=VALUES(value2), value3=VALUES(value3)
注意:在 mysql RR 隔离级别的情况下,表结构中有主键和唯一键的情况下,并发执行insert …on duplicate key update 存在死锁问题,可以设置 session 为 RC 隔离级别,初始化 sql:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
使用类似tddl的分库分表代理工具
前提是公司中有团队专门维护,并且已应用于日常的分库分表需求中,那么在数据迁移的时候使用代理工具会变得非常简单,你只需要关注源数据查询与数据转换,后面的活都可以交给代理工具来办。但是,使用代理工具意味着需要先请求代理服务,代理服务进行 sql 解析,根据规则路由计算分片,最后才去执行。瓶颈往往会发生在 代理服务的sql 解析和规则计算。
自己计算分片与 insert
数据迁移过程中,业务对数据有各种各样的转换需求,譬如:
我使用插件方式加载业务转换逻辑代码,分离数据迁移&校验主流程和业务逻辑转换,框架向业务转换逻辑提供分页数据,业务转换逻辑返回转换后的分页数据,框架执行后续迁移或校验的操作。
简单的,可以把业务转换逻辑代码安置在项目代码中,通过Class.forName()获取逻辑转换类并创建一个实例,这种方式不灵活。
- public EventProcessor getProcessor(String processorName) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
- Class<EventProcessor> processorClass = (Class<EventProcessor>) Class.forName("com.weidian.tech.baymax.processor.impl." + processorName);
- return processorClass.newInstance();
- }
复杂点,可以把业务转换逻辑代码,动态传入,可以以文件路径方式传入,也可以通过字符串方式传入,参考Java运行时动态生成class的方法
注意有坑:当更新部分字段时,表中有
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
字段的需要特别注意,如果业务依赖该字段,需要把原update_time 值设置到 update sql中。
迁移效率主要受查询数据源、数据处理、网络传输、插入目标记录、建立索引等步骤影响,
据生产环境迁移情况,内存占用小于2G,迁移14亿数据花费24小时,平均迁移效率约为40w行/分钟
https://blog.csdn.net/u010183402/article/details/70314705
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。