mysql锁等待时间过长怎么办_mysql锁问题排查

发布时间 - 2025-12-31 00:00:00    点击率:
MySQL锁等待时间过长本质是事务阻塞或资源争用,需快速定位“谁在等、谁在占、为什么占”:优先查performance_schema.data_lock_waits(8.0+),结合INNODB_TRX、INNODB_LOCK_WAITS和PROCESSLIST定位阻塞源与被阻塞SQL,再分析长事务、无索引扫描、间隙锁、热点行等根因,辅以KILL、超时设置、索引优化及开发规范治理。

MySQL锁等待时间过长,本质是事务阻塞或资源争用导致的,核心思路是:快速定位谁在等、谁在占、为什么占。

查当前锁等待和阻塞关系

优先执行以下语句,直观看到“谁在等谁”:

  • SELECT * FROM performance_schema.data_lock_waits;(MySQL 8.0+,最直接)
  • SELECT * FROM information_schema.INNODB_TRX; 查活跃事务(trx_state、trx_started、trx_mysql_thread_id)
  • SELECT * FROM information_schema.INNODB_LOCKS;(5.7及以前可用,8.0已移除)
  • SELECT * FROM information_schema.INNODB_LOCK_WAITS;(关联trx和lock,显示blocking_trx_id和blocked_trx_id)

重点看 blocking_trx_id 对应的事务是否长时间未提交、是否执行了大查询、是否处于sleep状态却没释放锁。

看被阻塞事务在做什么

拿到 blocked_trx_id 后,用线程ID查其SQL:

  • SELECT * FROM information_schema.PROCESSLIST WHERE ID = ?;(查看state、info字段)
  • 若 info 为空,可能是空闲连接;若 state 是 Updating / Sending data / Locked,结合执行时间判断是否卡住
  • 对长时间运行的线程,可执行 SHOW ENGINE INNODB STATUS\G,在 TRANSACTIONS 部分找详细锁信息和最近SQL

分析锁的来源和优化方向

常见锁等待原因和对应动作:

  • 长事务未提交:业务代码漏掉 commit/rollback,或事务内混入耗时操作(如HTTP调用、文件读写)。→ 检查应用逻辑,加超时控制,避免在事务里做非DB操作
  • 无索引导致全表扫描加锁:UPDATE/DELETE WHERE 条件列没走索引,会锁整张表或大量无关行。→ 用 EXPLAIN 确认执行计划,补上合适索引
  • 间隙锁(Gap Lock)冲突:RR隔离级别下,范围条件 UPDATE 或唯一键重复插入易触发。→ 考虑是否真需RR,或改用RC(注意幻读风险)
  • 高并发热点行更新:比如库存扣减、计数器累加。→ 改用乐观锁(version字段)、Redis预减、或拆分热点(如分段库存)

临时止血与长期预防

紧急情况下可 kill 掉阻塞源头:

  • KILL [blocking_thread_id];(谨慎操作,确认不是关键业务事务)
  • 设置事务超时:SET innodb_lock_wait_timeout = 10;(默认50秒,按业务容忍度调低)
  • 监控常态化:用 pt-deadlock-logger 定期抓死锁;用 Prometheus + mysqld_exporter 监控 lock_wait_time、innodb_row_lock_waits
  • 开发规范:所有事务明确 BEGIN/COMMIT 边界;禁止在事务中 sleep、调外部接口;DML 必须带 WHERE 且确保走索引


# mysql  # redis  # ssl  # ai  # 热点  # 为什么  # red  # sql  # select  # 接口  # 线程  # delete  # 并发  # http  # prometheus  # 谁在  # 长时间  # 死锁  # 做什么  # 执行时间  # 却没  # 一键  # 补上  # 可执行  # 整张 


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


相关推荐: Laravel如何实现一对一模型关联?(Eloquent示例)  手机网站制作与建设方案,手机网站如何建设?  Laravel如何实现文件上传和存储?(本地与S3配置)  如何快速搭建安全的FTP站点?  Laravel怎么实现验证码(Captcha)功能  三星网站视频制作教程下载,三星w23网页如何全屏?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何在搬瓦工VPS快速搭建网站?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  香港服务器WordPress建站指南:SEO优化与高效部署策略  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  如何在宝塔面板中修改默认建站目录?  实例解析angularjs的filter过滤器  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何在IIS中新建站点并解决端口绑定冲突?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何快速上传建站程序避免常见错误?  javascript中的try catch异常捕获机制用法分析  韩国服务器如何优化跨境访问实现高效连接?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  利用vue写todolist单页应用  如何快速登录WAP自助建站平台?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何快速搭建FTP站点实现文件共享?  如何快速搭建二级域名独立网站?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel如何实现用户注册和登录?(Auth脚手架指南)  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Python并发异常传播_错误处理解析【教程】  如何在腾讯云服务器快速搭建个人网站?  iOS发送验证码倒计时应用  js实现获取鼠标当前的位置  nodejs redis 发布订阅机制封装实现方法及实例代码  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在阿里云购买域名并搭建网站?  Laravel如何升级到最新版本?(升级指南和步骤)  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel如何使用Vite进行前端资源打包?(配置示例)  C++时间戳转换成日期时间的步骤和示例代码  LinuxCD持续部署教程_自动发布与回滚机制  javascript中闭包概念与用法深入理解