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

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

时间:2022-09-03 12:35:35浏览次数:72  
标签:对表 请求 MDL 数据库 阻塞 修改 线上 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完成之后,可以把老表删掉。

标签:对表,请求,MDL,数据库,阻塞,修改,线上,MySQL,结构
From: https://www.cnblogs.com/welan/p/16652045.html

相关文章

  • Windows10系统MySQL5.7升级到8.0
    转自:https://www.freesion.com/article/8785691339/记录MySQL5.7升级到8.0,卸载安装等解决方案1.停止MySQL服务2.卸载MySQL相关的程序step1:本次是win10系统环境;......
  • 数据库课前小测
     课堂小测(绪论1-数据库系统概述)学号班级姓名已删除结束时间:2022-09-0311:40剩余时间:114514秒【1】 (多选)数据库......
  • 生物数据库开发工具GMOD全家桶
    GMOD(GenericModelOrganismDatabase)是专为生物学家创建的开源项目,生物学家用作存储库和工具的交互应用程序和数据库的集合。连通性是GMOD的关键。生物信息学应用程序和......
  • java mysql截取所需数据
    mysql截取数据:例:截取门铺名称,门铺名称长度不确定{"进店日期":"2022-09-01","电话":"1********25","姓名":"张三","单号":"90817","门铺":"吴滨路店","消费金额":"......
  • java mysql删除表中多余的重复记录(多个字段),只留有id最小的记录
    mysql删除表中多余的重复记录(多个字段),只留有id最小的记录DELETEFROM表1fWHERE(f.字段1,f.字段2)IN(SELECT字段1,字段2FROM表1GROUPBY字段1,字段2HAVING......
  • MySQL教程 - 事务(Transaction)
    更新记录转载请注明出处。2022年9月3日发布。2022年9月3日从笔记迁移到博客。事务说明事务(transaction)一种机制,用于执行成批的MySQL操作用以保证没有不完整的操......
  • MySQL教程 - 视图(View)
    更新记录转载请注明出处。2022年9月3日发布。2022年9月3日从笔记迁移到博客。说明视图是虚拟的表,是一种存储结构可以对视图进行和表一样的操作,但一般用于查询数......
  • MySQL教程 - 内建函数(Function)
    更新记录转载请注明出处。2022年9月3日发布。2022年9月3日从笔记迁移到博客。内建函数主要的函数类型数学函数字符串函数日期和时间函数条件判断函数系统信......
  • MySQL笔记
    MySQL笔记1、MySQL简介MySQL是由瑞典的MySQLAB公司开发的,目前是Oracle(甲骨文)公司的一个关系型数据库产品(2008年MySQLAB被Sun公司收购、2009年Sun公司又被Or......
  • MySQL笔记
    MySQL笔记1、MySQL简介MySQL是由瑞典的MySQLAB公司开发的,目前是Oracle(甲骨文)公司的一个关系型数据库产品(2008年MySQLAB被Sun公司收购、2009年Sun公司又被Or......