mongdb迁移方案及比对方案
- 概述:数据量有千万级别,需要考虑迁移速度和用时一个一个插入太慢,要批量插入mysql中;
- 取数: mongdb 中的objectId 是有规律生成的,查询方案按1000个一页取出,按id升序, 下一页用上一页的最后一个id作为起始点取1000个
代码类似:where(“_id”).lt(new ObjectId(“xxx”)).limit(1000), 避免mongdb深度分页过慢问题; - 比对:采用一千个一千个比对(Objects.equal),若不同,进行一个一个比对(Field[] baseFields = baseDO.getClass().getDeclaredFields()),字段数组,收集差异集合;
- 插入:将差异集合进行遍历进行批量数据组装,进行批量插入和比对;
数据比对方案:
- 表t_user数据总行数比对:
- excel 做文件大小比较
- 抽样比对,导出excel 或sql 查询出数据,进行明文比对;
- 逐个每一行比对:查询id,和所有值拼接成一个value 利用mysql 的md5函数,查询出md5值,导出excel 进行一行一行的比对结果,查看差异;
生成md5 sql
SELECT id, MD5(CONCAT(
IFNULL(id,''),
IFNULL(user_id,''),
IFNULL(status,''),
IFNULL(type,''),
IFNULL(headimgurl,''),
IFNULL(unionid,''),
IFNULL(openid,''),
IFNULL(user,''),
IFNULL(country,''),
IFNULL(sex,''),
IFNULL(province,''),
IFNULL(nickname,''),
IFNULL(email,''),
IFNULL(city,''),
IFNULL(n_s_person_name_components_v_o,''),
IFNULL(created_time,''),
IFNULL(created_by,''),
IFNULL(updated_time,''),
IFNULL(updated_by,''),
IFNULL(version,'') )) AS md5_value FROM t_third_user_info
将结果导入到excel中,将md5值两列选中,设置高亮重复项,选中md5列进行筛选,进行颜色筛选,若列中只有一种颜色表示,整列没有差差异,若还有其他颜色表示比对有差异;并进行首行和尾行进行校对,查看首行和尾行结果是否一致;
首行截图尾行截图
比对结果筛选列
详细比对结果文件如下
表t_user 比对结果如下,(左边两列为bk、右边两列为zb)
比对结果excel
https://space.dingtalk.com/s/gwHPAAAAAlkTVMoCzgdCYwAD2gAgMDliNTRhZDJmZDcxNDY3N2E1MWM3ZDI1ZmQ0ZmU1MmI 密码: BWFt
表t_third_user_info 比对结果文件链接:
https://space.dingtalk.com/s/gwHPAAAAAlkVPXYCzgdCYwAD2gAgZjcyOGZmZjk1ZmNlNDA5ZDkxOWFiZmRjNjEyOTlkMzc 密码: 8XSa
表t_id_card_info比对结果文件链接:
https://space.dingtalk.com/s/gwHPAAAAAlkVsqICzgdCYwAD2gAgNTcyNzk1M2I0ZGFjNDdkOTllODU0NjFkNDQ3NmFlMzc 密码: H2bT
- 结论:两种迁移方案结果一致,除了t_third_user_info 表中nickName 字段炳坤采用base64加密入库,经过解密比对之后结果也一致;