mysql如何排查锁等待问题_mysql锁等待排查方法

来源:这里教程网 时间:2026-02-28 20:22:53 作者:

MySQL锁等待问题通常会导致查询变慢、连接堆积甚至服务不可用。排查这类问题需要从当前的锁状态、事务信息和正在执行的SQL入手,快速定位阻塞源头。以下是常用的排查方法。

查看正在运行的线程和锁等待情况

使用 SHOW PROCESSLIST 查看当前所有连接的执行状态:

SHOW FULL PROCESSLIST;

重点关注 State 为 "Sending data"、"Locked" 或长时间处于同一状态的线程,以及对应的 SQL 语句。

更深入的信息可以通过 information_schema.INNODB_TRX 查看当前正在运行的事务:

SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started;

这个表能显示每个事务的开始时间、事务状态、持有的锁、正在执行的SQL等。长时间运行的事务很可能是造成锁等待的源头。

定位锁等待和阻塞关系

通过以下查询可以找出哪些事务被阻塞,以及是谁在阻塞它们:

SELECT 
    r.trx_id AS waiting_trx_id,
    r.trx_mysql_thread_id AS waiting_thread,
    r.trx_query AS waiting_query,
    b.trx_id AS blocking_trx_id,
    b.trx_mysql_thread_id AS blocking_thread,
    b.trx_query AS 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;

结果会列出“谁在等”和“被谁挡着”,是排查锁冲突的核心依据。

查看锁的具体信息(可选)

如果需要进一步分析锁类型和行级锁详情,可查询:

SELECT * FROM information_schema.INNODB_LOCKS;

注意:该表在某些MySQL版本中已被废弃,建议优先依赖 INNODB_LOCK_WAITSINNODB_TRX

常见处理建议

找到阻塞源后,若其事务长时间未提交,可联系负责人确认是否可优化或终止。 使用 KILL [thread_id] 终止占用连接的线程(谨慎操作): KILL 1234;检查相关SQL是否缺少索引,导致锁范围扩大(如全表扫描引发大量行锁)。 优化长事务,尽量缩短事务执行时间,避免在事务中做耗时操作。 合理设计索引,减少锁冲突概率。

基本上就这些。关键在于及时发现阻塞链,结合事务和SQL分析原因,再针对性处理。不复杂但容易忽略的是日常监控和索引维护。

相关推荐