如何在MySQL中排查由于事务未提交导致的磁盘连接数爆满?

云静吖_9106

云静吖_9106

2026-06-22

470人浏览

原创

最准方法是查information_schema.innodb_trx表,重点关注trx_state(running或lock wait)、trx_started(越早越可疑)和trx_mysql_thread_id;需关联processlist定位来源,并检查autocommit设置与应用代码逻辑。

如何在mysql中排查由于事务未提交导致的磁盘连接数爆满?

查活跃事务和长事务:INFORMATION_SCHEMA.INNODB_TRX

连接数爆满,往往不是连接本身没释放,而是事务卡住导致连接被长期占用。先确认是不是有事务没提交——直接查 INFORMATION_SCHEMA.INNODB_TRX 是最准的入口。

重点关注这几列:TRX_STATE(必须是 RUNNING 或 LOCK WAIT )、TRX_STARTED(时间越早越可疑)、TRX_MYSQL_THREAD_ID(对应 PROCESSLIST 的线程 ID)。

  • 执行 SELECT TRX_ID, TRX_STATE, TRX_STARTED, TRX_MYSQL_THREAD_ID, TRX_QUERY FROM INFORMATION_SCHEMA.INNODB_TRX ORDER BY TRX_STARTED LIMIT 10;
  • 如果 TRX_STATE 是 RUNNING 且 TRX_STARTED 超过几分钟,基本就是未提交事务;TRX_QUERY 为空也不代表安全,可能是已执行完但没 COMMIT 或 ROLLBACK
  • 注意:TRX_STATE = LOCK WAIT 时,说明它在等锁,背后可能有个更早的未提交事务在 hold 锁,得顺藤摸瓜找源头

关联线程状态和连接来源:INFORMATION_SCHEMA.PROCESSLIST

单看事务表不够,得知道这个事务是谁发起的、连的是哪个应用、有没有超时或异常行为。

用 TRX_MYSQL_THREAD_ID 去关联 INFORMATION_SCHEMA.PROCESSLIST,能拿到客户端 IP、用户、命令类型、运行时长、当前 SQL 等关键信息。

MySQL
MySQL

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

下载
  • 执行 SELECT ID, USER, HOST, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID IN (SELECT TRX_MYSQL_THREAD_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_STATE = 'RUNNING' AND TIME_TO_SEC(TIMEDIFF(NOW(), TRX_STARTED)) > 60);
  • COMMAND 是 Sleep 但 TIME 很大?十有八九是应用端开启事务后没处理完就挂了,或者代码里漏了 commit/rollback
  • HOST 字段暴露客户端来源,比如 app-server-03:54321,可快速定位到具体服务实例

检查 autocommit 设置和应用代码逻辑

很多“未提交”根本不是人为失误,而是 autocommit=0 模式下,应用误以为自己在自动提交,实际所有 DML 都在隐式事务里悬着。

  • 查当前会话设置:SELECT @@autocommit; —— 返回 0 就是手动事务模式
  • 查全局默认:SELECT @@global.autocommit; —— 如果是 0,所有新连接默认都进手动事务,风险极高
  • 常见坑:Java 的 DataSource 配置了 defaultAutoCommit=false,又没配 @Transactional 或没 catch 异常 rollback;Python 的 pymysql 默认 autocommit=False,不显式 conn.commit() 就一直挂着
  • 临时缓解可用 KILL,但必须同步排查代码:搜项目里所有 BEGIN、START TRANSACTION、SET autocommit=0,确认每个分支都有对应 COMMIT 或 ROLLBACK

预防性配置和监控建议

靠人工查太被动,得让系统自己“喊疼”。MySQL 本身不提供事务超时自动回滚,但可以通过组合配置降低风险。

  • 设 innodb_lock_wait_timeout(默认 50 秒)—— 它只影响等锁超时,不影响事务空跑;真正管“事务最长存活时间”的是 max_execution_time(仅对 SELECT 生效)或应用层控制
  • 更有效的是启用 wait_timeout 和 interactive_timeout(建议设为 300–600),让空闲连接自动断开;但注意:这只能杀掉 Sleep 状态连接,对正在跑事务的无效
  • 生产必须加监控项:定期查 SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), TRX_STARTED)) > 300;,超过阈值告警
  • 别依赖 SHOW PROCESSLIST 查长时间 Sleep 连接——它看不到事务状态,容易漏掉真正卡住的连接

事务没提交这事,表面是连接数高,根子常在应用代码里少了一行 commit 或异常路径没走 rollback。查的时候别只盯着连接数,重点盯 TRX_STARTED 和 TRX_STATE,再顺 HIST 找到对应应用实例,才能真正止血。

相关文章

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

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

下载

相关标签:

mysql

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4003

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1049

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5861

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2783

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5840

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7781

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1050

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

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

精品课程

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

共1课时 | 178人学习

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

共2课时 | 285人学习