首页/数据/数据库速查/mysqldump 条件导出(--where 按行过滤)
备份与恢复56 条

mysqldump 条件导出(--where 按行过滤)

用 --where 给导出加 WHERE 条件:按时间范围导出增量、给业务方导出子集数据都靠它,语法与 SELECT 的 WHERE 完全一致。

数据库速查数据更新于 2026-10-13

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 验证能否走索引,并选在低峰窗口操作。

易错点

  • shell 引号嵌套写反:外层用单引号、内层用双引号,命令会被 shell 先解析,报语法错误或把条件截断
  • 多表导出时用只在一张表存在的列做条件:导出中途报 Unknown column,前半段已写出的文件不完整
  • 拿条件导出当成「增量备份」长期使用:跨表一致性没有保证,恢复时数据会出现断裂
  • 只导数据不导结构却恢复到结构不同的表:列顺序不一致导致数据错位,必须配 --complete-insert
  • 忘记核对导出行数:条件写错(如日期边界用 <=)会静默少导或多导数据,事后才发现缺行

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump --where

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌