MySQL“server has gone away”错误主因是max_allowed_packet过小或wait_timeout超时,可通过Navicat变量页临时调大max_allowed_packet、修改my.cnf永久配置、SQL命令SET GLOBAL/SESSION调整、分段导入及关闭自动提交解决。
MySQL server has gone away 错误在 Navicat 导入大 SQL 文件时几乎必现,根本不是服务宕了——是 MySQL 主动断开连接,原因就两个:单条语句太大,或连接空闲太久。直接改配置就能解决,不用重启服务也能临时生效。
Navicat 里临时调大 max_allowed_packet
这是最常见、最直接的触发点:一个 insert 包含几千行数据,超出默认 4mb 限制,mysql 就会丢掉连接。
- 打开 Navicat → 工具 → 服务器监控 → 选中目标数据库 → 右侧点“变量”页签
- 找到
max_allowed_packet,双击修改值,建议设为256M或512M(单位是字节,256M= 268435456) - 点击“刷新”或“应用”,无需重启 MySQL,立刻生效
- 注意:这个设置是 session 级的,只对当前连接有效;如果导入中途断开,重新连接后要再设一次
my.cnf 里永久修改 max_allowed_packet 和超时参数
临时改完发现还是断?说明你导入耗时长,又撞上了 wait_timeout。这两个必须一起调。
- 编辑 MySQL 配置文件:
/etc/my.cnf(Linux)或C:\ProgramData\MySQL\MySQL Server 8.0\my.ini(Windows) - 在
[mysqld]段下添加三行(顺序不重要):
max_allowed_packet = 512M wait_timeout = 28800 interactive_timeout = 28800
-
max_allowed_packet必须用M后缀(如512M),某些版本不认512*1024*1024这种写法 -
wait_timeout单位是秒,28800 = 8 小时,足够跑完 200MB+ 的 SQL - 改完必须重启 MySQL:
sudo systemctl restart mysqld(Linux)或服务管理器重启(Windows)
Navicat 导入前手动执行 SET 命令绕过权限限制
如果你没权限改配置文件,或者用的是共享 MySQL 实例,可以用 SQL 命令临时覆盖。
- 在 Navicat 新建查询窗口,连上目标库,先执行:
SET GLOBAL max_allowed_packet = 536870912; SET SESSION wait_timeout = 28800;
-
536870912就是 512MB 的字节数,避免单位解析歧义 -
SET GLOBAL需要SUPER权限;若报错Access denied,只能用SET SESSION改当前连接的wait_timeout,但max_allowed_packet的 session 级别不可写,此时必须靠第一步 GUI 方式设 - 执行完再点“运行 SQL 文件”,导入过程就不会被中途掐断
导入时分段切文件比硬扛更可靠
哪怕参数全调高,2GB 的 SQL 文件仍可能因内存或磁盘 I/O 挂掉。别赌单次导入成功。
- 用
split(Linux/macOS)或gsplit(Windows via GnuWin32)把大 SQL 拆成 ≤50MB 的小文件 - 拆完按顺序一个个导入,Navicat 会自动续接连接,失败也只回滚单个文件
- 关键点:确保每段都以完整语句结尾——不要在 INSERT 中间切断,否则报语法错误;可用
sed -n '/^INSERT/p' big.sql | tail -20查最后几条 INSERT 是否完整 - 如果原始 SQL 有
CREATE TABLE+ 大量INSERT混排,建议用mysqldump --skip-extended-insert重导出,让每行 INSERT 独立,方便切割和重试











