堵塞MySQL的会话是如何被快速杀掉的

本文介绍了在MySQL中如何通过information_schema和sys库的表来定位和解决锁问题。详细解析了如何通过锁信息表、事务表和进程信息表找出锁的来源和被阻塞的事务,特别强调了MySQL 8.0中表的变化和使用方法。最终,文章提供了解决复杂锁环境问题的步骤,并提示读者获取更详细的MySQL笔记资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

查找Innodb里面的锁,可以通过information_schema库下相关事务表和锁相关信息表来查到,在8.0的环境下,通过sys库下的锁相关表查询。一键获取Mysql笔记

information_schema.innodb_trx
存储了当前正在执行的事务信息

information_schema.innodb_locks
记录了锁信息如果一个事务想要获取到某个锁但未获取到,则记录该锁信息如果一个事务获取到了某个锁,但是这个锁阻塞了别的事务,则记录该锁信息但是无法通过该表查询到谁被阻塞,谁持有未释放。

information_schema.innodb_lock_waits
表明每个阻塞的事务是因为获取不到哪个事务持有的锁而被阻塞

information_schema.processlist
连接信息表

performance_schema.events_statements_current
记录当前执行的sql

performance_schema.events_statements_history
记录执行过的sql

sys.innodb_lock_waits 表

locked_table : 哪张表出现的等待

waiting_trx_id: 等待的事务(与上个视图trx_id 对应)

waiting_pid : 等待的连接号(与上个视图trx_mysql_thread_id或processlist_id)

blocking_trx_id : 锁源的事务ID

blocking_pid : 锁源的连接号

单一的锁快速查找方法

通过information_schema库下的锁信息表查询

整个流程如下:

(1)首先查询是否有锁,根据锁查到被锁的trx_id

(2)根据被锁的trx_id可以查到锁源的trx_id

(3)根据锁源的trx_id查到trx_mysql_thread_id(即processlist_id)

(4)再根据trx_mysql_thread_id查到thread_id

(5)最后,用thread_id查找到锁源的sql

但是这种方法在mysql8.0已经被移除,介绍另外一张表

通过sys库下的锁信息表查询

注意: MySQL8.0删除了information_schema.innodb_locks,添加了performance_schema.data_locks,可以通过performance_schema.data_locks查看事务的锁情况,和MySQL5.7及之前不同,performance_schema.data_locks不但可以看到阻塞该事务的锁,还可以看到该事务所持有的锁,也就是说即使事务并未被阻塞,依然可以看到事务所持有的锁(不过,正如文中最后一段所说,performance_schema.data_locks并不总是能看到全部的锁)。表名的变化其实还反映了8.0的performance_schema.data_locks更为通用了,即使你使用InnoDB之外的存储引擎,你依然可以从performance_schema.data_locks看到事务的锁情况。

因此第一种方法并不适用于8.0

通过sys库查询流程如下和第一种方式的原理其实是一样的

锁源的事务trx_id -->pnformaction_schema.processlist表的连接id–>performance_schema.threads表的thread_id–>performance_schema.events_statements_current 或performance_schema.events_statements_history查看sql

需要注意的是如下的三个id其实是同一个id,我这里把他们同称为连接ID,因为是由CONNECTION_ID()函数返回的

information_schema.innodb_trx(trx_mysql_thread_id)

information_schema.processlist(id)

sys
### 解决MySQL数据库中的表锁定问题 当遇到MySQL数据库中的表锁定问题时,可以通过多种方法来诊断并解决问题。首先了解锁机制对于有效处理此类问题是至关重要的。 #### 1. 使用`SHOW OPEN TABLES`查看被锁定的表 为了识别哪些表处于锁定状态,可以执行以下命令: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` 这将显示所有正在使用的表及其锁定情况[^1]。 #### 2. 查找造成死锁的具体会话 有时多个事务可能会相互等待对方释放资源而导致死锁现象发生。此时可借助于`INFORMATION_SCHEMA.INNODB_LOCKS`视图以及相关联的`INFORMATION_SCHEMA.INNODB_TRX`视图来进行分析: ```sql SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_pid, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_pid, b.trx_query blocking_query FROM INFORMATION_SCHEMA.innodb_lock_waits w JOIN INFORMATION_SCHEMA.innodb_trx b ON b.trx_id = w.blocking_trx_id JOIN INFORMATION_SCHEMA.innodb_trx r ON r.trx_id = w.requesting_trx_id; ``` 上述查询语句能够帮助定位到具体的阻塞源[^2]。 #### 3. 终止长时间运行或者有问题的进程 一旦确认了引起问题的过程,则可以直接终止它们以解除锁定状况。使用`KILL QUERY`或`KILL CONNECTION`命令结束指定ID对应的活动: ```sql -- 杀掉某个特定连接上的查询 KILL QUERY thread_id; -- 或者完全断开该客户端连接 KILL CONNECTION connection_id; ``` 请注意,在采取此行动之前应谨慎评估影响范围,并确保不会丢失重要数据[^3]。 #### 4. 调整配置参数优化并发控制 长期来看,调整一些与锁定行为有关的服务器变量可能有助于预防未来再次出现类似的问题。例如设置更短的事物超时时间(`innodb_lock_wait_timeout`)、启用自动提交模式等措施都可以改善系统的响应速度和稳定性。 #### 5. 定期维护计划 定期对数据库进行健康检查,包括但不限于清理不必要的索引、重组碎片化的表格空间等工作也有助于维持良好的性能表现,从而间接减少了因高负载引发的潜在锁争用风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值