直接改max_allowed_packet能解决90%的“MySQL server has gone away”错误,因其默认仅1MB,无法承载大SQL文件;需同步调高wait_timeout和interactive_timeout并重启MySQL服务,且Navicat须重连生效。
直接改 max_allowed_packet 就能解决,90% 的情况是它太小了(默认仅 1mb),根本撑不住大 sql 文件。
为什么 Navicat 导入会触发 “MySQL server has gone away”
这不是连接断了,而是 MySQL 主动拒绝接收——它认为你发来的单条语句或事务数据包超出了允许上限。常见诱因包括:
- SQL 文件里有大段
INSERT或含BLOB/LONGTEXT字段的语句 - Navicat 默认把整个文件当一条语句执行(尤其勾选了“运行所有查询”时)
-
max_allowed_packet值低于实际需要,比如导一个 50MB 的 dump,但配置仍是默认 1MB - 即使没报错,也可能静默截断数据(字段缺失、行数变少),这是更隐蔽的问题
临时生效:用 MySQL 命令行快速调大
适合测试或临时修复,重启 MySQL 后失效。注意必须用管理员权限连接:
- 先查当前值:
SHOW VARIABLES LIKE 'max_allowed_packet'; - 设为 256MB(够大多数场景):
SET GLOBAL max_allowed_packet = 268435456; - 确认生效:
SHOW VARIABLES LIKE 'max_allowed_packet';—— 输出应为268435456 - 再回到 Navicat 重试导入(不用重启 Navicat)
⚠️ 注意:SET GLOBAL 不影响已存在的连接,只对新连接生效;如果 Navicat 连接早于该命令,需断开重连。
永久生效:修改 my.ini 或 my.cnf 配置文件
Windows 下找 my.ini(通常在 MySQL 安装目录或 C:\Windows\),Linux/macOS 找 /etc/my.cnf 或 /etc/mysql/my.cnf,在 [mysqld] 段落下添加:
max_allowed_packet = 256M wait_timeout = 28800 interactive_timeout = 28800
关键点:
-
max_allowed_packet必须写成带单位的格式(256M),不能写268435456—— 否则 MySQL 8.0+ 可能解析失败 -
wait_timeout和interactive_timeout也建议同步调高,避免长事务中途断连(尤其导入含大量INSERT的文件) - 改完必须重启 MySQL 服务:
net stop mysql+net start mysql(Windows)或sudo systemctl restart mysql(Linux)
Navicat 自带变量管理器也能调,但慎用
Navicat 的 Tools → Server Monitor → Variables 界面可编辑 max_allowed_packet,看起来方便,但实际有坑:
- 它调用的是
SET GLOBAL,效果同命令行临时方案 - 部分版本(尤其旧版)提交后不刷新值,界面显示未更新,容易误判
- 若 Navicat 连接未重建,仍走旧连接,改了也白改
- 不如直接进命令行或改配置文件来得确定
真正麻烦的不是改参数,而是改完忘了重启服务,或者改了全局值却没重连 Navicat —— 这两个动作漏掉任何一个,错误照常出现。


















