您的位置: 翼速应用 > 业内知识 > 数据库 > 正文

关于MySQL数据库线上修改表结构的方法分享

本文是关于MySQL数据库线上修改表结构的方法分享,MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用,下面介绍一下MySQL数据库线上修改表结构的方法,希望对大家有帮助。


关于MySQL数据库线上修改表结构的方法分享


关于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为原表名


●  释放锁


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


改进:


改进方案


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


优缺点:


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


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


以上就是关于MySQL数据库线上修改表结构的方法分享,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题