MySQL Error 2003/2013求助:连接失败与查询中断问题
排查MySQL连接超时与查询中断问题的思路
Hey there, let's work through those MySQL connection headaches you're having—those 2003 and 2013 errors are super common when running big queries, so we can break this down step by step.
先搞懂两个错误的本质
- Error Code: 2003 Can't connect to MySQL server:这是连接建立阶段的问题,大概率是网络波动、防火墙拦截、MySQL服务临时无响应,或者
connect_timeout设置太短,导致连接还没建立就超时了。 - Error Code: 2013 Lost connection to MySQL server during query:这是连接已建立,但查询执行中途断连,通常和大查询耗时过长、网络不稳定,或者读写超时参数设置不足有关。
结合你的配置给出具体调整方案
先把你当前的超时参数贴出来方便参考:
Variable_name Value -------------------------- -------- connect_timeout 10 delayed_insert_timeout 300 innodb_lock_wait_timeout 600 innodb_rollback_on_timeout OFF interactive_timeout 28800 net_read_timeout 60 net_write_timeout 60 slave_net_timeout 3600 table_lock_wait_timeout 50 wait_timeout 600
针对2003错误的调整
- 先排查网络基础问题:ping一下
10.49.50.23看是否丢包,用telnet测试3306端口能不能稳定连通。如果有丢包或者端口偶尔不通,找运维排查网络链路或防火墙规则。 - 调高
connect_timeout:10秒对于不稳定的网络环境来说偏短,可以调到20-30秒:
要永久生效的话,把SET GLOBAL connect_timeout = 30;connect_timeout = 30加到my.cnf或my.ini里,重启MySQL服务即可。
针对2013错误的调整(大查询的核心问题)
这部分是重点,毕竟错误出在查询执行过程中:
- 调高
net_read_timeout和net_write_timeout:这两个参数控制MySQL等待数据读写的超时时间,当前60秒对于大结果集来说不够,建议调到600秒(10分钟):SET GLOBAL net_read_timeout = 600; SET GLOBAL net_write_timeout = 600; - 检查
wait_timeout:当前设置是600秒(10分钟),如果你的大查询耗时超过10分钟,MySQL会主动断开非交互式连接(比如程序调用的连接)。如果是这种情况,可以把wait_timeout调到3600秒(1小时)甚至更久;如果是用Navicat、MySQL命令行这类交互式工具,interactive_timeout已经设为8小时,不用管它。 - 优化大查询本身:超时往往是查询效率低的表现,这才是根源:
- 用
EXPLAIN分析你的查询计划,看看有没有全表扫描,给过滤、关联的字段加合适的索引。 - 把大查询拆成多个小查询,比如分页获取结果,不要一次性拉取所有数据。
- 检查
max_allowed_packet参数(你没贴这个,但它对大查询很重要),如果查询传输的数据包太大,会直接导致断连,建议设为64M或128M:SET GLOBAL max_allowed_packet = 134217728; -- 128M
- 用
额外排查点
- 查看MySQL错误日志:找有没有服务重启、内存耗尽(OOM)、CPU过高的记录,这些都会导致连接意外中断。
- 监控服务器资源:用
top或htop看MySQL进程的CPU、内存占用,如果大查询把服务器资源跑满了,也会出现连接问题。
内容的提问来源于stack exchange,提问作者Pami
相关产品推荐
相关产品推荐

