一淘模板给人人带来了对于于mysql的相干知识,MySQL有一个把锁,叫做MDL元数据锁,当对于表修改的时刻,会主动给表加之这把锁,也便是不需要自身显式应用,下面介绍一下MySQL数据库线上修改表构造的方法,希望对于人人有帮助。
在修改表构造以前,先来看下能够存在的问题。
一、甚么是MDL锁
MySQL有一个把锁,叫做MDL元数据锁,当对于表修改的时刻,会主动给表加之这把锁,也便是不需要自身显式应用。
当对于表做增点窜查的时刻,加的是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,这个操纵是一个长久操纵,能够瞬间实现,不会有很年夜影响。
PS:优缺点好处是同步的进程不会影响原有的营业失常。缺点是进程中需要分外一倍的存储空间去存储这个新表,当rename实现以后,能够把老表删失落。
本文链接:https://addon.ciliseo.com/mysql-shu-ju-ku-zai-xian-xiu-gai-biao-jie-gou-de-fang-fa.html
网友评论