MySQL · 错误码速查
MySQL 错误 2013:连上之后断了,先看报错后缀是 during query 还是 reading initial communication packet
ERROR 2013 (HY000): Lost connection to MySQL server during query 是客户端发现连接在使用中断开。官方列了三类原因:最常见是网络问题,其中一次查询传输上百万行时可能超过 net_read_timeout(默认 30 秒);少数发生在初次连接,和 connect_timeout 太短有关,此时 Aborted_connects 会增加;还有 BLOB 大于 max_allowed_packet。报错后缀决定先查哪一类。
官方原文
Error number: 2013; Symbol: CR_SERVER_LOST; Message: Lost connection to MySQL server during query官方 B.3.2.3 节:通常说明网络连接有问题;“during query” 形式有时出现在一次查询发送数百万行时,可把 net_read_timeout 从默认 30 秒调到 60 秒或更长;少数发生在初次连接,可把过短的 connect_timeout 调到 10 秒左右;其余情况可能是 BLOB 大于 max_allowed_packet。
出处:MySQL 8.4 Error Reference:Client Error Message Reference 最后核对:
| 错误号 / 符号 | 2013 / CR_SERVER_LOST(客户端错误) | 出处 |
|---|---|---|
| SQLSTATE | 客户端错误一律为 HY000 | 出处 |
| 官方点名的参数 | net_read_timeout(默认 30 秒)、connect_timeout、max_allowed_packet | 出处 |
| 初次连接类的证据 | SHOW GLOBAL STATUS LIKE 'Aborted_connects':服务器每中止一次初次连接尝试就加 1 | 出处 |
| 相邻错误 | 2006 MySQL server has gone away;2003 根本没连上;1205 锁等待超时是服务端返回、连接不断 | 出处 |
2013 说明什么:连接建立过,后来断了
和 2003 不同,2013 出现时客户端和 mysqld 已经建立过连接,在等待结果或握手过程中发现对端没了。这是客户端库报的错,服务端不一定有对应记录,所以排查要两边一起看。
官方在 B.3.2.3 Lost connection to MySQL server 里写了三类可能原因,并按报错信息里的后缀区分。下面按这个顺序展开。
按报错后缀分流:during query / reading initial communication packet / reading authorization packet
| 报错里看到的 | 官方归类 | 优先检查 |
|---|---|---|
during query | 通常是网络问题;有时是一次查询要传数百万行 | 网络质量;结果集大小;net_read_timeout(默认 30 秒,官方建议可调到 60 秒或更长) |
reading authorization packet 等初次连接阶段字样 | 较少见:初次连接时 connect_timeout 太短 | Aborted_connects 是否在涨;connect_timeout 调到 10 秒左右(远距离或慢链路可以更长) |
处理大字段时断开,或同时见到 ER_NET_PACKET_TOO_LARGE | BLOB 大于 max_allowed_packet | 客户端和服务端两边的 max_allowed_packet |
官方只给出了这三类。服务器进程重启或崩溃、会话被 KILL、中间代理或负载均衡的空闲超时,也会让客户端看到连接丢失;遇到这些情况要对照 mysqld 错误日志、Uptime 和代理日志,别只盯着超时参数。
只读:先看参数和计数,再决定改不改
SHOW VARIABLES WHERE Variable_name IN
('net_read_timeout','net_write_timeout','connect_timeout',
'max_allowed_packet','wait_timeout','interactive_timeout');
SHOW GLOBAL STATUS WHERE Variable_name IN
('Aborted_connects','Aborted_clients','Uptime',
'Connection_errors_internal','Connection_errors_peer_address');Uptime很小:服务器刚重启过,先查错误日志里是不是崩溃或 OOM,这时调超时没有意义。Aborted_connects持续上涨:对应官方说的初次连接类,再结合报错后缀看connect_timeout。Aborted_clients上涨:已建立的连接没有正常关闭(客户端退出没关连接、超时被断等),和 2013 常一起出现。
一次拉几百万行:调 net_read_timeout 之前先想想该不该这么拉
官方给的处理是把 net_read_timeout 从默认 30 秒调到 60 秒或更长,让数据传完。这能止血,但如果是报表、导出、同步任务一次性 SELECT * 几百万行,更稳的做法是分批:按主键范围或游标分页拉取,每批几千到几万行。分批之后单次传输时间短,网络抖一下也只需重试一批。
用 mysqldump 导大表时遇到 2013,同样先看是否有超大 BLOB 行(对应 max_allowed_packet),再看网络。
和 2006、2003、1205 怎么分
| 错误 | 现象 | 和 2013 的区别 |
|---|---|---|
2006 CR_SERVER_GONE_ERROR | MySQL server has gone away | 通常是在一个已经断开的连接上发新语句(例如空闲超过 wait_timeout 后),2013 是查询进行中断开 |
2003 CR_CONN_HOST_ERROR | Can't connect to MySQL server | TCP 连接根本没建立 |
1205 ER_LOCK_WAIT_TIMEOUT | Lock wait timeout exceeded | 服务端返回的错误,连接不断,只回滚当前语句 |
常见问题
Lost connection to MySQL server during query 是什么原因?
客户端发现连接在查询过程中断开。官方说通常是网络问题;一次查询传数百万行时可能超过 net_read_timeout(默认 30 秒);也可能是 BLOB 大于 max_allowed_packet。
MySQL 2013 要把 net_read_timeout 调多大?
官方建议从默认 30 秒调到 60 秒或更长,以足够完成传输为准。如果是一次性拉几百万行,更建议改成分批读取。
连接时就报 2013 reading initial communication packet 怎么办?
官方把初次连接时的 2013 归因于 connect_timeout 过短,可调到 10 秒左右;用 SHOW GLOBAL STATUS LIKE 'Aborted_connects' 看是否在增加来确认。
2013 和 2006 MySQL server has gone away 有什么区别?
2013 是查询进行中连接断开;2006 通常是在已经断开的连接上执行新语句,例如连接空闲超过 wait_timeout 被服务器关闭后。
2013 会不会是 MySQL 崩溃了?
有可能。先看 SHOW GLOBAL STATUS LIKE 'Uptime' 是否很小,再看 mysqld 错误日志是否有崩溃或被系统 OOM 杀掉的记录;如果是重启导致,调超时参数解决不了。
下一步
价格以对应页面当前标价为准。
出处(最后核对 2026-10-30)
- MySQL 8.4 Error Reference:Client Error Message Reference
- MySQL 8.4 Reference Manual B.3.2.3:Lost connection to MySQL server
- MySQL 8.4 Reference Manual B.3.2.7:MySQL server has gone away
本页摘录并解读上面列出的官方文档,不是官方页面;官方文档更新后以官方为准。本页内容都来自官方文档,没有我们自己的测试结果。