在MySQL中,因为SQL操作导致的行级锁有:DML锁、DDL锁。
其中DML锁是因为SQL执行异常,导致更新事务无法提交,如更新语句中的查询语句无索引,造成全表扫描而阻塞。
而DDL锁则是因为表结构变更时,遇到慢查询,造成等待。
不管是哪种锁,一般在排查时会涉及到3张表。
1、information_schema.innodb_trx:记录innodb引擎的事务信息。
2、information_schema.innodb_locks:记录innodb引擎中锁信息。
3、information_schema.innodb_lock_waits:记录innodb引擎中因为锁而产生等待的事务信息。
但通常,我们会直接查询一个视图innodb_lock_waits,它由前面三张表的部分数据组成,记录innodb引擎中正在等待锁的进程。
select sql_kill_blocking_connection,blocking_pid,waiting_pid from sys.innodb_lock_waits;
查询到被锁住的SQL后,执行KILL命令终止即可。
KILL <ID>;
但这种方式简单粗暴,可能会造成误杀,但在测试环境中很高效,你Get到了吗?
如果有帮助的,记得点赞、关注。在公众号《数舟》中,可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。
我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。