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

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

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

为什么要数据迁移

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

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

真实案例:

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

解决方案

  1. 导入固定的数据

    ![在这里插入图片描述](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)
    
  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}
相关文章
|
5天前
|
Java 关系型数据库 MySQL
MySql数据库级别MD5加密java MD5加密解密工具包
MySql数据库级别MD5加密java MD5加密解密工具包
|
6天前
|
SQL Java 数据库连接
Java一分钟之-JDBC:Java数据库连接基础
【5月更文挑战第14天】JDBC是Java与关系数据库交互的API,常见问题包括资源管理、SQL注入和性能优化。易错点涉及驱动加载、空指针异常和事务管理。避免这些问题的方法有使用try-with-resources自动关闭资源、预编译PreparedStatement以防止SQL注入,以及正确管理事务。示例代码展示了基本的JDBC连接和查询。在实际开发中,推荐使用ORM框架如Hibernate或JPA来简化数据库操作。
15 1
|
6天前
|
SQL Java 关系型数据库
零基础轻松入门Java数据库连接(JDBC)
零基础轻松入门Java数据库连接(JDBC)
14 0
|
6天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
6天前
|
SQL Java 关系型数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
|
6天前
|
Oracle 关系型数据库 Java
java操作多数据源将oracle数据同步达梦数据库
java操作多数据源将oracle数据同步达梦数据库
|
6天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
13 0
|
6天前
|
SQL Java 数据库连接
Java数据库编程实践:连接与操作数据库
Java数据库编程实践:连接与操作数据库
12 0
|
6天前
|
SQL Java 数据库连接
17:数据库连接池与Servlet整合-Java Web
17:数据库连接池与Servlet整合-Java Web
25 3
|
6天前
|
Java 关系型数据库 测试技术
Java代码一键生成数据库文档(案例详解)
Screw是一个自动化数据库文档生成工具,能根据数据库表结构快速生成简洁、多格式(HTML、Word、Markdown)的文档,支持MySQL、MariaDB等多数据库。它使用Freemarker模板,允许用户自定义样式。依赖包括HikariCP数据库连接池和对应JDBC驱动。通过在Java代码或Maven插件中配置,可方便生成文档。示例代码展示了如何在测试用例中使用Screw。文档效果依赖于数据库中的表和字段注释。