
Navicat 连 MySQL 报 2013 错误这大概是数据库日常维护里最让人头大的报错之一。明明服务在跑、密码也对、端口也通偏偏连接就是不稳定用着用着就断开或者跑个大 SQL 直接给你掉线。我这几年处理过的 2013 案例少说也有几十个从本机开发环境到线上生产库都遇到过今天就把这套排查思路完整写出来。这篇内容围绕 MySql 和 navicat 连接过程中最常见的 2013 错误展开核心解决连接不稳定和连接后频繁掉线两大问题适合刚接触 Navicat 的初学者也适合被线上环境折磨的运维同学参考。我会从错误本质、排查步骤、高频场景、避坑经验四个维度拆开讲每一步都有具体的操作命令和参数说明你照着做基本都能定位到问题根源。1. 先搞清楚 2013 错误到底发生在哪个环节遇到报错最忌讳的就是瞎试最好先停一下搞清楚这个错误代码到底在说什么。2013 错误对应 MySQL 官方文档里的 Lost connection to MySQL server during query翻译成人话就是客户端连着连着连接断掉了。但断掉这件事背后分了完全不同的几层原因如果你不去区分排查效率会非常低。1.1 错误全貌客户端视角 vs 服务端视角先说客户端视角也就是你在 Navicat 里看到的现象。通常 2013 错误有两种表现形态一种是一连接就报错压根没进到数据库另一种是连接成功了但查询跑到一半报错断开或者放着不动过一会儿再操作就断了。这两种现象背后是完全不同的机制。第一种情况大概率是网络不通、端口不可达、或者 MySQL 服务端在握手阶段就拒绝了连接常见原因包括防火墙拦截、MySQL 的 bind-address 配置只允许本机访问、连接超时时间设置过短。第二种情况则更可能和参数配置有关比如wait_timeout把空闲连接断开了、max_allowed_packet太小导致大批量数据读取失败、或者网络链路本身不稳定导致传输中断。再看服务端视角。如果你有权限登录 MySQL 服务器执行下面这条 SQLSHOW GLOBAL STATUS LIKE Aborted_connects; SHOW GLOBAL STATUS LIKE Aborted_clients;如果Aborted_connects在持续增长说明有很多连接在握手阶段就失败了重点查网络和权限如果Aborted_clients增长明显说明连接建立后中途断开了重点查wait_timeout和网络稳定性。这一步相当于给故障定性定性之后再动手排查效率完全不一样。1.2 触发 2013 的三大典型场景我把实际工作中遇到的情况归个类绝大多数 2013 跑不出这三类场景。第一类连接瞬间失败。Navicat 一点连接几秒钟之内直接弹出 2013这种最常见于远程连接场景。服务器防火墙没放行 3306 端口、云服务商安全组没配、或者 MySQL 配置了bind-address 127.0.0.1只允许本机连接都会造成这个结果。第二类空闲后被断开。你用 Navicat 连上数据库可能去写了一会儿 SQL 或者开个会回来再点执行就报 2013。这是因为 MySQL 服务端有个wait_timeout参数默认 8 小时但很多生产环境会人为调小比如调到 60 秒。一旦连接空闲超过这个时间服务端直接给你掐断Navicat 这边不知道继续用旧连接去查询自然就报错。第三类大查询跑到一半断开。执行一个特别大的SELECT或者INSERT数据量超过某个阈值查询进行中断开。这一类很多是和max_allowed_packet、net_read_timeout、net_write_timeout这几个参数相关也有部分是网络设备或代理导致长连接被切断。1.3 为什么同样的报错排查思路完全不同这是我特别想强调的一点。很多同行看到 2013 就直接去百度搜到一堆改 wait_timeout的答案一套操作猛如虎最后发现根本没用因为压根不是同一个原因。举个例子有一次同事反馈 Navicat 连测试库报 2013我让他先在服务器本地用命令行连一下 MySQL。结果本地连接完全正常远程用 Navicat 就报错那问题就直接锁定在网络链路或 MySQL 的监听地址上。最后发现是云安全组把 3306 端口限制成了仅允许办公网 IP 访问而同事当天在家里远程办公IP 变了自然连不上。如果用修改超时参数的方式去排查折腾一天也解决不了。所以我建议你拿到 2013 错误后先花两分钟回答三个问题报错是连接时立刻发生还是用了一会儿才发生是本机连接还是跨机器远程连接执行普通查询正常、只有特定 SQL 才报错还是所有操作都报错这三个答案能帮你砍掉至少一半的排查方向。2. 一套能直接照着做的排查链路前面讲了错误分类这一节给出完整的排查顺序。我的习惯是从网络层开始逐层往上到 MySQL 服务端配置最后再看 Navicat 客户端设置。这个顺序的核心逻辑是先排除底层问题再处理上层配置避免把客户端参数改了半天结果发现网络根本不通。2.1 第一层网络连通性与防火墙检查先说最快验证网络连通性的方法。Navicat 连接远程 MySQL 最常用的端口是 3306你可以用系统自带的命令快速确认端口是否可达。在 Windows 上打开 CMD执行ping 目标IP telnet 目标IP 3306Linux 或 Mac 上执行ping 目标IP nc -vz 目标IP 3306telnet或nc这一步很关键。如果端口通了你会看到类似Connected to 目标IP的提示如果没通命令会一直卡住直到超时这种情况基本可以断定网络层问题。但端口不通不一定就是网络问题也可能是 MySQL 服务根本没有监听在 0.0.0.0 上。登录到 MySQL 服务器查看监听地址netstat -tlnp | grep 3306如果看到的是127.0.0.1:3306而不是0.0.0.0:3306说明 MySQL 只监听了本机回环地址远程连接当然进不来。解决办法是修改 MySQL 配置文件my.cnf或my.ini中的bind-address[mysqld] bind-address 0.0.0.0改完重启 MySQL 服务。这一步在线上环境要谨慎监听所有网卡意味着暴露面变大了建议在防火墙层面对 3306 端口做严格的来源 IP 限制。防火墙这块也要单独确认。Linux 上如果用的是firewalldfirewall-cmd --list-ports firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload云服务器还要额外检查安全组规则。这个特别容易漏因为你在服务器本机看到的防火墙规则都放行了但云控制台的安全组还会单独拦一道。我帮人排查时第一步就会问安全组或者防火墙里 3306 放行了吗 这一句能挡住一半的无效排查。2.2 第二层MySQL 服务端关键参数逐个核实如果网络层没问题端口能通接下来就要看 MySQL 服务端配置了。登录到 MySQL命令行方式mysql -uroot -p然后执行以下 SQL一次性把相关参数捞出来SHOW VARIABLES WHERE Variable_name IN ( wait_timeout, interactive_timeout, connect_timeout, max_allowed_packet, net_read_timeout, net_write_timeout );逐个来说。connect_timeout是 MySQL 在响应连接请求之前的等待时间单位秒默认是 10。如果客户端在握手阶段迟迟等不到响应就可能报错。理论上这个值不用太大但如果你发现客户端连的时候偶尔超时可以适当调大到 15 或 20。wait_timeout和interactive_timeout是控制空闲连接断开时间的。wait_timeout作用于非交互连接interactive_timeout作用于交互式连接。Navicat 这类图形化工具通常走的是交互式连接但有些驱动方式不太一样。这里有个容易踩的坑Navicat 连接时如果勾选了一些特殊选项可能被视为非交互连接那生效的就是wait_timeout。所以两个值最好一起设置避免漏网。max_allowed_packet是我在这类问题里见到最多的元凶。它是 MySQL 允许的最大网络数据包大小默认值在不同版本里不一样MySQL 8.0 默认是 64MB5.7 某些版本默认是 4MB。如果你导入大批量数据或者查询超大文本字段单次传输超过这个值连接就会被强制断开表现为 2013 错误。这个参数最坑的地方在于小 SQL 一切正常大 SQL 一跑就断很容易让人误以为网络有抖动。修改方式SET GLOBAL max_allowed_packet 67108864;这个值是字节单位64MB 就是 64 × 1024 × 1024 67108864。注意SET GLOBAL只对后续新连接生效已存在的连接不会立即生效所以改完以后 Navicat 需要重连一次。如果要永久生效改配置文件[mysqld] max_allowed_packet 64Mnet_read_timeout和net_write_timeout则是控制数据读取和写入过程中网络中断等待时间的默认是 30 秒。如果执行某些查询超过这个时间没有数据交互连接也可能被断掉。注意这是等待时间不是总执行时间所以只要持续有数据流动不会触发但如果网络间歇性丢包导致传输停滞就容易撞上这个超时。网络质量差的场景可以把这两个值适当调到 60 或 120。2.3 第三层Navicat 连接参数与客户端设置调整服务端检查完之后再回头看 Navicat 这一侧。很多人忽略 Navicat 自带的高级连接选项以为它就是个纯客户端其实它的连接参数也会直接影响 2013 是否出现。在 Navicat 的连接配置界面点击高级或连接选项卡重点看两个东西。第一个是保持连接间隔或者叫 KeepAlive 设置。这个功能的作用是当连接空闲时Navicat 每隔一段时间自动向 MySQL 发送一个探测包让服务端认为连接仍然活跃从而避免被wait_timeout掐断。如果你有长时间挂着 Navicat 不操作的习惯强烈建议打开这个选项间隔可以设置在 60 秒以下取决于你服务端的wait_timeout值。比如wait_timeout是 300 秒那你把保活间隔设置成 120 秒就足够安全。第二个是使用 SSL选项。MySQL 8.0 默认开启 SSL 支持有些服务器强制要求 SSL 连接。如果 Navicat 里 SSL 设置不对也可能在握手阶段报错但报的不是 2013而是类似 SSL 连接错误的提示。有时候反过来服务器没配置 SSL但 Navicat 勾选了使用 SSL连接同样会失败。这一项怎么选取决于服务器的require_secure_transport参数SHOW VARIABLES LIKE require_secure_transport;如果值是OFFNavicat 里不勾选 SSL 通常没问题如果是ON就必须勾选并配置正确的 CA 证书。这里还有一个高频坑MySQL 8.0 默认生成的 SSL 证书有过期时间如果证书过期了即使你勾选 SSL 也可能连接报错。这种情况要么续期证书要么在确认网络环境安全的前提下关闭 SSL 要求具体要看你公司的安全规范。另外Navicat 里的连接超时设置也值得顺手看一眼。有些旧版本的 Navicat 默认连接超时很短如果 MySQL 响应稍慢就会出现异常。我一般会调成 30 秒以上宁可多等一会儿也别让连接在握手阶段被误杀。3. 高频场景逐一拆解大查询、空闲连接与 SSL这一节是我从大量的实际案例里抽出来的三个最高频场景每个都给出具体的判断方法和解决路径。这几个场景覆盖了我在真实环境里遇到的七成以上 2013 错误。3.1 跑大 SQL 中途断连max_allowed_packet 与网络传输超时这种场景的特征非常明显连上数据库没问题执行普通增删改查也没问题但只要一查大表、导大批量数据、或者执行包含超大字段的查询跑一会儿就报 2013。而且操作的数据量越大断的概率越高。先验证max_allowed_packetSHOW VARIABLES LIKE max_allowed_packet;如果结果明显偏小比如 41943044MB那就很可疑。怎么确认是不是这个参数导致的可以直接在命令行里跑一个较大数据量的查询比如SELECT * FROM 某张大表如果命令行也掉线那基本可以锁定是服务端参数问题。如果命令行没问题但 Navicat 掉线那还要检查 Navicat 自身是否有限制以及网络链路的稳定性。还有个容易忽视的点max_allowed_packet不仅影响查询返回结果也影响导入数据。很多人在 Navicat 里导入 SQL 文件或者大批量 INSERT 时报 2013第一反应是 SQL 文件有问题其实很可能是max_allowed_packet太小。比如你要导入一条包含几百 MB 的 BLOB 数据的记录包大小不够连接直接断掉。我遇到过导入 50MB 的 SQL 备份文件反复报 2013把max_allowed_packet从 4M 调到 64M 后一次成功。另外net_read_timeout和net_write_timeout在这种大查询场景里也扮演角色。如果网络本身有小抖动或者中间隔着代理、隧道、负载均衡等设备大流量传输遇到暂时性阻塞时只要阻塞时间超过net_read_timeout或net_write_timeout的阈值MySQL 就会主动断开连接。你这边看到的就是查询跑到一半报 2013。这种场景的解决办法我在前面已经给过总结成三步调大max_allowed_packet建议至少 64M视数据规模可以更大把net_read_timeout和net_write_timeout调整为 60 到 120 秒如果还不行用 Navicat 的保持连接间隔功能同时给客户端做个保活。这里插一句修改这些参数后一定要确认生效方式。SET GLOBAL改动的是运行时变量重启 MySQL 后如果没写进配置文件就会恢复原样。所以线上的规范操作是先动态修改验证效果确认没问题后再同步修改配置文件。只改了配置文件没执行SET GLOBAL那当前运行实例上依然不会有任何变化。3.2 打开连接什么都没干就断wait_timeout 与保活机制这个场景的特征非常典型Navicat 连上数据库可能建好了连接但你一忙别的事隔了半小时再回来点一下数据库直接弹 2013 错误。或者你开了 Navicat 的多个查询窗口长时间不用再执行 SQL 才发现所有窗口全断了。绝大多数情况下是wait_timeout或interactive_timeout的值太小。MySQL 为了控制资源占用会主动回收空闲连接。假设wait_timeout 60意思是一个连接空闲超过 60 秒就会被服务端断开。你离开工位泡杯咖啡、开个会再回来操作连接早就被服务端回收了但 Navicat 客户端并不知道还在拿这个废连接去发请求自然报 2013。先查现值SHOW VARIABLES LIKE wait_timeout; SHOW VARIABLES LIKE interactive_timeout;生产环境有些 DBA 会把这两个值调成几十秒来控制连接数这本身是资源优化策略。如果你不想麻烦他们改全局配置更好的方案是调整 Navicat 侧。实际操作路径是Navicat 连接配置 → 高级 → 保持连接间隔。把这个间隔值设置为明显小于服务端超时值的数字比如服务端wait_timeout 300客户端保活间隔就设 120 秒。这样 Navicat 会定期发送探测包让连接保持活跃服务端也就不会因为空闲而断开。还有一种情况要特别留意你在 Navicat 里每次发起查询如果使用的是同一个长连接保活机制生效但如果 Navicat 自动重新连接有时反而会带来其他问题比如连接数暴涨。我见过有人为了解决 2013在连接配置里勾选了自动重连结果服务端连接数被大量占满数据库负载莫名其妙升高。这个选项要慎用尤其在生产环境别按下葫芦浮起瓢。如果连上之后用不了多长时间就断甚至可以检查 MySQL 的连接数限制也就是max_connections。连接池如果满了服务端会拒绝新连接也会表现为连接问题。执行SHOW STATUS LIKE Threads_connected; SHOW VARIABLES LIKE max_connections;Threads_connected如果已经接近max_connections说明当前连接数已经透支即使 Navicat 重连也可能连不上更别提连接稳定性了。3.3 Navicat 强制 SSL 导致的握手异常这个场景和 2013 的关系比较隐蔽经常被人忽略。MySQL 8.0 以后默认开启 SSL 支持但这不等于所有客户端都能顺利握手。Navicat 在连接界面有一个使用 SSL选项卡里面可以选不使用 SSL使用 SSL使用 SSL 验证 CA 证书等几个模式。如果你选错了模式可能会在连接建立阶段直接被拒绝报的错未必是纯 2013有时会显示类似 SSL 连接错误、证书验证失败的提示。但如果服务器支持 SSL 但配置不完整也可能表现为连接超时或意外断开最终兜成 2013。遇到这种情况先确认 MySQL 的 SSL 状态SHOW VARIABLES LIKE have_ssl; SHOW VARIABLES LIKE require_secure_transport;have_ssl为YES说明服务端启用了 SSL 能力require_secure_transport为ON则说明强制所有连接都走 SSL。如果后者是OFF那 Navicat 完全可以选不使用 SSL反而更省事也能避开证书相关的各种麻烦。如果确实需要使用 SSL比如公司安全规范要求或者require_secure_transport是ON那就要注意证书的问题。MySQL 8.0 初始化时会自动生成 SSL 证书但这个自签证书有时会被 Navicat 视为不安全。解决方法是在 Navicat 的 SSL 配置里把 CA 证书路径指向服务器上的ca.pem文件而不是选使用系统证书。这里要提醒一句有些版本的 Navicat 对 SSL 支持存在各种奇怪的小问题如果上面这些步骤都试过了还是报错可以尝试升级 Navicat 版本或者换个驱动方式。我自己的经验是很多 SSL 相关的连接异常换一个 Navicat 版本就莫名其妙解决了大概率是旧版本对 MySQL 8.0 的 SSL 握手兼容性不好。4. 常见问题速查表与独家排查心得前面的内容偏流程化这节我把零散的案例分析汇总一下做成速查表再补充一些我在真实环境里积累的排查技巧方便你遇到类似问题直接对照。4.1 故障场景 → 原因 → 解法 速查表故障现象可能原因快速验证方法解决方案连接按钮一按立刻报 2013网络不通 / 端口被防火墙拦截 / bind-address 限制telnet IP 3306或nc -vz IP 3306放行安全组和防火墙端口修改 bind-address 为 0.0.0.0连接偶尔能上但过一会儿再操作就断wait_timeout / interactive_timeout 过短SHOW VARIABLES LIKE wait_timeout调大服务端超时时间或开启 Navicat 保活间隔跑大 SQL 就断小 SQL 正常max_allowed_packet 太小SHOW VARIABLES LIKE max_allowed_packet调大到 64M 或更高动态修改并写入配置文件执行查询经常在数据传输阶段断开net_read_timeout / net_write_timeout 过短检查两者当前值调到 60~120 秒同时排查网络丢包远程连接报 SSL 相关错误或者 2013SSL 配置不匹配 / CA 证书没配好 / require_secure_transport 强制 SSLSHOW VARIABLES LIKE have_sslNavicat 中设置为不使用 SSL或正确配置 CA 证书连接数飙升后 Navicat 全部掉线max_connections 耗尽SHOW STATUS LIKE Threads_connected优化连接池限制空闲连接必要时调大 max_connections数据库服务器负载突然升高后报 2013服务端资源不足连接被系统杀掉查看系统负载和 MySQL 慢日志定位慢 SQL升级硬件或优化索引内网连接正常跨网段或通过跳板机连接报 2013中间网络设备断开空闲连接或拦截大包在跳板机上执行nc -vz IP 3306分段测试检查代理策略开启客户端保活必要时分块传输数据这张表基本覆盖了我在实际运维中遇到过的 2013 错误类型。你按表里的快速验证方法先确认再选对应的解决方案比盲目改参数高效得多。4.2 我踩过的几个坑和收尾建议最后分享一些不确定能在文档里看到的经验每一跳都是花时间换来的。第一个坑动态参数改了但 Navicat 不生效。我遇到过max_allowed_packet在 MySQL 里已经改到 64M但 Navicat 连接还是报 2013。原因是我执行了SET GLOBAL之后Navicat 还保持着改动前的旧连接全局变量对已存在的连接不生效。这种问题重连一次就好但如果你的连接被连接池缓存重连有时候也不会真正新建需要在 Navicat 里关闭连接再重新打开。第二个坑只查wait_timeout不查interactive_timeout。Navicat 的连接方式在不同版本里对交互式和非交互式的判定不一样。很多人只调大了wait_timeout结果发现空闲照样掉线因为实际生效的是interactive_timeout。保险的做法是两个参数一起设置成相同的值彻底打消这个不确定性。还有 MySQL 8.0.24 之后wait_timeout和interactive_timeout的默认值变了如果你用的版本很新网上搜到的一些旧经验不一定适用。第三个坑改参数时忽略了单位。max_allowed_packet的单位是字节不是 KB 也不是 MB。我见过有人在配置里写max_allowed_packet 64以为是 64MB结果实际是 64 字节连接全线崩溃。配置文件里如果带单位直接写64M没问题但如果用 SQL 语句动态修改必须写成字节数比如 67108864。这个换算关系最好烂熟于心。第四个坑忽略了服务器资源限制。有个 case 我记得很清楚同事反馈 Navicat 连测试库频繁 2013我查了网络、查了参数、查了防火墙全部正常。最后登录到服务器一看磁盘空间 100% 满了MySQL 无法正常写入临时文件和 binlog导致连接处理异常。这类问题很难直接从 2013 表面上看出关联所以排查时要顺手看一下系统资源磁盘、内存、CPU 负载、句柄数。再有一个建议学会用命令行客户端做对照实验。Navicat 报 2013但你在服务器本机用mysql命令行去查询如果不报错说明问题大概率在客户端配置或网络链路如果命令行也一样报错那就专注排查服务端。这个对照实验看起来简单但真的能省掉大量无谓的猜测。我在排查任何连接问题时第一件事永远是先用命令行确认一下 MySQL 是否真的健康。还有个使用层面的经验对大表的查询操作尽量不要在 Navicat 里直接全表查询如果只是想看数据分布用LIMIT限制返回行数如果要做数据导出选择分批方式而不是一次性拉取全部数据。这不只是为了规避 2013也是给数据库减负。最后说一个我个人的习惯不论什么环境我会在排查完 2013 错误后顺手把所有相关参数记录在案形成一份环境基线。下次再有人反馈类似问题直接拿基线做对比五分钟内就能判断是参数被改过还是网络有变化。数据库连接问题本身不可怕可怕的是每次都在同一个坑里反复横跳。