扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“MySQL数据库线上如何修改表结构”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于做网站、成都网站建设、苏尼特左网络推广、微信小程序开发、苏尼特左网络营销、苏尼特左企业策划、苏尼特左品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供苏尼特左建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
在修改表结构之前,先来看下可能存在的问题。
MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用。
当对表做增删改查的时候,加的是MDL读锁
当对表结构做变更修改的时候,加的是MDL写锁
读与读之间不互斥,读与写,写与写之间互斥,因此
当有一个线程对表执行增删盖茶的时候,会阻塞掉别的线程对表结构修改的请求
当有一个线程对表结构修改的时候,会阻塞掉别的线程对表增删改查的请求
并且MDL一旦上锁之后,只有当前请求的事务提交才会释放,如果是一个长事务,或者是线上数据量很大,修改表结构默认上了MDL写锁,会很耗时一直阻塞掉后边其他请求。
想象一种场景,A(select),B(alter), C(select),D(select).....分别为按照顺序对MySQL同一张表的请求,这些请求会形成一个队列。
当A(select)获取表的MDL读锁之后,就会阻塞掉B(alter),因为B要加的是MDL写锁,B被阻塞掉之后,就会导致后边等待队列中的其他请求都被阻塞掉,最终造成Mysql的可用连接耗尽,请求超时等问题。
鉴于以上MDL锁,得知对表做alter修改结构很会阻塞掉其他的正常请求,所以修改操作要放在非业务高峰期来做,一般是放到凌晨2-4点。
具体步骤:
对表加读写锁,使得此时表只读、
复制原表的物理结构
修改新表的物理结构,包括增加新字段或者修改其他表结构
把表结构导入新表,数据同步完成,锁住中间表,删除原表
将新表rename为原表名
释放锁
以上方案的问题是,数据量很大的时候,数据都导入需要时间,这个过程中,服务是不可访问的。
改进:
新建一张表 A_new,其比原表多了几个字段,通过数据订阅的方式订阅原表A,把线上的表A中的数据同步到这个新建的表A_new中,这个过程会一直持续,并且这个过程中表A是可以增删改查的,总有一个时刻,这两张表的数据是完全同步的,数据上是没有任何差异的,这个时候把原表表名A给修改掉,把新表A_new修改为原表A,这个操作是一个短暂操作,可以瞬间完成,不会有很大影响。
优缺点:
好处是同步的过程不会影响原有的业务正常。
缺点是过程中需要额外一倍的存储空间去存储这个新表,当rename完成之后,可以把老表删掉。
“MySQL数据库线上如何修改表结构”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流