记录一次大规模数据库迁移(java)-阿里云开发者社区

开发者社区> 数据库> 正文

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

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

@[toc]
在这里插入图片描述

为什么要数据迁移

  • 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. 导入用户数据
    在这里插入图片描述
  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}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章