mysqldump导出千万级数据必须加--quick(逐行获取,内存友好)和--single-transaction(InnoDB一致性快照,避免锁表),否则易因内存溢出或锁表导致失败。

直接导出千万级数据,mysqldump 和 SELECT INTO OUTFILE 不是互斥选项,而是适用场景完全不同的两个工具:前者生成可重放的 SQL 语句,适合备份与迁移;后者直接写入文本文件,适合快速落盘 CSV。选错就卡在权限、路径或性能瓶颈上。
用 mysqldump 导出千万级数据时必须加的关键参数
默认不加参数跑 mysqldump,导出一张千万行的表极可能失败或拖慢整个库——它会一次性加载所有结果到内存,还默认加表锁。
-
--single-transaction:对 InnoDB 表启用一致性快照,避免锁表(但要求事务隔离级别为 REPEATABLE READ) -
--skip-extended-insert:每行一个INSERT,避免单条语句超max_allowed_packet;不过导入会变慢,权衡取舍 -
--quick(或-q):逐行获取结果,不缓存整张表,内存友好——这是千万级导出的必备项 -
--no-create-info:只导数据,跳过CREATE TABLE,避免结构干扰或冲突 -
--where="id BETWEEN 1000000 AND 2000000":配合分批导出,绕过单次内存压力(注意引号转义)
示例命令:mysqldump -u root -p --single-transaction --quick --no-create-info --skip-extended-insert mydb users --where="created_at >= '2025-01-01'" > users_2025.csv
SELECT INTO OUTFILE 导出 CSV 的硬性限制和绕过方法
这个语句快得离谱,但不是“能写 SQL 就能用”——它根本不在客户端执行,而是在 MySQL 服务端写文件,因此受三重硬约束:
- MySQL 用户必须有
FILE权限(GRANT FILE ON *.* TO 'user'@'%';) - 目标路径必须落在
secure_file_priv指定目录内(查法:SHOW VARIABLES LIKE 'secure_file_priv';) - 路径是服务器本地绝对路径,不是你本机路径;导出后需手动
scp或rsync拉回
常见报错:The MySQL server is running with the --secure-file-priv option —— 别改配置,直接用 SELECT ... INTO OUTFILE '/var/lib/mysql-files/export.csv'(以实际返回值为准)。
中文乱码?确保连接时执行:SET NAMES utf8mb4;,且表字段本身是 utf8mb4 字符集。
导出 CSV 但不想碰服务器磁盘?用 mysql 客户端重定向
当没 FILE 权限、secure_file_priv 为空或被禁用时,这是最稳的替代方案:命令在你本地执行,结果由客户端拼好再落地。
- 基础导出(制表符分隔):
mysql -u root -p -e "SELECT id,name,email FROM mydb.users WHERE status=1" mydb > users.csv - 转成逗号分隔:
mysql -u root -p -B -e "SELECT ..." mydb | sed 's/\t/,/g' > users.csv(-B启用批处理模式,字段对齐) - 带双引号和转义(更接近标准 CSV):
mysql -u root -p --csv -e "SELECT ..." mydb > users.csv(MySQL 5.7+ 支持--csv,自动处理引号与逗号)
注意:--csv 输出的字段含双引号,但空值输出为 NULL 字符串而非空,业务侧需兼容。
为什么千万级导出后导入很慢?先看清导出内容类型
很多人导出完发现导入奇慢,问题往往出在导出格式选择上:
- 用
mysqldump导出的.sql文件含大量INSERT语句 → 导入依赖 SQL 解析,无法并行,且受innodb_buffer_pool_size影响极大 - 用
SELECT INTO OUTFILE或mysql --csv导出的.csv→ 必须搭配LOAD DATA INFILE才能发挥速度优势;直接用INSERT循环插就是自找麻烦 - 大表导出时,
mysqldump默认开启--add-locks,会在 SQL 文件里加LOCK TABLES→ 若目标库无对应表或权限不足,导入直接报错
真正关键的不是“怎么导”,而是“导出来之后怎么用”。CSV 文件本身不带 schema,导入前必须确认目标表已存在、字段顺序一致、字符集匹配——这些细节漏掉一个,后续排查耗时远超导出本身。











