通过监控mysql事务可及时发现长时间运行事务、锁等待和死锁问题。1. 使用information_schema.innodb_trx查看活跃事务,重点关注trx_started较早的记录;2. 查询innodb_lock_waits结合innodb_trx定位阻塞源头并kill阻塞线程;3. 执行SHOW ENGINE INNODB STATUS获取事务锁等待及死锁详情;4. 启用Performance Schema追踪事务细粒度行为,用于趋势分析;5. 建立告警机制,监控活跃事务数、事务执行时长和锁等待异常,结合prometheus等工具实现可视化。

监控 MySQL 事务是保障数据库稳定运行和排查性能问题的重要手段。通过有效的事务监控,可以及时发现长时间未提交的事务、锁等待、死锁等问题,避免对业务造成影响。
1. 使用 information_schema.innodb_trx 查看当前运行事务
MySQL 提供了 information_schema.innodb_trx 表,用于查看当前正在执行的 InnoDB 事务信息。
- trx_id:事务唯一标识符
- trx_state:事务状态(如 RUNNING、LOCK WAIT)
- trx_started:事务开始时间
- trx_mysql_thread_id:对应的线程 ID
- trx_query:当前正在执行的 SQL 语句
执行以下语句可实时查看活跃事务:
select * FROM information_schema.innodb_trxG
重点关注 trx_started 时间较早的记录,可能为长时间未提交事务,容易引发锁争用或主从延迟。
2. 监控事务锁等待与阻塞关系
事务间的锁冲突常导致性能下降。可通过以下方式分析阻塞情况:
查看锁等待信息:
SELECT * FROM information_schema.innodb_lock_waits;
该表展示被阻塞的事务及其等待的锁资源。结合 innodb_trx 可定位阻塞源头:
- 通过 blocking_trx_id 找到持有锁的事务
- 关联 innodb_trx 获取阻塞方的线程 ID 和 SQL
快速定位并 kill 长时间阻塞的会话:
KILL [thread_id];
3. 启用 InnoDB 状态输出辅助诊断
执行 SHOW ENGINE INNODB STATUSG 可获取详细的 InnoDB 运行状态,其中包含:
- TRANSACTIONS 段:列出当前所有事务及其锁信息
- LOCK WAIT 标记:明确显示哪些事务处于等待状态
- 最近死锁详情(DEADLOCKS)
该命令输出信息密集,适合在问题发生时手动检查,也可结合脚本定期采集关键段落。
4. 利用 Performance Schema 做精细化监控
Performance Schema 提供更细粒度的事务行为追踪能力。
启用事务事件采集:
UPDATE performance_schema.setup_consumers SET ENABLED = ‘YES’ WHERE NAME LIKE ‘events_transactions%’;
查询当前会话事务记录:
SELECT thread_id, event_name, state, timer_wait, sql_text FROM performance_schema.events_transactions_current;
可用于统计事务执行时长、回滚次数等指标,适合集成到监控系统中做趋势分析。
5. 设置监控告警策略
建议建立自动化监控机制,关注以下指标:
- 活跃事务数超过阈值
- 单个事务运行时间超过设定值(如 60 秒)
- 锁等待数量或等待时间异常升高
可通过定时脚本或 Prometheus + grafana + MySQL Exporter 实现可视化监控与告警。
基本上就这些。合理利用系统表和性能视图,配合告警机制,能有效掌控 MySQL 事务运行状态,提前发现问题。