mysqldump 条件导出是什么
--where 给 mysqldump 的导出加上 WHERE 行过滤,语法与 SELECT 的 WHERE 完全一致,等于「只把符合条件的行写进导出文件」。备份归档、给测试或业务方导一份子集数据、按时间窗导出增量,都靠这个参数。要注意它的作用范围是本次导出列表里的每一张表,条件里用到的列必须在这些表上都存在。
基本信息
| 适用版本 | mysqldump 全系列(MySQL 5.7 / 8.0 客户端) |
|---|---|
| 语法 | mysqldump 库 表 --where="条件"(也可写 -w) |
| 作用范围 | 对本次导出的每张表逐表套用同一条件 |
| 引号规则 | shell 外层双引号、SQL 内层单引号 |
| 常用搭配 | --no-create-info、--skip-triggers、--single-transaction、--complete-insert |
| 注意 | 条件列不存在时直接报 Unknown column 并中断导出 |
典型使用场景
- 按时间窗导出增量数据,交给离线分析或审计归档
- 给测试环境导一份脱敏子集,避免全量拉生产数据
- 导出订单、日志等大表的一个分片区间用于问题复现
- 按状态导出未处理任务,做数据迁移前的核查
- 配合 --no-create-info 只导数据,恢复到已存在结构的表中
按时间窗导出
按时间窗导出
# 只导数据不导结构,跳过触发器,条件用单引号
mysqldump -uroot -p --no-create-info --skip-triggers \
appdb orders --where="created_at >= '2026-01-01' AND created_at < '2026-10-01'" \
> orders_q3.sql
# 单表按主键区间导出,便于分批处理
mysqldump -uroot -p --single-transaction appdb orders \
--where="id >= 1000000 AND id < 2000000" > orders_range.sql
# 只取需要的列会改变导出结构,慎用;核对结果行数
wc -l orders_q3.sql常用配套参数
| 参数 | 作用 | 使用提示 |
|---|---|---|
| --no-create-info | 只导数据不导建表语句 | 恢复到已有结构时使用,避免覆盖表定义 |
| --skip-triggers | 不导出触发器 | 子集数据常不需要触发器 |
| --single-transaction | 一致性快照导出 InnoDB | 配合条件导出减少对线上影响 |
| --complete-insert | 带上列名的 INSERT | 目标表列顺序有差异时更安全 |
| --skip-extended-insert | 每行一条 INSERT | 便于人工增删行,但文件更大 |
多表一起导出时同一个 WHERE 会逐表执行:条件里引用的列必须每一张目标表都有,否则报 Unknown column 直接中断;跨表条件导出建议一次只针对一张表,或分别导出后合并。
条件导出依然要按条件扫描表:没有可用索引时等于全表扫描,对大表执行前先 EXPLAIN 验证能否走索引,并选在低峰窗口操作。