MySQL锁表原因,解决方法以及修改表结构的正确姿势

首先修改表的结构都有可能会导致锁表,之前用过DB2,DB
2修改表结构必锁表,但是解锁也很简单有专门的关键词regon来解锁表,但MySQL不一样。

原因:
MySQL(5.6以后,支持在线DDL,支持操作与查询的并发)其实你更改表结构不一定会锁表,但是还是会有概率锁表的。

首先了解一下MySQL的两种表锁,一种是lock table的表锁,一种是元数据锁 metadata Lock。

第一种表级别的锁,一个线程执行lock table操作,比如说你执行读操作,别的线程想写操作就不行了,但是他也要读呢?没问题啊,反正你不影响我就好了。同理写操作,你这时候读肯定就不行了。什么时候可以正常的读写,那就是执行unlock table以后就可以了。

第二种元数据锁,metedata Lock也叫MDL。这个其实是我们使用中最常见的一个锁表。这个MDL是一个隐式锁,当你访问一个表它会自动加一个MDL,来保证你数据的读写的正确。举个例子,人家在访问,这时候一个字段正在修改甚至删除或者增加,肯定会影响对写的结果,这时候就把这表锁上。

同样我们在修改字段时,有的时候会被锁表很大的概率是MDL导致的,而同样的操作可能有的时候就不会锁表,那是因为你在执行修改的时候,没有人遍历你所修改的表。而实际情况中,你的程序可能在跑,在访问这个表,别人不知情的情况下也回去访问读写这个表,结果就可能导致表被锁,尽管你只做了一个操作,或者访问,或者修改。

处理:
步骤1 查看锁的表
show OPEN TABLES where In_use > 0;
显示的结果就是被锁的表,有的表会关联别的表会导致多个表被锁
(其实你可以越过这个步骤,因为第二步你能知道那些操作锁了。)

步骤2 查找进程
show processlist;

步骤3 找到锁表的进程
就是那个锁表的进程,记住这个进程号,就是第一个id字段。

步骤4 kill掉这个进程
kill xxxxx
(类似于我们Linux那种杀死进程那种。)

步骤5 回头看一看还有没有被锁的表
show OPEN TABLES where In_use > 0;
发现没有异常的锁表进程就OK。

MySQL修改表结构
MySQL支持online DDL(线上直接修改,当然这个是5.6以后的版本包括5.6,现在9012年了,5.5以前远古版本应该用的比较少了吧。)

所以你是navicate还是MySQL客户端都可支持线上修改,但是问题就是避免其他人,系统或者线程对这张表操作的影响,导致MDL锁表的情况。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值