【原创】关于表结构更改的大量数据的迁移方案

news/2024/5/8 0:52:39/文章来源:https://blog.csdn.net/DCTANT/article/details/128075930

前言

由于公司要求做产品之间的对接,需要统一表结构和字段名,但是有些表有上亿条数据,如果直接修改表字段名和加字段每一条SQL都要执行大量时间,大概时间为加一个字段1.5小时/1亿条数据,这耗时实在太长了,而且有些表需要涉及6~8个字段更新,这么耗时显然是不行的。因此需要别的解决方案。

总体解决方案

第一步:先创建新表,新表包含了目前最新的表结构。

第二步:使用insert select方式从目前的表查询数据,然后insert到新表中,一切操作都在MYSQL内部执行,且insert完的数据就是修改完表结构的数据, 也就是说insert完一遍后表结构更改也就完成了。

第三步:将目前的表的表名改成别的,将新表改成原来的表名即可,修改表名是非常快的。

遇到的问题

1、insert select这个思路是对的,就是select太坑了,我去傻乎乎的直接去select没加limit,导致一下子查询了上亿条数据,导致服务器内存直接100%,MYSQL因为内存不够直接crash了!这下出大事了!赶紧让现场人员重启MYSQL,还好只是内存溢出导致的crash,数据本身没有受到影响。

大家千万别我犯一样的错啊!!

2、有些新增字段没有数据怎么办

问题解决方案

问题一:

使用MyBatis,先select count(0),统计出所有数据的量,然后通过for循环的方式去分页select,这样就能保证内存不溢出了。

问题二:

这个就很简单了,能够用mysql直接算出来的就用mysql直接算出来就行了,比如缺时间,那就用NOW()补充就完事了,有些新增列有默认值的就不管了,或者insert一个默认值进去,以后用到了再更新都行。

上代码

由于公司的代码必须严格保密,这里就是用最最最常用的学生表来举个栗子:

假设从表my_student(旧表)迁移数据到dct_student(新表),my_student表的结构为:

dct_student表的结构为:

 my_student表数据为:

 使用SQL:

insert into dct_student (
stu_id,
stu_name,
gender,
state,
birthday,
register_time,
father_name,
mother_name,
del,
create_time,
update_time)select 
id,
name,
gender,
1,
birthday,
register_time,
NULL,
NULL,
del,
create_time,
NOW()
from my_student limit 0,500000;

 即可完成迁移。

注意!limit必须要加防止因为数据库内数据量过大,导致服务器内存不够,结果导致MYSQL崩溃。因此limit内的值不能过大,过大内存可能扛不住,过小则每次迁移的量实在太小,我个人测试下来50W条一次差不多。

那可能就有人要问了,如果数据量超过50W条怎么办,难道还得手动编辑分页不成?

那这就得交给Java程序了,首先先selectCount一下,算出一共多少条数据,然后按50W条进行分页,然后每页执行这个insert select即可。

大概的Mapper长这样:

@Mapper
public interface DctStudentMapper extends BaseMapper<DctStudentEntity> {@Select("insert into dct_student (\n" +"stu_id,\n" +"stu_name,\n" +"gender,\n" +"state,\n" +"birthday,\n" +"register_time,\n" +"father_name,\n" +"mother_name,\n" +"del,\n" +"create_time,\n" +"update_time)\n" +"\n" +"select \n" +"id,\n" +"name,\n" +"gender,\n" +"1,\n" +"birthday,\n" +"register_time,\n" +"NULL,\n" +"NULL,\n" +"del,\n" +"create_time,\n" +"NOW()\n" +"from my_student limit #{pageStart}, #{pageSize};")void pageInsertSelect(long pageStart,int pageSize);
}

统计完总数后一个for循环就搞定了,这我就不再赘述了,相信大家都会操作。

迁移完成的结果长这样:

时间统计

公司里的项目试过,1亿条数据,修改一个字段耗时大概90分钟,6个字段就要大概7小时。而这个insert select1亿条数据大概1小时多点就能完成,比修改字段快太多。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_227020.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

位 运 算

位运算符 在处理整形数值时&#xff0c;可以直接对组成整形数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位&#xff08;&#xff1f;&#xff1f;&#xff09; &(与)、|(或)、^(异或)、~(非/取反) “>>” 和 “<<” 运算符将二进制位进行…

55 - 经典问题解析四(动态内存分配虚函数继承中的强制类型转换)

---- 整理自狄泰软件唐佐林老师课程 1. 关于动态内存分配 new和malloc的区别是什么&#xff1f; delete和free的区别又是什么&#xff1f; 1.1 问题一&#xff1a;new和malloc的区别 1.1.1 new关键字和malloc函数的区别 new关键字是C的一部分malloc是由C库函数提供的函数ne…

40 行 Python 代码,写一个 CPU

一、引言 CPU 如何工作&#xff1f;是困扰初级用户一个迷雾般的难题。我们可能知道诸如程序计数器、RAM、寄存器的只言片语&#xff0c;但尚未对这些部件的工作原理及整个系统的协同有清晰和总体的认识。 本文使用四十行 Python 代码来实现一个最简单的 CPU。使它可编程&…

视频怎么转换为音频文件?快来掌握这几种方式

大家平时在下载网课资源进行学习的时候&#xff0c;看久了眼睛也会开始疲劳&#xff0c;而且有些视频的画面看起来很枯燥。其实我们可以使用一些软件把视频中的音频分离出来&#xff0c;直接收听音频也可以学到知识&#xff0c;而且我们还可以处理其他的事情&#xff0c;是不是…

android接入微信API相关细节

细节1 想要接入微信&#xff0c;如接入分享微信功能、跳转小程序功能等&#xff1b;首先需要到微信开放平台申请AppId&#xff0c;如何申请在开放平台上的流程很清楚&#xff0c;就不赘述了 但有个细节就是应用包名签名&#xff0c;这个应用包名签名记得是以app有正式签名文件…

sklearn机器学习:决策树案例

系列文章目录 文章目录系列文章目录一、决策树原理1.1 定义1.2 优点1.3 缺点二、分类树2.1 函数语法2.2 案例三、回归树案例3.1 函数语法3.2 案例一、决策树原理 1.1 定义 决策树是一种用来 classification &#xff08;分类&#xff09;和 regression&#xff08;回归&#…

【树莓派不吃灰】Linux篇⑩ 学习例行性工作排程(核心概念)

目录1. 什么是例行性工作排程2. 仅运行一次的工作排程3. 循环运行的例行性工作排程4. 可唤醒停机期间的工作任务5. 重点回顾❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-11-28 ❤️❤️ 本篇更新记录 2022-11-28 ❤️&…

python>>numpy(第二讲)

章节内容 元素操作 常用的方法 广播 数组形状操作 排序数组 目录 元素操作 一些常用的方法 广播 数组形状操作 数组排序 元素操作 生成元素a np.array([1,2,3,4]) b np.ones(4)1 生成一个原来数组的n倍生成一个所有元素均跟2次方有关的数组一个计算矩阵相乘的函数判断两个…

2022王道OS 1.2 操作系统的发展与分类

2022 王道OS 操作系统的发展与分类 文章目录2022 王道OS 操作系统的发展与分类知识总览OS的发展与分类手工操作阶段批处理阶段--单道批处理系统批处理阶段--多道批处理系统分时操作系统实时操作系统其他几种OS知识回顾与重要考点文章目录2022 王道OS 操作系统的发展与分类知识总…

jsp美食管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 美食管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用serlvet dao bean mvc模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8…

QT-MySQL QSqlDatabase: QMYSQL driver not loaded

使用Qt连接mysql数据库&#xff0c;遇到了一个问题&#xff0c;就是QT5.14.1版本在连接MySQL数据库时候&#xff0c;提示驱动加载失败&#xff0c;“QMYSQL driver not loaded” 编程环境&#xff1a;   Qt5.14.1,编译器是MSVC2017_64,是64位的。   mysql-8.0.30-winx64&am…

如何在 docker 容器使用 nginx 实现反向代理统一站点入口

在微服务架构下&#xff0c;我们会部署很多微服务来实现我们的系统。每个微服务会有不同的端口。而用户在访问我们的站点时希望通过统一的端口来访问所有的服务&#xff0c;因为在很多情况下用户只能通过 80 或者 443 端口访问外界服务。 这个时候我们就可以使用反向代理来实现…

Kubernetes集群coredns缓存容器bind: address already in use错误导致集群服务无法互通解决

coredns缓存nodelocal dns cache :53: bind: address already in use错误处理起因分析问题处理问题重启Node local dns起因 事情起因是Kubernetes集群内的服务无法互相访问了 分析问题 因为Kubernetes集群内的服务都是通过service、pod的名称作为域名到coredns解析Cluster I…

[附源码]计算机毕业设计springboot贷款申请审核管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【简单、高效、性能好】SetFit:无需Prompts的高效小样本学习

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 1. 概要 使用预训练语言模型的小样本学习&#xff08;处理只有少量标签或没有标签的数据&#xff09;已成为比较普遍的…

Zlibrary已死,找了一个替代品,找了一个替代品免费的电子书下载平台...

大家好&#xff0c;我是鸟哥。一个半路出家的程序员。 提到Zlibrary&#xff0c;想必大家都不陌生吧。全球最大的数字图书馆&#xff0c;截止被封前共收录了591万本书&#xff0c;7751万篇文章&#xff0c;并且还在不断的增加中&#xff0c;关键是可以免费下载。 反正我是很熟悉…

智能计量系统配套设备有哪些

智能计量系统配套设备 地磅区域安装配套设备包含&#xff1a;微波定位仪、视频监控、道闸、LED显示屏、车号识别、语音对讲、音响设备、红绿灯、刷卡机箱、雷达、补光灯。 硬件设备 1、微波定位仪&#xff1a;通过微波定位仪设备&#xff0c;可以判断车辆是否完全上磅。 2、…

C++11(一)

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、列表初始化initializer_list二、声明1.auto2.decltype3.nullptr三、C11 STL中的变化1.array2.forward_list3.STL其他变化四、C关键字新功…

【三维重建补充知识-0】视差、深度概念及其转换

一、基本概念 把手指放在眼前&#xff0c;分别闭上左、右眼&#xff0c;我们会发现手指与后边物体的相对位置是不同的&#xff0c;也即两眼所识别的两幅图像之间存在视觉差异&#xff0c;我们通过“视差”这一概念来表示这种差别。 该过程也可以通过两个处于同一平面的相机来模…

C++ 之 移动构造函数

1、左值和右值 C( 包括 C) 中所有的表达式和变量要么是左值&#xff0c;要么是右值。 通俗的左值的定义就是非临时对象&#xff0c;那些可以在多条语句中使用的对象&#xff0c;表达式结束后依然存在的持久化对象&#xff0c;所有的具名变量或者对象都是左值。右值是指临时的…