navicat 导出大表卡死是因单线程全量加载数据至内存所致,需调低内存缓冲区、勾选压缩协议、取消导出表数据;超500万行应改用mysqldump或mydumper。

直接关掉「导出为 SQL 文件」里的「导出表数据」选项,或改用 mysqldump 命令行——Navicat 本身不支持流式导出,卡死是设计限制,不是配置没调好。
为什么导出两千万行就卡在“正在处理数据”
Navicat 导出默认走单线程全量 SELECT + 拼 INSERT 语句路径,所有数据先加载进内存、再格式化、最后写文件。遇到大表时,内存瞬间吃满,系统被迫 swap,CPU 占用低但磁盘 I/O 持续 100%,界面就假死。这不是慢,是内存模型决定它必须这么干。
- 默认「每批记录数」设为 1000,实际只是分页显示,导出时仍会预加载全部结果集
- 导出到 C 盘桌面?路径越长、磁盘越慢(尤其机械硬盘),缓冲区堆积越严重
- 勾选了「压缩」或「加密」?这些操作都在内存里完成,进一步放大峰值占用
导出前必须调的三个设置
别等卡住再折腾,导出前这几项不改,大概率失败:
- 「工具 → 选项 → 备份/还原」里把「内存缓冲区大小」从默认 1024MB 改成
128或256—— 这是最快见效的开关 - 右键目标连接 →「编辑连接」→「高级」页签 → 勾选「压缩协议」,减少网络传输体积(对远程库有效)
- 导出窗口中取消勾选「导出表数据」再试一次:如果秒完成,说明问题纯出在数据导出环节,结构导出本身很轻量
真正扛得住大批量导出的替代方案
超过 500 万行或单表 >500MB,就该放弃 Navicat GUI 导出。命令行不是更难,是更可控:
- 用
mysqldump加--single-transaction(InnoDB 安全)、--skip-triggers、--compact,避免冗余信息 - 导出路径必须是本地 SSD,比如
/tmp/db.sql,别直连远程库再存到本机慢盘 - 超大库(>50GB)直接上
mydumper:多线程、按表分文件、自带压缩,Navicat 完全没法比
导出中途卡住,别重启 Navicat
卡在“已处理 12,487,321 行”不动?说明内存已污染,重启只会重载旧状态:
- 立即点击左下角「保存」按钮(Navicat 17+ 有这个隐式缓存刷新机制)
- 关闭所有打开的查询标签页和表标签页
- 右键该连接 →「断开连接」→ 再右键 →「连接」,重置连接上下文
- 还不行?右键连接 →「复制连接」→ 删除原连接 → 把副本重命名回原名——这会清空内部游标和元数据快照
最容易被忽略的是:Navicat 的导出任务共享连接池,哪怕你只开了一个导出窗口,后台可能还有另一个未关闭的查询标签页在缓存结果集。内存压力从来不是孤立事件,而是多个标签页+自动任务+连接状态共同堆出来的。











