MySQL性能排查实战:大量Sleep空闲连接导致数据库写入缓慢解决方案

一、问题现象

业务反馈 MySQL 数据库读操作正常,但写操作(INSERT/UPDATE/DELETE)耗时极长,业务接口出现明显卡顿、响应超时,数据库整体性能异常。

二、问题排查

  1. 执行连接状态查询 登录MySQL执行核心排查命令:
sql 复制代码
show full processlist;

排查结果

  • 数据库连接数高达 700~800个
  • 所有连接状态几乎全为 Sleep(空闲连接)
  • 无锁等待、无长事务、无慢查询阻塞
  • 存在大量未认证连接,MySQL资源被严重消耗
  1. 慢查询日志检查
sql 复制代码
show variables like '%slow%';

发现慢查询日志处于关闭状态,排除慢SQL导致的性能问题。

  1. 根因定位 应用服务连接池配置不合理,未正确释放数据库连接,导致大量空闲连接持续堆积,耗尽MySQL内存、CPU、IO资源,最终引发写入性能急剧下降(读可命中缓存,写需磁盘IO,受资源耗尽影响更严重)。

三、解决方案

方案1:急救处理 - 批量清理所有空闲连接

通过Linux命令行无格式、批量、安全清理所有Sleep空闲连接,无需手动复制粘贴,无语法报错:

bash 复制代码
# 1. 生成纯文本清理脚本(无表格格式,纯净SQL)
mysql -uroot -p'【数据库密码】' -N -e "SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE command='Sleep'" > /tmp/kill_sleep.sql

# 2. 一键执行脚本,清理所有空闲连接
mysql -uroot -p'【数据库密码】' < /tmp/kill_sleep.sql

方案2:根治处理 - 设置连接自动超时(永久解决)

清理连接后,配置MySQL自动断开空闲连接,从根本上杜绝连接堆积:

bash 复制代码
mysql -uroot -p'【数据库密码】' -e "SET GLOBAL wait_timeout=60; SET GLOBAL interactive_timeout=60;"
  • wait_timeout=60:非交互式连接空闲60秒自动断开
  • interactive_timeout=60:交互式连接空闲60秒自动断开

四、效果验证

执行命令验证连接数,连接数会从 700+ 骤降至 20以内,数据库性能立即恢复:

bash 复制代码
# 统计连接数
mysql -uroot -p'【数据库密码】' -e "show full processlist;" | wc -l

# 查看完整连接状态
mysql -uroot -p'【数据库密码】' -e "show full processlist;"

清理完成后,数据库写操作恢复正常速度,业务卡顿问题彻底解决。

相关推荐
Andya_net10 分钟前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python
ly768924 分钟前
Spring 中的 @Configuration 与 @Component 差异:为何代理时机决定 Bean 生命周期行为
java·后端·spring·注解·代理·bean生命周期
明月_清风36 分钟前
字符串匹配四大经典算法:BF、RK、BM、KMP 到底有什么区别?
后端·算法
卷无止境43 分钟前
测试全绿,功能能跑,代码却烂到没法上线:AI编程助手留下的十个坑
后端·python
明月_清风1 小时前
多模式字符串匹配:Trie 与 AC 自动机
后端·算法
嘻哈baby1 小时前
不用 LangChain,从 0 写一个 Ollama 本地 RAG
后端
考虑考虑2 小时前
Redis8.8新特性
运维·redis·后端
geovindu2 小时前
java:Observer Pattern
java·开发语言·后端·观察者模式·设计模式·行为模式
山甫aa2 小时前
【从零开始的 Web 后端学习】令牌技术一篇搞定(JWT 登录认证保姆级)
后端·学习·spring·web·jwt
wxwx_bscxy3222 小时前
springboot巡更系统10192
java·spring boot·后端·巡更系统