← 中文资源

简体中文版本

MySQL 查询期间报 MySQL server has gone away

通过检查 max_allowed_packet、wait_timeout 及负载下的连接健康,修复 server has gone away。

阅读英文原文

症状

查询或插入以 MySQL server has gone away 失败,多见于大负载或在空闲一段时间后。服务器或中间层关闭了连接,客户端只有在尝试使用该套接字时才发现它已死。超过 max_allowed_packet 的大语句和超过 wait_timeout 的空闲连接是常见原因,代理也可能独立地丢弃空闲 TCP 连接。

诊断

查看 max_allowed_packet 与 wait_timeout;评估负载大小;检查连接池是否校验连接。

mysql -e "show variables like 'max_allowed_packet'; show variables like 'wait_timeout'"

根因

连接被服务器或中间层关闭,原因是数据包超过允许大小、连接空闲超过超时,或服务器重启,客户端在查询中途发现套接字已消失。

修复

提高 max_allowed_packet 或分批拆分大语句;让连接复用时间短于 wait_timeout 以保持存活;配置连接池在交由使用前校验或 ping;重连后对查询重试一次以处理残余情形。

验证

重跑大插入或空闲场景确认完成,并确认连接池替换被关闭的连接而非复用它们。完成且池行为健康即证明修复。

常见陷阱

为省事把 max_allowed_packet 设得过大可能撑爆内存;应结合分批与合理上限。