mysql如何排查死锁问题_mysql死锁分析方法

发布时间 - 2025-12-30 00:00:00    点击率:
MySQL死锁排查核心是“定位—分析—验证”三步,需通过SHOW ENGINE INNODB STATUS获取最近死锁详情,启用innodb_print_all_deadlocks记录全量日志,并结合INNODB_TRX、INNODB_LOCK_WAITS等视图分析事务与锁等待关系,再结合业务SQL还原访问顺序、索引缺失、长事务及批量操作等成因。

MySQL死锁排查核心是“定位—分析—验证”三步,关键在于快速获取死锁现场信息,并结合事务行为与锁机制判断冲突根源。不需要重启服务,也不必依赖外部工具,原生命令就能完成大部分诊断。

查看最近一次死锁详情

执行 SHOW ENGINE INNODB STATUS\G,重点查找输出中以 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 开头的区块。这部分包含:

  • 两个冲突事务的 ID、线程号(thread id)、执行 SQL 语句
  • 每个事务持有的锁(HOLDS THE LOCK(S))和等待的锁(WAITING FOR THIS LOCK TO BE GRANTED)
  • 锁对应的表、索引名、页号、行锁范围(如 rec but not gap 表示记录锁)
  • 被自动回滚的是哪个事务(InnoDB 总是回滚代价更小的那个)

开启全量死锁日志记录

仅靠 SHOW ENGINE INNODB STATUS 只能看最后一次死锁,线上高频场景需长期留痕:

  • 检查当前配置:SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';
  • 若值为 OFF,立即启用:SET GLOBAL innodb_print_all_deadlocks = ON;
  • 日志会写入 MySQL 错误日志文件(路径由 log_error 参数指定,常见如 /var/lib/mysql/error.log/usr/local/mysql/data/mysqld.local.err
  • 每次死锁都会追加完整上下文,便于回溯时间线和复现频率

实时观察活跃事务与锁等待关系

当死锁频繁发生或想提前发现隐患时,主动扫描当前锁状态:

  • 查正在运行的事务:SELECT * FROM information_schema.INNODB_TRX;(关注 trx_state、trx_started、trx_query)
  • 查当前持有锁的信息:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;(MySQL 8.0.18+ 已弃用,建议用 performance_schema.data_locks 替代)
  • 查锁等待链:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;(可关联 trx 和 locks 表定位谁等谁)
  • 辅助判断是否锁表:SHOW OPEN TABLES WHERE In_use > 0;

结合业务 SQL 分析死锁成因

光有日志不够,要还原执行逻辑。典型模式包括:

  • 访问顺序不一致:事务 A 先更新 id=1 再更新 id=2;事务 B 反过来,极易形成循环等待
  • 缺失索引导致锁升级:WHERE 条件字段无索引,InnoDB 可能对整张表加意向锁,甚至扫描大量行触发间隙锁冲突
  • 长事务拖慢锁释放:一个事务开启后长时间不提交,其他事务在相同资源上等待,累积风险
  • 批量操作未分页:UPDATE 大范围数据时未加 LIMIT,锁住过多记录,增加交叉概率


# mysql  # 工具  # ai  # 有锁  # sql  # for  # select  # Error  # 循环  # 线程  # Thread  # var  # this  # 死锁  # 三步  # 并结合  # 的是  # 就能  # 不需要  # 长时间  # 这部  # 线上  # 分页 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 北京的网站制作公司有哪些,哪个视频网站最好?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Windows Hello人脸识别突然无法使用  如何有效防御Web建站篡改攻击?  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  C++时间戳转换成日期时间的步骤和示例代码  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel如何实现用户密码重置功能?(完整流程代码)  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  公司网站制作价格怎么算,公司办个官网需要多少钱?  网站制作报价单模板图片,小松挖机官方网站报价?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  html5的keygen标签为什么废弃_替代方案说明【解答】  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  详解MySQL数据库的安装与密码配置  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel如何使用Service Container和依赖注入?(代码示例)  如何用wdcp快速搭建高效网站?  如何在自有机房高效搭建专业网站?  如何快速登录WAP自助建站平台?  重庆市网站制作公司,重庆招聘网站哪个好?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  js实现获取鼠标当前的位置  Laravel如何升级到最新版本?(升级指南和步骤)  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  简历在线制作网站免费版,如何创建个人简历?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何解决hover在ie6中的兼容性问题  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  php 三元运算符实例详细介绍  Android仿QQ列表左滑删除操作  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  nginx修改上传文件大小限制的方法  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel怎么清理缓存_Laravel optimize clear命令详解