MySQL 连接数打满排查实战:从连接池到 PROCESSLIST 定位慢请求
线上 MySQL 连接数打满时,业务侧看到的通常是接口超时、偶发 500、连接池等待变长。很多人第一反应是把 max_connections 调大,但这只能暂时缓解,真正要找的是:谁把连接占住了,连接是在排队、慢查询、还是长事务里卡住。
本文用一次订单服务连接数告警做例子,按“看全局指标、看活跃连接、看事务、看应用连接池”的顺序排查。目标不是背命令,而是建立一条遇到问题能照着走的链路。
摘要
本文会完成四个目标:判断连接数是否真的到顶、用 PROCESSLIST 找出连接状态、定位长时间占用连接的事务或查询、给出连接池和限流兜底建议。适合正在维护 MySQL 业务库、管理后台和高并发接口的后端开发者阅读。
适合人群
- 遇到过 “too many connections” 或连接池等待超时的开发者。
- 需要把数据库告警和应用请求链路对应起来的后端同学。
- 想把连接数问题从“调大参数”推进到“定位根因”的团队。
目录
- 先确认连接数压力来自哪里
- 用 PROCESSLIST 看连接状态
- 排查长事务和慢请求占用
- 应用连接池如何兜底
- 上线后的观察项
先确认连接数压力来自哪里
连接数告警出现时,不要只看当前连接数,还要看活跃连接数。大量 Sleep 连接通常指向连接池配置或空闲连接回收问题;大量 Query、Locked、Sending data 则更可能是慢请求或锁等待。
SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL STATUS LIKE 'Threads_running'; SHOW VARIABLES LIKE 'max_connections';
Threads_connected 表示当前已建立连接数量,Threads_running 更接近正在工作的连接数量。如果前者很高、后者不高,优先看连接池和空闲连接;如果两者都高,就要继续看正在跑的 SQL 和等待状态。

用 PROCESSLIST 看连接状态
下一步查看当前连接在做什么。生产环境里建议先筛选非空闲连接,避免被大量空闲连接淹没。
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' ORDER BY TIME DESC LIMIT 20;
重点观察三列:
- COMMAND:连接是在查询、空闲、复制还是其他状态。
- TIME:当前状态持续了多少秒,时间越长越值得看。
- STATE:是否出现等待锁、发送数据、复制到临时表等状态。
如果排在前面的连接都来自同一个接口、同一台应用机器,说明问题很可能在某个入口流量或某段 SQL 上。如果来自多个服务,就要回到连接池配置和数据库总体负载一起看。
排查长事务和慢请求占用
连接数打满不一定是瞬时流量,也可能是长事务长期占着连接。尤其是接口里先开启事务,再调用外部服务、生成文件、发送消息,就会把数据库连接拖住。
SELECT trx_id,
trx_started,
trx_mysql_thread_id,
TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS trx_seconds
FROM information_schema.innodb_trx
ORDER BY trx_started
LIMIT 10;
拿到 trx_mysql_thread_id 后,可以回到 PROCESSLIST 查对应连接。这样就能知道长事务来自哪个账号、哪个主机、当前在什么状态。

把事务边界缩短
事务里只放必须保持一致的数据库读写,不要把远程接口、文件处理、复杂计算放在事务里。事务越短,连接被占用的时间越短,锁等待也更容易下降。
把慢查询拉回索引和条件
如果活跃连接主要卡在同一类查询上,就要继续看执行计划、索引和筛选条件。连接数问题经常只是表象,底层根因是某条 SQL 把连接拖得太久。
应用连接池如何兜底
数据库端要排查,应用端也要设置边界。连接池不是越大越好,如果每个服务实例都开很大的池,扩容应用时反而更容易把数据库连接打满。
- 最大连接数按实例数折算。 例如数据库可用连接 800,应用 20 个实例,单实例连接池就不能随手配置 100。
- 等待时间要有上限。 连接拿不到时快速失败或降级,避免请求堆积。
- 空闲连接要回收。 低峰期保留太多空闲连接,会挤占其他服务空间。
- 入口要有限流。 当连接池等待变长时,优先保护核心接口。
一个简单的估算方式是:
单实例最大连接数 = floor(数据库可用连接数 * 0.7 / 应用实例数)
这里的 0.7 是预留空间,给管理连接、任务脚本、其他服务和突发情况留余量。实际值还要结合请求耗时和并发量压测。
上线后的观察项
- 连接池等待时间。 如果等待时间上升,说明应用侧已经感受到数据库压力。
- Threads_connected 与 Threads_running。 前者看连接占用,后者看活跃压力。
- 慢查询数量。 突增时要关联接口发布时间、流量入口和 SQL 模板。
- 长事务数量。 持续超过几十秒的事务要重点关注。
- 错误率和超时率。 数据库连接问题通常会先体现在接口延迟和错误率上。
常见坑
- 只调大 max_connections。 连接变多会增加数据库压力,根因不解决会再次打满。
- 忽略空闲连接。 大量空闲连接可能来自连接池最小连接数过大或回收策略不合理。
- 事务里做慢操作。 事务边界太大,会同时放大连接占用和锁等待。
- 没有按服务拆指标。 只看数据库总连接数,很难判断是哪一个应用实例在放大问题。
总结
MySQL 连接数打满时,正确路径是先看全局连接和活跃连接,再用 PROCESSLIST 找连接状态,接着关联长事务、慢请求和应用连接池配置。参数可以临时止血,但长期稳定要靠缩短连接占用时间、控制入口并发、让每个服务都有明确的连接预算。
Python CSV 批量导入实战:分批校验、错误行回写和事务提交
- 上一篇
- Python CSV 批量导入实战:分批校验、错误行回写和事务提交
- 下一篇
- Go 错误链处理实战:用 errors.Is 和 errors.As 保留根因
-
- 数据库 · MySQL | 2天前 |
- MySQL EXPLAIN ANALYZE定位排序临时表的排查方法
- 434浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · JSON ·
- MySQL JSON多值索引处理数组成员检索的设计要点
- 404浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 数据库 · mysql SQL JSON JSON_TABLE
- MySQL JSON_TABLE为缺失字段提供默认值的映射方法
- 445浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL CTE拆分多阶段聚合查询的维护方法
- 418浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 数据库 · mysql 窗口函数 ROW_NUMBER RANK DENSE_RANK
- MySQL窗口函数按分组取排名前N条的查询设计
- 465浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · InnoDB · MySQL锁等待 performance_schema.data_lock_waits data_locks锁对象 InnoDB事务阻塞 锁等待链定位
- MySQL 锁等待定位事务锁等待链的实现方法
- 497浏览 收藏
-
- 数据库 · MySQL | 2天前 | MySQL · 连接池 · database/sql ·
- MySQL 连接池配置连接池避免拿到失效连接的实现方法
- 392浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 183次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 239次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 193次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 174次使用
-
- CMMLU
- 深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
- 163次使用
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- 接口返回的数据和数据库不一致怎么办?按数据生命周期排查
- 2026-06-27 398浏览
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- 详解如何利用GORM实现MySQL事务
- 2023-01-07 184浏览

