0

0

mysql如何排查特定Session持有的锁资源_mysql performance_schema锁追踪

P粉602998670

P粉602998670

发布时间:2026-03-12 12:34:03

|

209人浏览过

|

来源于php中文网

原创

mysql 8.0+需通过performance_schema.data_lock_waits查锁等待,但须先启用相关消费者;其blocking_engine_lock_id和requesting_engine_lock_id明确标识持锁与等锁线程,结合data_locks、threads和events_statements_current可定位sql及行级锁详情。

mysql如何排查特定session持有的锁资源_mysql performance_schema锁追踪

查哪个线程在等锁:看 performance_schema.data_lock_waits

MySQL 8.0+ 的锁等待关系不藏在 INFORMATION_SCHEMA.INNODB_TRX 里了,得靠 performance_schema 的三张表联动。最直接的入口是 data_lock_waits,它明确记录了“谁在等谁的锁”。但注意:这张表默认是关闭的,必须提前开启。

  • performance_schema 必须启用(performance_schema=ON),且 data_locksdata_lock_waits 的消费者也要打开:UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME IN ('events_statements_current', 'data_locks', 'data_lock_waits');
  • 查等待链:用 SELECT * FROM performance_schema.data_lock_waits;,结果里 BLOCKING_ENGINE_LOCK_ID 对应持有锁的线程,REQUESTING_ENGINE_LOCK_ID 是卡住的那个
  • 如果返回空,不代表没锁争用——可能是锁已释放、或消费者没开全、或你查的会话还没走到加锁逻辑(比如事务刚 START,还没 UPDATE)

定位持锁线程的 SQL 和状态:连查 data_locks + threads + events_statements_current

光知道线程 ID 不够,得看到底执行了什么语句、事务处于什么状态。data_locks 能告诉你锁在哪张表、哪个索引、哪一行(通过 OBJECT_SCHEMAINDEX_NAMELOCK_DATA),但它的 THREAD_ID 是内部 ID,得关联 threads 表转成 PROCESSLIST_ID,再和 events_statements_current 拼出当前正在跑的语句。

  • LOCK_DATA 字段值如果是 supremum pseudo-record,说明是间隙锁(Gap Lock),不是真数据行;如果是数字或字符串,大概率是聚簇索引主键值
  • 注意 events_statements_current 只保存当前正在执行的语句,如果事务已提交/回滚或语句执行完了,这里就是空的——得结合 events_transactions_current 看事务起始时间
  • 别直接用 PROCESSLIST_ID 去杀进程,先确认是不是业务关键会话;KILL CONNECTION xxx 会强制中断,可能引发应用重试风暴

为什么 SHOW ENGINE INNODB STATUS 有时看不到锁信息

这个命令输出的 TRANSACTIONS 部分确实会列锁,但它只展示“最近一次”被检测到的死锁或显式锁等待,不是实时快照。而且它不显示锁的具体行记录(LOCK_DATA),只说“lock_mode X locks rec but not gap waiting”,对排查具体哪一行卡住帮助有限。

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载
  • 输出内容受 innodb_status_output_locks 控制(MySQL 5.6.16+),默认 OFF;设为 ON 才会在 SHOW ENGINE INNODB STATUS 中包含 LOCK WAIT 详细段落
  • 即使开了,它也不反映所有活跃锁,只记录 InnoDB 最近监控到的冲突点,适合快速抓典型问题,不适合做全量锁审计
  • 它的线程 ID 是 Trx id(十六进制),和 performance_schema.THREAD_ID 无法直接对应,交叉验证时容易绕晕

避免误判:区分“锁等待”和“锁升级”导致的假性阻塞

有时候你看到一个 UPDATE 卡住,查 data_lock_waits 却没记录,但 data_locks 里有大量锁。这很可能是锁升级(Lock Escalation)——InnoDB 在扫描大量行后,把行锁升级为意向锁或表锁,导致后续 DML 被整体阻塞,但不产生传统意义上的“等待锁”关系。

  • 典型场景:未走索引的 UPDATE 或 DELETE,全表扫描 → 大量行锁 → 触发锁升级条件(如超过 2000 行)→ 持有表级意向排他锁(IX),其他 DML 就会排队,但 data_lock_waits 不记录这种“隐式阻塞”
  • 判断方法:查 data_locks 中同一 THREAD_ID 下的锁数量,如果远超实际修改行数(比如锁了 5000 行,但 SQL 只改 10 行),基本就是扫描引发的锁膨胀
  • 解决不在锁追踪本身,而在优化 SQL:加索引、缩小 WHERE 范围、拆分大事务

锁细节藏得深,LOCK_DATA 的格式、THREAD_ID 的映射、锁升级的静默阻塞——这些地方不手动验证一遍,很容易以为“没锁”或“锁错了”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2152

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1683

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号