如何在MySQL中监控长事务运行时间并触发告警

云强小哥_2343

云强小哥_2343

2026-09-08

654人浏览

原创

查 information_schema.innodb_trx 是唯一靠谱的实时手段,该表提供 trx_started、trx_state、trx_query 等字段,可精准定位长事务源头,避免依赖 show processlist 或慢查询日志的误判。

如何在mysql中监控长事务运行时间并触发告警

查 INFORMATION_SCHEMA.INNODB_TRX 是唯一靠谱的实时手段

MySQL 不会把“长事务”单独列成一个状态,它只在内存里维护每个活跃事务的元信息。想确认哪个事务真正在拖后腿,必须查 INFORMATION_SCHEMA.INNODB_TRX 表——它包含 TRX_STARTED(启动时间)、TRX_STATE(当前状态)、TRX_QUERY(正在执行的语句)等真实字段。

常见错误现象:SHOW PROCESSLIST 里看到一堆 State: Locked 或 Waiting for table metadata lock,但找不到源头;或者慢查询日志里没记录任何慢 SQL,应用却卡顿。这时候 PROCESSLIST 只显示等待者,而 INNODB_TRX 才暴露持有锁的事务本身。

  • 线上阈值建议设为 10–30 秒,不是等它跑满 60 秒才干预
  • TRX_QUERY 为空 ≠ 安全——可能是事务只执行了 BEGIN,后续还没发 SQL,但锁已因之前操作持有了
  • 别用 SELECT * FROM INNODB_TRX 直接扫全表,加 WHERE 条件过滤后再查,避免大表扫描影响性能

用 TIMESTAMPDIFF 算运行时长,别信 TIME_TO_SEC(TIMEDIFF()) 在某些版本的兼容性

计算事务运行秒数,最稳妥写法是:TIMESTAMPDIFF(SECOND, TRX_STARTED, NOW())。这个函数在 MySQL 5.6+ 全版本稳定,返回整型,不依赖会话时区设置。

而 TIME_TO_SEC(TIMEDIFF(NOW(), TRX_STARTED)) 在部分 5.7 旧补丁版本中会出现精度丢失或 NULL 返回,尤其当事务启动时间跨天时容易出错。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 监控 SQL 示例(查超 20 秒的事务):SELECT TRX_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY, TIMESTAMPDIFF(SECOND, TRX_STARTED, NOW()) AS duration_sec FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TIMESTAMPDIFF(SECOND, TRX_STARTED, NOW()) > 20 ORDER BY duration_sec DESC;
  • 如果要兼容极老版本(如 5.5),可用 UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(TRX_STARTED) 替代,但注意它对微秒部分截断
  • 别在 WHERE 中直接用函数包裹 TRX_STARTED 做范围比较——MySQL 无法走索引(该字段无索引),但这是系统表,影响有限

告警不能只靠脚本轮询,得防误杀和状态延迟

用 shell 脚本 + mysql -e 每 30 秒查一次 INNODB_TRX 并发邮件,看似简单,实则埋雷:事务可能在你 SELECT 和 KILL 之间已提交;权限失效会导致脚本静默失败;更危险的是,KILL CONNECTION 会干掉整个连接,而连接池里一个连接常复用多个逻辑请求。

  • 优先用 KILL TRANSACTION <trx_id></trx_id>(MySQL 5.7+ 支持),它只终止事务,保留连接供池复用
  • 若必须用脚本自动 kill,请先查 TRX_MYSQL_THREAD_ID,再执行 KILL <thread_id></thread_id>,比拼接 TRX_ID 更可靠(因 TRX_ID 在 8.0.29+ 后改为内部事务 ID,不一定对应可 kill 对象)
  • pt-kill 是生产首选:它内置重试、连接复用、安全过滤,命令如 pt-kill --busy-time 20 --kill --match-state Running --victims all --ignore-user system,上线前务必加 --print 预览
  • 告警触发后别只发消息,同步写入审计表(如 long_trx_log),字段含 trx_id、thread_id、duration_sec、query_sample、kill_time,方便回溯

配置层要堵住空闲连接挂长事务的漏洞

很多“长事务”根本不是业务逻辑慢,而是连接空闲着,事务却没提交——比如 ORM 开启了事务,中间调了个 HTTP 接口耗时 5 秒,回来忘了 commit。这时 wait_timeout 就是最后一道防线。

  • 设 wait_timeout = 300(5 分钟),作用于非交互式连接(即应用连接池发起的连接)
  • 设 interactive_timeout = 600(10 分钟),留给 DBA 手动操作空间
  • 这两个参数对“已执行 SQL 但未提交”的事务无效,只管“完全没发命令”的空闲连接;修改后旧连接仍按原值计时,新连接才生效
  • 配合应用层:所有事务必须显式控制边界,禁止跨 HTTP 请求、跨函数隐式延续;ORM 的 @Transactional 或 with transaction.atomic(): 必须配超时兜底(如 Spring 的 timeout 属性)

真正难防的不是运行 100 秒的事务,而是那个只改一行、但卡在外部调用里不动的 3 秒事务——它不会出现在慢查询日志,INNODB_TRX 里也只显示 TRX_QUERY 为空,但 undo 日志已在悄悄膨胀。监控得盯住 TRX_STARTED 和当前时间差,而不是等它报错才行动。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2093

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1279

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

755

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2812

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4708

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1079

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4971

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4422

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5774

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 180人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 287人学习