MySQL数据库线上如何修改表结构

一、MDL元数据锁

修改结构之前,先来看下可能存在的问题。

1、什么是MDL锁

MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用。

  • 当对表做增删改查的时候,加的是MDL读锁

  • 当对表结构做变更修改的时候,加的是MDL写锁

读与读之间不互斥,读与写,写与写之间互斥,因此

  • 当有一个线程对表执行增删盖茶的时候,会阻塞掉别的线程对表结构修改的请求

  • 当有一个线程对表结构修改的时候,会阻塞掉别的线程对表增删改查的请求

2、MDL锁的问题

并且MDL一旦上锁之后,只有当前请求的事务提交才会释放,如果是一个长事务,或者是线上数据量很大,修改表结构默认上了MDL写锁,会很耗时一直阻塞掉后边其他请求。

想象一种场景,A(select),B(alter), C(select),D(select)…..分别为按照顺序对MySQL同一张表的请求,这些请求会形成一个队列。
当A(select)获取表的MDL读锁之后,就会阻塞掉B(alter),因为B要加的是MDL写锁,B被阻塞掉之后,就会导致后边等待队列中的其他请求都被阻塞掉,最终造成Mysql的可用连接耗尽,请求超时等问题。

二、如何线上修改MySQL表结构

鉴于以上MDL锁,得知对表做alter修改结构很会阻塞掉其他的正常请求,所以修改操作要放在非业务高峰期来做,一般是放到凌晨2-4点。

具体步骤:

  • 对表加读写锁,使得此时表只读、

  • 复制原表的物理结构

  • 修改新表的物理结构,包括增加新字段或者修改其他表结构

  • 把表结构导入新表,数据同步完成,锁住中间表,删除原表

  • 将新表rename为原表名

  • 释放锁

以上方案的问题是,数据量很大的时候,数据都导入需要时间,这个过程中,服务是不可访问的。

改进:

MySQL数据库线上如何修改表结构

新建一张表 A_new,其比原表多了几个字段,通过数据订阅的方式订阅原表A,把线上的表A中的数据同步到这个新建的表A_new中,这个过程会一直持续,并且这个过程中表A是可以增删改查的,总有一个时刻,这两张表的数据是完全同步的,数据上是没有任何差异的,这个时候把原表表名A给修改掉,把新表A_new修改为原表A,这个操作是一个短暂操作,可以瞬间完成,不会有很大影响。
优缺点:

  • 好处是同步的过程不会影响原有的业务正常。

  • 缺点是过程中需要额外一倍的存储空间去存储这个新表,当rename完成之后,可以把老表删掉。

“MySQL数据库线上如何修改表结构”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

文章标题:MySQL数据库线上如何修改表结构,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24074

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月8日 下午10:59
下一篇 2022年9月10日 下午11:37

相关推荐

  • coreldraw如何抠图

    coreldraw抠图的方法 1、打开软件,点击上方导入,选择图片。 2、右键单击图片,选择锁定对象。 3、点击左边的手绘工具。 4、选择钢笔工具,勾出轮廓。 5、这个时候线条还不是很流畅,所以我们点击左边形状来调整一下。 6、然后右键单击图片,解除锁定。 7、右键单击,选择编辑内容,作调整,这时抠…

    2022年9月26日
    55900
  • windows bios设置u盘启动没有u盘选项如何解决

    解决方法: 1、启动盘制作完成之后,可以在开机的页面中按启动热键F8进入“bios”。 2、在这里可以找到usb高级设置的选项,将其状态改为启动,右侧类型改为“enabled”。 3、设置完成没有找到usb选项的话可以切换至boot,点击图中所指进入设置。 4、在这里你可以看到光标的位置,启动优选的…

    2022年9月22日
    94400
  • jquery怎么获取屏幕宽高

    具体方法如下: 1.获取当前窗口可视区域宽度 $(window).width(); 2.获取当前窗口可视区域高度 $(window).height(); 3.获取当前窗口文档对象宽度 $(document).width(); 4.获取当前窗口文档的高度 $(document).height(); 相…

    2022年8月29日
    58700
  • cloudfile.db文件有什么作用

    本篇内容主要讲解“cloudfile.db文件有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“cloudfile.db文件有什么作用”吧! “cloudfile.db”是一个存放在数据库中名字为cloudfile的数据文件;db后缀的文件一般是软…

    2022年9月18日
    52500
  • MySQL中超键、主键及候选键的区别是什么

    关于超键和主键及候选键的区别 最近在看MySQL的书时遇到了一个问题: 既然已经有了主键这个概念,主键已经能够满足需求了,那为什么还要有候选键这种东西?候选键的作用是什么呢?给了它一个候选键的定义但是它真的并没有什么乱用。 抱着刨根问底拦不住的心态我去网上搜了搜,看了看大神们的解释,看得我还是有些懵…

    2022年9月6日
    96700
  • 如何用rank函数排名不重复

    用rank函数排名不重复的方法: 1、首先打开表格,进入你的表格。 2、然后在单元格中输入公式:=RANK(H2,H2:H47,0)可以看到名列前茅行43的排行。 3、然后将书本放在单元格右下角,然后向下拉。 4、最后就可以看到很多的重复排名了,但是没有第二和第三。 5、如果需要不重复就需要在ran…

    2022年8月30日
    4.1K00
  • 如何分析Web渗透信息

    信息收集主要是收集服务器的配置信息和网站的敏感信息,主要包括域名信息、子域名信息、目标网站信息、目标网站真实IP、目录文件、开放端口和服务、中间件信息、脚本语言等等等。结合各路大佬的收集经验,菜鸟总结了8种信息收集的方式,有不足之处,欢迎赐教,欢迎斧正。个人感觉重点是顺手的工具、有IP代理池、日常收…

    2022年9月24日
    89500
  • line是属于哪个国家的聊天软件

    line是“日本”的聊天软件。LINE是日本公司NHN Japan于2011年推出的一款即时通讯软件;LINE对用户吸引力最大的是聊天表情贴图,超过250种的表情贴图让用户在使用Line时多了一个有趣的心情传达工具,其中line官方设计可爱且特色鲜明的馒头人、可妮兔、布朗熊和詹姆士饱受好评,也让四个…

    2022年9月16日
    1.7K00
  • 用于黑客渗透测试的Linux工具有哪些

    用于黑客渗透测试的 Kali Linux 工具 Kali Linux 预装了几种类型的工具。如果你发现有的工具没有安装,只需下载并进行设置即可。这很简单。 1、Nmap Nmap Nmap (即 “ 网络映射器(Network Mapper)”)是 Kali Linux 上很受欢迎的信息收集工具之一…

    2022年9月1日
    93500
  • SQL中的开窗函数是什么

    OVER的定义 OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 OVER的语法 OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] ) PARTITION B…

    2022年9月2日
    1.1K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部