1. MySQL连接断开问题现象与诊断
那天凌晨两点,我正喝着第三杯咖啡,准备把本地开发的项目部署到生产服务器。一切看起来都很顺利——网站正常启动,接口测试通过,数据读写无误。然而第二天早上,运维同事的电话把我从睡梦中惊醒:"网站挂了,全是500错误!"
查看服务器日志后,我发现了这样的错误信息:
code复制The last packet successfully received from the server was 84,827,560 milliseconds ago.
The last packet sent successfully to the server was 84,827,560 milliseconds ago.
is longer than the server configured value of 'wait_timeout'
1.1 问题本质解析
MySQL服务器默认配置了一个关键参数wait_timeout,它决定了非交互式连接在空闲状态下的最大存活时间。通过命令行查询可以看到:
sql复制SHOW VARIABLES LIKE 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
这个28800秒(8小时)的设置意味着:任何通过JDBC等非交互方式建立的连接,如果在8小时内没有任何操作,MySQL服务端会主动断开这个连接。而我们的应用服务器使用了连接池,这些被MySQL断开的连接在应用端仍然被当作"有效连接"保留在池中。
1.2 连接状态监控技巧
使用SHOW PROCESSLIST命令可以观察当前所有连接的状态:
sql复制mysql> SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | St
