navicat不支持自动分批导出,需手动分页查询或改用select into outfile、mysqldump等原生命令,并严格校验索引、边界和数据完整性。

Navicat 本身不支持自动分批导出,必须手动切分 SQL 查询
Navicat 的「导出向导」和「转储SQL文件」都是一次性执行全量 SELECT,没有内置的 LIMIT/OFFSET 分页逻辑。当你右键表点「导出向导」→ 选“SQL”格式 → 点“开始”,它背后实际发的是 SELECT * FROM table_name,没加任何条件。对千万级以上表,这会触发全表扫描、锁等待、内存溢出,甚至让 Threads_running 拉到 15+,拖垮整个实例。
所以不能依赖界面按钮,得自己写带分页的查询,再用 Navicat 执行并导出结果:
- 先确认主键或时间字段有索引(如
id或create_time),否则分页LIMIT会变慢查询 - 用
SELECT ... FROM table WHERE id BETWEEN ? AND ?比LIMIT offset, size更稳定,避免深分页性能衰减 - 每次导出前加采样检查:
SELECT COUNT(*) FROM huge_table WHERE create_time > '2026-08-01',超 1 秒就拆更小批次 - 导出时关闭 Navicat 的「分析执行计划」选项——它会在后台反复跑
EXPLAIN,额外加重解析负担
用 SELECT INTO OUTFILE 分批导出 CSV,绕过 Navicat 内存瓶颈
Navicat 导出大表常因客户端内存不足失败(报错类似 Out of memory when trying to allocate)。这时应放弃 GUI,改用 MySQL 原生命令 SELECT ... INTO OUTFILE,数据由服务端直接写磁盘,不经过 Navicat 进程。
操作要点:
- 确保 MySQL 配置允许该操作:
secure_file_priv必须非空(查法:SHOW VARIABLES LIKE 'secure_file_priv';),且你指定的路径在该目录下 - 导出语句示例:
SELECT * FROM log_table WHERE create_time >= '2026-09-01' INTO OUTFILE '/var/lib/mysql-files/log_20260901.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; - 每条语句只导一个时间区间或 ID 段,避免单文件过大;文件名带上日期/序号,方便后续合并或校验
- 导出后记得手动清理临时文件,
INTO OUTFILE不支持覆盖,重复运行会报错
别用 Navicat「备份」功能导出大表数据,改用 mysqldump 分段参数
Navicat 的「备份」按钮本质是调用 mysqldump,但它把所有高级参数藏在 UI 后面,无法控制分片行为。比如默认不加 --where、不设 --skip-triggers、也不支持 --skip-extended-insert 控制 INSERT 行数,导致导出文件巨大、导入卡死。
更可控的做法是:关掉 Navicat 备份,直接在终端跑定制化 mysqldump:
- 按时间分片:
mysqldump -u user -p db table --where="create_time >= '2026-09-01' AND create_time table_20260901.sql - 按主键分片:
mysqldump -u user -p db table --where="id BETWEEN 1000000 AND 1999999" > table_part2.sql - 加
--skip-extended-insert让每行 INSERT 只插一条,便于中断恢复和 diff 对比 - 禁用压缩:
--compress=false,让输出为裸 SQL,后续用nice -n 19 gzip -1低优先级压缩,不抢数据库资源
分批导出后如何合并与校验,避免数据遗漏
分批导出最大的风险不是慢,而是漏——比如 WHERE 条件边界写错、时间字段时区未对齐、或某一批导出中途失败却没被发现。不能靠人工数文件行数。
关键动作要闭环:
- 导出前先记总数:
SELECT COUNT(*) FROM table WHERE condition;,导出后对每个分片文件用wc -l(Linux/macOS)或Get-Content file.sql | Measure-Object -Line(PowerShell)统计 INSERT 行数,加总对比 - 用
sha256sum而非 MD5 校验每个分片文件,SHA256 在 2026 年已成事实标准,速度更快、碰撞概率更低 - 如果用
INTO OUTFILE导出 CSV,导入前务必用LOAD DATA INFILE测试一条记录是否能正确解析字段和引号,避免后期批量失败 - 所有分片文件名建议统一前缀+序号(如
sales_001.csv,sales_002.csv),不要用时间戳——跨天任务可能因系统时钟漂移导致顺序错乱
分批这件事,核心不在工具怎么点,而在每次执行前是否确认了索引有效性、WHERE 边界是否无重叠无缺口、以及有没有把校验步骤写进脚本而不是靠人眼盯。











