@[toc]
为什么要数据迁移
- 1.系统重构 (代码跟不上现在的用户量)
- 2.数据库设计不合理,与sql 垃圾,导致数据库qps大大的降低,从而导致数据库挂掉
- 3.业务不断增长,现有资源不够用,战略的转移
当这些问题出现的时候,我们会选择更好的系统架构 ,与解决方案,但是有个不可避免的问题 (数据迁移)当原有系统存在 几十万,几百万用户数据的时候,我们就要考虑,这些用户数据这样才能完美的在新系统 或者新数据库上应用
真实案例:
- 数据库建立的不合理,数据格式错乱,sql效率低下,导致索引失效,用户访问量达 C端项目,导致数据库服务器和 应用服务器天天挂,
- 所以决定系统重构,数据库重新设计
- 在开发完成,项目上线前一个阶段,就要设计要数据迁移
解决方案
-
导入固定的数据
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200802151031610.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTc3ODM4,size_16,color_FFFFFF,t_70)
- 导入用户数据
- 做好之前数据库以及现在测试数据库的备份,以及快照
- 少于 5w 以下的数据可以使用 并且 数据格式一样的数据可以使用
- into (select * from aa) 大于5w 以上的数据,就不能使用
-
大规模数据迁移方式,首先就要考虑多线程 方式,单线程方式可能需要哥好几十个小时
- 如果跑代码脚本的话 最好考虑 @asyc 注解式多线程操作
- 如果需要做关系,切记一定要加索引,当迁移百万级别的数据的时候,就会发现索引的威力是多么强大
案例
@PostMapping("move")
public ResultBody moveUnderOrderrelationship() {
for (int i = 1; i <50 ; i++) {
int pageNum = (i-1) * 10000;
undersService.moveUnderOrderrelationship(pageNum,10000);
}
return ResultBody.success();
}
@Async
public void moveUnderOrderrelationship(int pageNum, int pageSize) {
……
}
select * from *** limit #{pageNum},#{pageSize}