记录一次大规模数据库迁移(java)

@[toc]
记录一次大规模数据库迁移(java)

为什么要数据迁移

  • 1.系统重构 (代码跟不上现在的用户量)
  • 2.数据库设计不合理,与sql 垃圾,导致数据库qps大大的降低,从而导致数据库挂掉
  • 3.业务不断增长,现有资源不够用,战略的转移

当这些问题出现的时候,我们会选择更好的系统架构 ,与解决方案,但是有个不可避免的问题 (数据迁移)当原有系统存在 几十万,几百万用户数据的时候,我们就要考虑,这些用户数据这样才能完美的在新系统 或者新数据库上应用

真实案例:

  • 数据库建立的不合理,数据格式错乱,sql效率低下,导致索引失效,用户访问量达 C端项目,导致数据库服务器和 应用服务器天天挂,
  • 所以决定系统重构,数据库重新设计
  • 在开发完成,项目上线前一个阶段,就要设计要数据迁移

解决方案

  1. 导入固定的数据

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200802151031610.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTc3ODM4,size_16,color_FFFFFF,t_70)
    
  2. 导入用户数据
    记录一次大规模数据库迁移(java)
  3. 做好之前数据库以及现在测试数据库的备份,以及快照
  4. 少于 5w 以下的数据可以使用 并且 数据格式一样的数据可以使用
  5. into (select * from aa) 大于5w 以上的数据,就不能使用
  6. 大规模数据迁移方式,首先就要考虑多线程 方式,单线程方式可能需要哥好几十个小时

    • 如果跑代码脚本的话 最好考虑 @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}
上一篇:是什么成就了中国最具创新力的公司,帮他们的超脑计划孵出阿尔法蛋?


下一篇:AQS