如何查看mysql的锁信息

哎呀,让我告诉你一件事。
去年,MySQL 突然在我们的服务器上停止工作。
我检查了很长时间但不明白为什么。
后来发现某个备份程序持有全局锁并减慢了所有工作。

你提到的方法我都试过了。

方法一:查看Metadata_Locks 我在MySQL 5 .7 环境中使用了这个。
记得去年1 0月份的时候,生产环境突然卡住了,无法读取日志。
我检查了 Performance_schema.metadata_locks 并发现会话不断锁定表。
只要让你的 DBA 杀死它就可以了。
前提是Performance_schema中的元数据锁定探针必须提前打开。
不然就没用了。

方法2 :查看events_statements_history 在 MySQL 5 .6 中尝试过这个。
有一些备份程序可以保持全局锁锁定。
我检查了events_statements_history,发现都是备份SQL。
不过这个视图默认是不启用的,但是在5 .7 中默认是启用的。
但有一个问题。
如果 SQL 历史记录清除得太快,锁定信息可能会在被发现之前就被清除。
去年5 月份就遇到过,赶紧改了配置,保留了3 0天的记录。

方法三:gdb工具 这个是最厉害的,所以去年1 2 月份我才敢用。
有一些备份程序可以使用 root 用户直接冻结整个站点。
我使用gdb捕获了mysql进程,发现该线程持有全局锁。
我编写了脚本,运行了它,并立即弄清楚了我的备份工作是什么。
但是,请记住,如果使用 gdb 附加 mysql 进程,MySQL 将挂起并且读取请求也将停止。
我记得我的商业 DBA 脸色苍白,因为我太害怕了。

方法4 :显示进程列表 这是最简单、最粗暴的一种。
去年六月,我们有一个 root 用户用于备份。
查看哪些会话花费的时间最长。
不过,由于我的公司也是使用root登录,所以我用脚本过滤掉了空状态和空信息,发现肯定是一个备份程序。
只要杀掉它,生意就会恢复正常。
提示:首先以 root 身份登录以查看进程列表,然后杀死它们以查看 waitglobalreadlock 是否仍然存在。

方法5 :再试一次! 老实说,这是最糟糕的部分。
该备份计划已于去年 9 月停止。
我尝试了 Metadata_locks 但没有任何反应。
Gdb 读取进程列表太慢。
最终DBA咬牙重启了服务。
结果就是业务数据丢失,客户也该死。
后来我意识到我在重新启动之前没有热备份。

总结:Metadata_locks最准确,gdb最暴力,processlist最简单,restart最烦人。
根据需要使用。
不要像去年那样经历所有的陷阱。

mysql查看锁表语句

不幸的是,让我告诉您有关锁定 MySQL 表的信息。
然后我遇到了问题。

那是前年的事了。
我当时在生产环境中工作,突然数据库操作变得像蜗牛一样慢。
一查,哦,原来是手表被锁了。
那时我只有两个招数。

第一步是使用 SHOW PROCESSLIST。
这个团队太经典了我打字、查看,发现有一个线程的状态显示“等待表元数据锁”。
当我查看信息时,它说了什么? ALTER TABLE 命令 ADD COLUMN status_new VARCHAR(1 0);哦,我明白了,肯定是在执行那个DDL语句时被阻塞了。
此时该线程的时间已经显示了几分钟,需要进行处理。

第二步是直接筛选。
输入 SHOW PROCESSLIST WHERE Info LIKE '%lock%' OR State LIKE '%lock%';该命令将立即过滤掉所有与阻塞相关的线程,您可以快速找到它们。

后来我使用了UNLOCK TABLES。
但在打印之前,我必须确保当前事务已提交或回滚,否则无法工作。
我发出 COMMIT;,然后输入 UNLOCK TABLES;,表被解锁。

还有一次情况更糟。
有一条线被卡住了,没有任何方法可以解决。
我再次使用SHOW PROCESSLIST找到线程ID,它是1 2 3 4 5 然后我只是按KILL 1 2 3 4 5 ;,突然线程消失了,表被解锁了。
然而,这个技巧需要超级许可,没有它就无法工作。

顺便说一下,还有一个工具叫innotop。
我试过一次。
实时监控锁的状态非常方便。
但你必须自己安装这个东西;它不包含在系统中。

总结一下,锁表查找主要是基于SHOW PROCESSLIST和Information_schema.INNODB_TRX这两个表。
解锁主要是使用UNLOCK TABLES和KILL命令来完成。
但是,使用 KILL 时要非常小心。
如果你犯了一个错误,整个交易可能会被毁掉。

关于权限,必须有PROCESS权限才能查表锁,并且您必须具有超级权限才能终止线程。
你必须记住这一点。

另外,MySQL 8 .0之后,部分视图被移至Performance_schema,所以查询时需要小心。
我差点因为不注意而跑错路。

总之,说到锁定MySQL表,需要多练习,多练习。
我只是在摆弄时发现了这一点。
既然你知道了这一点,你就可以处理它了,对吗?