查INNODB_TRX表是最直接的方式:它提供全量、快照式活跃事务信息,可精准定位拖住purge的最早未提交事务,配合PROCESSLIST和Performance Schema能完整追踪事务来源、状态及执行语句。

查 INNODB_TRX 表是最直接的方式
MySQL 8.0 不提供“查看 Undo Log 段内部事务”的专用视图,但 INNODB_TRX 是唯一能实时反映当前活跃事务及其对 Undo 影响的系统表。它不显示 Undo 段编号或 slot 分配细节,但能精准定位拖住 purge 的元凶——即最早启动却未提交的事务。
执行以下语句即可快速识别风险事务:
SELECT trx_id, trx_state, trx_started,
TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) AS duration_sec,
trx_mysql_thread_id, trx_query, trx_rows_modified
FROM information_schema.INNODB_TRX
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 600;
-
trx_state = 'RUNNING'且trx_query IS NULL:空闲连接未 commit,最常见、最危险 -
trx_rows_modified > 10000且duration_sec > 300:大修改量长事务,必须干预 - 注意
trx_mysql_thread_id,它是后续KILL或关联PROCESSLIST的关键字段
结合 PROCESSLIST 确认线程来源和实际行为
INNODB_TRX 只告诉你“有事务在跑”,但不告诉你“谁在跑、在哪跑、跑什么”。必须用 trx_mysql_thread_id 去查 information_schema.PROCESSLIST,否则你可能误杀后台监控线程或健康检查连接。
例如查 ID 为 1234 的线程:
SELECT ID, USER, HOST, COMMAND, TIME, INFO FROM information_schema.PROCESSLIST WHERE ID = 1234;
-
COMMAND = 'Sleep'+INFO IS NULL:典型空闲事务,应用端忘记 commit/rollback -
COMMAND = 'Query'+INFO LIKE '%UPDATE%':正在执行大更新,需确认是否合理 -
USER和HOST能帮你快速定位到具体服务或中间件实例
别依赖 SHOW ENGINE INNODB STATUS 的 TRANSACTIONS 部分
这个命令输出虽包含事务摘要,但它只展示最近几条活跃事务,且刷新不及时;更重要的是,它不保证包含“最老事务”——而真正卡住 Undo 清理的,永远是那个最早开始却没结束的事务。
对比来看:
-
INNODB_TRX是全量、快照式、可过滤的权威来源 -
SHOW ENGINE INNODB STATUS\G中的TRANSACTIONS段仅适合临时诊断,不能用于自动化监控或告警 - 它的输出格式不稳定(尤其在高并发下),
trx_id和thread_id映射关系也不如INNODB_TRX明确
Performance Schema 提供更细粒度的运行时上下文
如果需要知道事务“正在执行哪条 SQL”,INNODB_TRX 的 trx_query 字段常为空(尤其 Sleep 状态)。这时应转向 performance_schema.events_transactions_current 关联 sys.processlist:
SELECT thr.processlist_id AS mysql_thread_id,
CONCAT(p.user,'@',p.host) AS `User`,
p.command, p.time,
p.current_statement AS `latest_statement`
FROM performance_schema.events_transactions_current trx
INNER JOIN performance_schema.threads thr USING (thread_id)
LEFT JOIN sys.processlist p ON p.thd_id = thr.thread_id
WHERE thr.processlist_id IS NOT NULL
AND trx.state = 'ACTIVE'
ORDER BY trx.timer_wait DESC
LIMIT 5;
- 该查询能拿到事务当前正在执行(或最后执行)的完整语句,比
trx_query更可靠 - 注意
sys.processlist是视图,依赖performance_schema开启且配置合理(如events_statements_current启用) - 若
current_statement仍为空,说明事务处于纯等待状态(如锁等待、网络阻塞),需进一步查INNODB_LOCK_WAITS
trx_state = 'RUNNING' 且 trx_query IS NULL 的连接,整个 undo 收缩流程就会卡死。


















