当前位置: 首页 > news >正文

MySQL修改表结构原理

MySQL修改表结构原理

1 原理分析

互联网需求,时刻都在变,需求变动的同时,也需要对数据库表结构进行修改,比如加个字段,新加个索引等等。

mysql在线ddl(加字段、加索引等修改表结构之类的操作)过程如下:

  1. 对表加锁(排他锁)(表此时只读)
    • 在这个过程中会锁表。造成当前操作的表无法写入数据,影响用户使用。由于需要复制原表的数据到中间表,所以表的数据量越大,等待的时候越长,卡死在那里(用户被拒绝执行update和insert操作,表现就是延迟了一直在等待)。
  2. 复制原表物理结构
  3. 修改表的物理结构
  4. 把原表数据导入中间表中,数据同步完后,锁定中间表,并删除原表
    • 平时进行修改表的结构,更改字段,新增字段,更改字段名称一般都是通过ALTER TABLE TABLENAE 语法进行修改的。对于测试库,在线小表或者并发访问不是很大的情况是OK。但是如果是在线大表。那就很麻烦。由于表数据量大,复制表需要比较长的时间,在这个时间段里面,表是被加了锁的(写锁),加写锁时其他用户只能select表不能update、insert表。表数据量越大,耗时越长。
  5. rename中间表为原表
  6. 刷新数据字典,并释放锁、

注意事项:

  1. 如果表很大,该表的时间会很长
  2. 该表会将原表锁住(排他锁),也就是改表期间,该表只提供读的服务(select),不提供写的服务(insert、update、delete)
  3. 如果该表需要对外提供写的服务,那么需要考虑是否存在风险
  4. 如果是MySQL集群,那么改表一般在主库上修改,如果表很大,改表期间,主从复制可能会有较大的延迟

2 解决思路

(1)滚动更新

  1. 如果MySQL是集群部署,则先停掉一部分机器,让服务请求到能提供服务的机器上,MySQL停掉服务之后,再进行改表操作,这样风险最低,但是耗时较长。
  2. 改完表结构之后,最后在发代码到线上

(2)低峰期改表

让MySQL停服这样代价有点高,如果某张表对外只提供select的操作,也就是没有写操作,那么可以在服务低峰期进行改表操作。

Reference

  1. mysql在线修改表结构大数据表的风险与解决办法归纳
  2. MySQL OSC(在线更改表结构)原理

相关文章:

  • 还在手动发早安吗?教你用java实现每日给女友微信发送早安
  • 【圣诞节】飘雪圣诞树
  • Python圣诞树
  • 【C与数据结构】——寒假提高每日练习Day1
  • 拦截器与过滤器
  • Web前端105天-day63-HTML5_CORE
  • Golang后端开发学习之路
  • C++——STL之stack和queue详解
  • 结构体嵌套函数指针
  • 基于Xlinx的时序分析与约束(4)----主时钟约束
  • Arcgis使用教程(十三)ARCGIS地图制图之地图输出参数设置详解
  • QT中Qthread线程彻底销毁的实例与注意事项(防止线程资源内存泄露)
  • PCL点云处理之曲面法线估计(八十二)
  • MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《1》
  • 数据库系统概论第七章(数据库设计)知识点总结(1)—— 概述
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2017 年终总结 —— 在路上
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Git同步原始仓库到Fork仓库中
  • Hexo+码云+git快速搭建免费的静态Blog
  • oschina
  • php ci框架整合银盛支付
  • SpingCloudBus整合RabbitMQ
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 工程优化暨babel升级小记
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 盘点那些不知名却常用的 Git 操作
  • 全栈开发——Linux
  • 人脸识别最新开发经验demo
  • 手机端车牌号码键盘的vue组件
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习使用ExpressJS 4.0中的新Router
  • 走向全栈之MongoDB的使用
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • zabbix3.2监控linux磁盘IO
  • 函数计算新功能-----支持C#函数
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #Java第九次作业--输入输出流和文件操作
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (14)Hive调优——合并小文件
  • (C语言)共用体union的用法举例
  • (javascript)再说document.body.scrollTop的使用问题
  • (pojstep1.1.2)2654(直叙式模拟)
  • (pytorch进阶之路)扩散概率模型
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五)关系数据库标准语言SQL
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .Net 4.0并行库实用性演练
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net 8.0 新的变化