贝利信息

mysql连接超时怎么处理_mysql超时异常排查方法

日期:2026-01-15 00:00 / 作者:P粉602998670
Communications link failure 根本原因是 MySQL 的 wait_timeout(默认8小时)主动断开空闲连接,非网络故障;需同步调整 wait_timeout 和 interactive_timeout,并配合连接池健康检查(如 HikariCP 的 validation-timeout 和 max-lifetime)治本。

看到 Communications link failure 就该查 wait_timeout

这个错误不是网络断了,而是 MySQL 主动“踢人”了——连接空闲太久,服务端直接断开 TCP 连接。典型表现是:应用启动后前几小时正常,隔夜或低峰期后首次请求就报错,堆栈里带 Last packet sent to the server was X ms ago。根本原因就是 MySQL 的 wait_timeout(默认 28800 秒 = 8 小时)生效了。

永久生效:改 /etc/my.cnf 并重启 mysqld

这是最稳妥、最推荐的做法,尤其在线上环境。临时 SET GLOBAL 只在当前会话生效,MySQL 重启后还原,生产环境不建议依赖。

[mysqld]
wait_timeout = 2592000
interactive_timeout = 2592000
net_read_timeout = 600

net_write_timeout = 600

代码层兜底:连接池健康检查比“延长超时”更可靠

光靠调大 wait_timeout 是治标。真正健壮的做法,是在应用侧让连接池主动探测并剔除失效连接。Spring Boot + HikariCP 默认就支持,但很多人因为拷贝旧配置关掉了它。

排查时先运行这三句 SQL,别急着改配置

很多团队一出问题就改配置、重启库,结果发现其实是连接池没配好,或者某段代码长期持有连接不释放。先快速定位真实瓶颈:

SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';
SHOW STATUS LIKE 'Threads_connected';

真正麻烦的不是超时本身,而是把超时当成万能借口,忽略了连接池配置错误、事务未提交、流未关闭这些更常见的泄漏源头。