news 2026/10/19 4:22:01

MySQL 死锁排查实战:从“Killed”状态到“ROLLING BACK”的深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 死锁排查实战:从“Killed”状态到“ROLLING BACK”的深度解析

MySQL 死锁排查实战:从“Killed”状态到“ROLLING BACK”的深度解析

在数据库运维中,死锁是常见的“拦路虎”。本文基于一次真实的线上故障排查,深入剖析了 MySQL 死锁的排查流程,特别是针对Killed状态和ROLLING BACK状态的深度解读,帮助 DBA 和开发者快速定位并解决死锁问题。

一、 死锁与锁等待:别傻傻分不清

在排查问题前,首先要明确两个概念:死锁(Deadlock)和锁等待(Lock Wait)。

  • 死锁(Deadlock):两个或多个事务互相持有对方需要的锁,形成循环等待。MySQL 会自动检测并回滚其中一个事务,错误信息通常包含Deadlock found when trying to get lock。
  • 锁等待(Lock Wait):一个事务尝试获取某个资源的锁时,由于该资源被另一个事务长时间占用,导致等待超过了设定的时间阈值(如innodb_lock_wait_timeout)。最终事务因等待超时而失败,提示Lock wait timeout exceeded; try restarting transaction。
    结论:如果你的错误日志是后者,说明当前事务只是被“饿死”了,而非陷入了死循环。

二、 实战排查:SHOW FULL PROCESSLIST 与 KILL 命令

当发现数据库响应变慢或出现锁等待超时,第一步通常是查看当前连接状态。

1. 查看进程列表

SHOWFULLPROCESSLIST;

重点关注以下几列:

  • Id:线程的唯一标识符,用于后续的KILL命令。
  • Time:线程处于当前状态的时长(秒)。长时间运行的查询或事务更可能引发锁问题。
  • State:线程的当前状态。例如Locked、Waiting for table metadata lock等状态都直接表明线程可能在等待锁。
  • Info:显示正在执行的 SQL 语句。

2. 终止可疑进程

确认了可疑进程的线程 ID 后,使用KILL命令终止它:

KILL<线程ID>;

执行后,该连接会被终止,其正在执行的事务会被回滚,从而释放它持有的锁。

三、 深度解析:为什么状态是“Killed”但进程还在?

执行KILL命令后,通过SHOW PROCESSLIST查看,有时会发现进程状态显示为Killed,但该进程并未立即消失,甚至可能持续很长时间。
核心原因:MySQL 的KILL命令并非“立即枪毙”,而是设置了一个终止标志。线程在执行过程中会定期检查这个标志,如果发现被标记为终止,则会中止当前操作并开始清理工作(如事务回滚、释放临时表等)。
为什么“杀不死”?

  1. 大事务回滚(最常见):如果你终止了一个正在执行的大事务(如删除/更新百万行数据),MySQL 为了保证数据一致性,必须先将已修改的数据回滚。这个过程可能非常耗时,期间进程状态会显示为Killed,直到回滚完成才会真正消失。
  2. 锁等待阻塞:如果该进程正在等待某个锁(如行锁、元数据锁),它必须等到锁被释放后,才能执行“检查终止标志”的逻辑。在等待期间,它无法响应KILL命令,所以会一直挂着。
  3. 系统资源瓶颈:如果服务器 I/O 性能极差或 CPU 负载过高,回滚操作或清理临时文件的速度会非常慢,导致进程长时间处于Killed状态。

四、 进阶排查:INNODB_TRX 与 INNODB_LOCK_WAITS

当简单的KILL无法解决问题时,需要深入 InnoDB 内部查看事务和锁的状态。

1. 查看当前事务状态

SELECT*FROMinformation_schema.INNODB_TRX;

重点关注trx_state字段:

  • RUNNING:事务正在运行。
  • LOCK WAIT:事务正在等待锁。
  • ROLLING BACK:事务正在回滚。
  • COMMITTING:事务正在提交。

2. 查看锁等待关系

SELECT*FROMinformation_schema.INNODB_LOCK_WAITS;

这张表记录了锁的等待关系,可以明确是哪个事务(blocking_trx_id)在阻塞哪个事务(requesting_trx_id)。

五、 核心场景:INNODB_TRX 显示 ROLLING BACK,但 INNODB_LOCK_WAITS 为空

这是本文要解决的核心问题。当你在INNODB_TRX中看到事务状态为ROLLING BACK,但INNODB_LOCK_WAITS表为空时,意味着什么?
结论:事务正在回滚过程中,并未在等待其他锁,而是正在执行回滚操作本身。
INNODB_LOCK_WAITS表主要记录的是锁等待关系。当它为空时,表明当前数据库中没有事务因为拿不到锁而处于等待状态。你看到ROLLING BACK状态的事务,是一个正在进行回滚操作的事务。它可能正在撤销已经完成的数据修改,这个过程中它持有必要的锁以确保数据一致性,但并未被阻塞。

处理建议

  1. 耐心等待:如果回滚的事务之前修改了大量数据(例如,更新或删除了数十万行),回滚过程会非常耗时。这是最稳妥的做法,强行中断可能导致数据文件损坏。

  2. 监控进度:定期执行以下查询,观察事务的trx_rows_modified等字段值的变化。如果数值在持续减小,说明回滚正在缓慢进行。

    SELECTtrx_id,trx_state,trx_started,trx_rows_locked,trx_rows_modifiedFROMinformation_schema.INNODB_TRXWHEREtrx_state='ROLLING BACK';
  3. 检查系统负载:如果服务器磁盘 I/O 性能差或 CPU 负载过高,会显著降低回滚速度。优化系统资源可以加速回滚过程。

六、 总结与预防

  • 应急处理:对于ROLLING BACK状态的事务,不要再次执行KILL或重启数据库。这通常是大事务回滚的正常现象,强行中断风险极高。
  • 根本预防:
    • 避免大事务:将大批量数据操作拆分成多个较小批次进行。
    • 优化索引:确保数据操作语句能高效执行,减少单次事务的锁定时间和范围。
    • 统一加锁顺序:让不同的事务按照相同的顺序访问表和行,这是预防死锁最有效的方法。
      通过以上步骤,你可以清晰地定位 MySQL 死锁或锁等待问题的根源,并采取正确的应对措施。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 19:48:51

网安公司,亏麻了!

又到一年一度的“网安比惨季”。每年这个时候&#xff0c;上市公司一发业绩预告&#xff0c;朋友圈就像开了弹幕&#xff1a;“亏得真稳定”、“一年更比一年凉”、“这行业还有救吗&#xff1f;”我把2025年的成绩单摊开一看&#xff0c;好家伙——这哪是财报&#xff0c;分明…

作者头像 李华
网站建设 2026/10/17 21:54:02

晋升名单其实早就在答辩前定好了?答辩只是走个过场

刚看到个贴子&#xff0c;楼主说自己为了晋升&#xff0c;熬夜做了20页PPT&#xff0c;把一年成绩吹到天上去。结果评委只问了一句&#xff1a;你在项目里的不可替代性是什么&#xff1f;更扎心的是&#xff0c;后来才知道晋升名单早就定好了&#xff0c;答辩纯属走流程。我的看…

作者头像 李华
网站建设 2026/10/17 14:36:44

iPhone17大热,网传有国产手机品牌的旗舰手机最高跌超三成

由于苹果的iPhone17卖得实在太好&#xff0c;一些国产手机品牌总是喜欢对标iPhone17&#xff0c;眼见着在整体销量方面落后太多&#xff0c;于是他们不断缩短时间周期&#xff0c;例如从季度缩短到月份&#xff0c;甚至会时不时拿周销量来证明自己并未必iPhone17差太多&#xf…

作者头像 李华
网站建设 2026/10/12 22:47:33

CANN hixl 在单机多卡场景下的 PCIe 带宽优化策略

相关链接&#xff1a; CANN 组织主页&#xff1a;https://atomgit.com/cannhixl 仓库地址&#xff1a;https://atomgit.com/cann/hixl 前言 在单机多设备&#xff08;Multi-Device&#xff09;AI 训练与推理系统中&#xff0c;设备间的数据交换常通过 PCIe 总线完成。然而&am…

作者头像 李华
网站建设 2026/10/11 12:19:08

SemaphoreCountDownlatchCyclicBarrier源码分析

一、CountDownLatch&#xff1a;闭锁机制 1.1 基本原理与核心逻辑 CountDownLatch 让一个或多个线程等待其他线程执行完成后再执行。在创建 CountDownLatch 对象时&#xff0c;必须指定线程数 count&#xff0c;每当一个线程执行完成调用 countDown()方法&#xff0c;线程数 co…

作者头像 李华
网站建设 2026/10/17 14:17:33

5分钟部署Whisper语音识别:零基础搭建多语言转录服务

5分钟部署Whisper语音识别&#xff1a;零基础搭建多语言转录服务 引言&#xff1a;语音识别原来这么简单 你有没有遇到过这样的场景&#xff1f;会议录音需要整理成文字&#xff0c;外语视频需要翻译字幕&#xff0c;或者想给音频内容添加文字说明。传统方法要么手动打字费时…

作者头像 李华