还原中断主因是MySQL服务端静默丢包,非Navicat卡死;需同步调大max_allowed_packet(配置文件设256M并重启服务)、wait_timeout,并改用XML格式导出(启用CDATA压缩)以绕过SQL解析瓶颈。
还原中断主因是服务端静默丢包,不是客户端卡死
navicat 还原含 blob、mediumtext 等大字段的 sql 文件时,进度条停在 99% 或直接报 lost connection to server,通常不是 navicat 崩溃或网络断开,而是 mysql 服务端主动终止了连接。根本原因是单条 insert 语句携带的二进制数据超出了 max_allowed_packet 限制,mysql 拒绝接收并静默关闭连接——不报错、不提示,只留下客户端“等待响应”的假象。
- 执行
SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';查当前值,若低于 256M(尤其原始值为 4M/16M),基本可确认是瓶颈 -
SET GLOBAL max_allowed_packet = 268435456;仅临时生效,Navicat 导入用的是新连接,不会继承该会话设置 - 必须修改 MySQL 配置文件:
my.ini(Windows)或/etc/my.cnf(Linux/macOS),在[mysqld]下添加max_allowed_packet = 256M - 改完后需完整重启 MySQL 服务(非重载),否则配置不加载;重启前建议执行
FLUSH TABLES;清缓存
SQL 格式导入对 Blob 是“自毁式操作”
Navicat 默认导出/导入用 SQL 格式,对 Blob 字段极其不友好:它把二进制内容转成十六进制字符串(如 0x89504E47...),体积膨胀近一倍,且整行拼成一条超长 INSERT,同时触发 net_buffer_length(默认 1MB)和 max_allowed_packet 双重限制。
- 避免 SQL 格式:右键表 →「导出向导」→ 格式选
XML→ 勾选「使用 CDATA 包裹二进制数据」和「压缩导出文件」 - XML 模式将 Blob 作为独立节点处理,绕过 SQL 解析器,不受
net_buffer_length影响,内存占用稳定 - 注意路径:XML 文件保存路径不能含中文、空格或特殊符号,否则 Navicat 可能读取失败
- 验证方式:导出后用文本编辑器打开 XML 文件,确认 Blob 内容被包裹在
中,而非十六进制字符串
服务端超时参数常被忽略但致命
即使 max_allowed_packet 调大,还原仍可能中断,因为 MySQL 的 wait_timeout(非 interactive_timeout)会在无查询交互时主动 KILL 连接。Navicat 批量导入时,写入阶段可能出现数秒空闲,恰好触发该机制。
- 查当前值:
SHOW GLOBAL VARIABLES LIKE 'wait_timeout';,默认 28800 秒(8 小时),但在高负载下可能动态缩短 - 临时调高:
SET GLOBAL wait_timeout = 86400;(仅本次会话有效) - Navicat 连接属性 →「高级」页签 → 勾选
Keep connection alive(若支持),或手动加连接参数:?connect_timeout=60&read_timeout=3600 - 更可靠方案:改用命令行
mysql客户端直连导入,并加参数:--net-read-timeout=3600 --net-write-timeout=3600
还原失败后无法续传,分片是唯一稳妥路径
Navicat 15 的「导入向导」不支持断点续传。一旦中途失败(比如内存溢出、连接中断),整个任务终止,且不记录已成功导入的行数。你无法知道卡在哪一行,也无法跳过已导入部分。
- 不要依赖「重试」按钮——它从头开始,重复消耗资源
- 对大 XML 文件,可用 VS Code 或 Notepad++ 搜索
或标签,按千行/万行手动切片 - 对 SQL 文件,用
split -l 5000 big.sql part_(Linux/macOS)或 PowerShell 的Get-Content分块,再逐个「运行 SQL 文件」(右键连接 →「运行 SQL 文件」) - 「运行 SQL 文件」走服务端执行,不经过 Navicat 客户端缓冲,规避客户端内存和超时限制


















