必须按l进入InnoDB Locks视图查看锁详情,再按t切换到InnoDB Transactions视图关联事务状态,通过lock_trx_id与trx_id匹配定位阻塞源头。

直接用 innotop 启动后看不到事务锁链路,是因为它默认进的是 Dashboard 视图,不解析 SHOW ENGINE INNODB STATUS 里的 TRANSACTIONS 和 LATEST DETECTED DEADLOCK 段落——你得手动切到对应视图才能定位谁在等谁、谁卡住了什么行。
怎么快速进入事务与锁的关联分析视图
启动 innotop 后别停留,默认视图没用。必须按快捷键切换:
- 按
l(小写 L)进入 InnoDB Locks 视图:列出所有当前持有的锁和等待中的锁,关键列包括lock_trx_id(持有锁的事务 ID)、lock_mode(S/X/IS/IX)、lock_type(RECORD/GAP/NEXT-KEY)、lock_table和被锁的lock_index - 再按
t进入 InnoDB Transactions 视图:查出每个事务的trx_state(如LOCK WAIT)、trx_query(正在执行或卡住的 SQL)、trx_wait_started(等待多久了) - 两个视图来回切,把
lock_trx_id和trx_id对上,就能确认阻塞源头——比如某行lock_trx_id = 12345,而事务视图里trx_id = 12345的状态是RUNNING且trx_query是一个未提交的UPDATE,那它就是根因
为什么按 i 看到的 IO 统计不能反映磁盘真实吞吐
innotop 的 i 视图展示的是 InnoDB 存储引擎内部的逻辑 IO,不是 OS 层面的磁盘读写量。它对排查锁竞争间接有用,但容易误判:
-
ibuf_merges持续高于ibuf_size:说明插入缓冲频繁合并,可能拖慢写入——常见于大量非唯一二级索引批量插入,会加剧行锁争用 -
log_writes / log_fsyncs比值异常高(如 > 10:1):日志写入频繁但刷盘滞后,innodb_flush_log_at_trx_commit=2或磁盘延迟高都可能导致事务提交变慢,间接拉长锁持有时间 -
pages_read突增 +buffer_pool_hit_ratio骤降到 85% 以下:缓存失效严重,可能正执行全表扫描或大范围索引查询,这类操作常隐式持有更多间隙锁(Gap Lock),扩大锁范围
连接失败或权限不足时最常报什么错
不是语法错误,而是运行时报错,典型如下:
-
DBI connect failed: Access denied for user 'innotop'@'localhost' (using password: YES):用户缺少PROCESS权限,需执行GRANT PROCESS ON *.* TO 'innotop'@'localhost'; - 报
Can't locate DBD/mysql.pm或类似 Perl 模块缺失:说明没装 MySQL Perl 驱动,Ubuntu/Debian 上跑sudo apt install libdbd-mysql-perl,CentOS/RHEL 上用yum install perl-DBD-MySQL - 连得上但看不到 InnoDB 数据:检查 MySQL 是否启用了
innodb_status_output(5.6+ 默认开),或确认innotop版本是否太老(v1.9.1+ 才完整支持 8.0 协议)
真正难的不是看懂单个锁,而是从 lock_trx_id 和 trx_id 的映射关系里,识别出哪个事务本不该长期持有锁——比如一个只读事务意外加了 FOR UPDATE,或者应用层忘了 COMMIT。这种问题不会直接报错,但会在 trx_state = LOCK WAIT 的列表里持续堆积,直到超时或被杀掉。


















