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

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

为什么要数据迁移

  • 1.系统重构 (代码跟不上现在的用户量)

  • 2.数据库设计不合理,与sql 垃圾,导致数据库qps大大的降低,从而导致数据库挂掉

  • 3.业务不断增长,现有资源不够用,战略的转移

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

真实案例:

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

解决方案

  1. 导入固定的数据

    在这里插入图片描述

  2. 导入用户数据 在这里插入图片描述

  3. 做好之前数据库以及现在测试数据库的备份,以及快照

  4. 少于 5w 以下的数据可以使用 并且 数据格式一样的数据可以使用 insert into (select * from aa) 大于5w 以上的数据,就不能使用

  5. 大规模数据迁移方式,首先就要考虑多线程 方式,单线程方式可能需要哥好几十个小时 - 如果跑代码脚本的话 最好考虑 @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}
end
  • 作者:yxl(联系作者)
  • 发表时间:2020-08-11 16:08
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论