mysqldump支持--where参数导出单表部分数据,但仅限mysql 5.7+、必须显式指定库名和表名,条件需用引号包裹且不支持join/子查询/now()等。

用 mysqldump 加条件导出部分行
直接用 mysqldump 配合 --where 参数是最常用也最稳妥的方式。它本质是生成带 WHERE 条件的 SELECT 语句,再导出结果,不依赖临时表或额外权限(只要对目标表有 SELECT 权限即可)。
常见错误是把 --where 的值写成 SQL 片段但漏掉引号,导致 shell 解析失败或条件被截断。例如 --where="id 必须加双引号,单引号在某些 shell 下可能失效。
mysqldump -u root -p database_name table_name --where="status='active' AND created_at >= '2024-01-01'" > data.sql- 条件中字段名、字符串值、日期格式必须符合 MySQL 语法;日期建议用单引号包裹,避免 shell 展开
- 如果条件含空格或特殊字符(如
LIKE '%abc%'),务必整体用双引号包住整个--where值 - 导出的是 INSERT 语句,默认不含 DROP/CREATE 表结构;如需结构,加
--no-create-info反而会去掉建表语句(默认是带的),按需取舍
用 SELECT ... INTO OUTFILE 导出为文本文件
这种方式导出的是纯文本(如 CSV),不带 SQL 语法,适合给其他系统做数据交换。但它要求 MySQL 服务端有写入指定路径的权限,且客户端不能直接控制输出位置——文件写在数据库服务器本地,不是你的本机。
容易踩的坑是忽略 secure_file_priv 限制:MySQL 默认只允许写入特定目录(查 SHOW VARIABLES LIKE 'secure_file_priv';),强行指定其他路径会报错 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option...。
- 先确认可写路径:
SELECT @@secure_file_priv; - 执行导出:
SELECT * FROM table_name WHERE status = 'pending' INTO OUTFILE '/var/lib/mysql-files/export.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; -
FIELDS TERMINATED BY和LINES TERMINATED BY决定分隔符,注意 Windows 换行用\r\n,Linux 用\n - 导出后需手动从服务器下载该文件,不能跳过这一步
避免用 mysql 命令 + 重定向拼 SQL 导出
有人会写 mysql -e "SELECT ... FROM ..." > output.txt,看起来简单,但实际问题很多:中文乱码(没设 charset)、字段对齐错乱、NULL 显示为 NUL 或空、无字段名头、浮点数精度丢失。它适合快速看一眼,不适合做可靠的数据导出。
真正要落地使用,必须显式加参数控制格式:
- 强制 UTF-8:
mysql --default-character-set=utf8mb4 -e "SELECT ..." - 禁用表格格式,用 tab 分隔:
mysql -B -e "SELECT ..."(-B是批处理模式) - 加上列名头:
mysql -B -e "SELECT ..."默认带,但-N会去掉,别误加 - 注意
-B输出的 NULL 是\N,不是空字符串,下游解析时得适配
WHERE 条件里时间字段要注意时区和类型
导出涉及时间范围时,created_at > '2024-01-01' 看似没问题,但实际可能漏数据:如果字段是 DATETIME 类型,且你没写具体时分秒,MySQL 会自动补成 '2024-01-01 00:00:00';如果是 TIMESTAMP,还受当前 session 时区影响(SELECT @@time_zone; 可查)。
- 保险做法是写全时间:
created_at >= '2024-01-01 00:00:00' AND created_at - 或者用函数规避隐式转换:
DATE(created_at) >= '2024-01-01',但注意这会让索引失效,大数据量慎用 - 导出前先用
SELECT COUNT(*)验证条件是否命中预期行数,比盲目导出后再检查更省事
真正麻烦的不是命令怎么写,而是 WHERE 条件是否精确覆盖业务意图、导出文件编码是否与下游系统一致、以及 secure_file_priv 这类服务端限制是否提前确认清楚。这三个点漏一个,就可能卡在最后一分钟。











