• 技术文章 >数据库 >mysql教程

    MySQL数据库线上修改表结构的方法

    WBOYWBOY2022-09-05 19:35:51转载393

    php入门到就业线上直播课:进入学习

    推荐学习:mysql视频教程

    一、MDL元数据锁

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

    1、什么是MDL锁

    MySQL有一个把锁,叫做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点。

    具体步骤:

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

    改进:

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

    推荐学习:mysql视频教程

    以上就是MySQL数据库线上修改表结构的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:脚本之家,如有侵犯,请联系admin@php.cn删除
    专题推荐:mysql
    上一篇:总结分享MySQL中的用户创建与权限管理 下一篇:实例详解MySQL索引最左匹配原则
    VIP课程(WEB全栈开发)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• mysql和myisam有什么区别• 归纳整理之MySQL基于GTID主从搭建• mysql存储引擎之间的区别是什么• mysql中的find_in_set字符串查找函数解析• mysql怎么解决错误2013
    1/1

    PHP中文网