mysqldump的--ignore-table必须写全“数据库名.表名”,大小写敏感,排除多个表需重复参数;逗号分隔、漏库名或格式错误均静默失效,且不跳过依赖对象。

mysqldump 用 --ignore-table 排除单个表
直接生效,但必须写全库名和表名,格式是 数据库名.表名。漏掉库名会静默失效,备份里照样包含该表,还不报错。
- 正确写法:
mysqldump -u root -p mydb --ignore-table=mydb.log_table > backup.sql - 错误写法:
--ignore-table=log_table或--ignore-table=mydb.log_table,mydb.audit_log(逗号分隔不支持) - 大小写敏感:如果表名在 MySQL 中是大写(比如启用了
lower_case_table_names=0),--ignore-table也得严格匹配大小写
排除多个表要重复写多次 --ignore-table
不能用逗号或通配符,每个表都得单独一个参数。脚本里拼接时容易漏空格或写错顺序,导致部分表没被忽略。
- 正确写法:
mysqldump -u root -p mydb --ignore-table=mydb.tmp1 --ignore-table=mydb.tmp2 --ignore-table=mydb.archive_2023 > backup.sql - 常见翻车点:复制粘贴时多加了换行或中文空格,bash 报
unknown option;或者把--ignore-table放在mydb后面但没加空格,变成mydb--ignore-table=... - 注意顺序:参数位置有影响,
--ignore-table必须放在数据库名之后、输出重定向之前
排除的表仍可能被触发器或外键依赖间接导出
--ignore-table 只跳过数据和建表语句,但不会删掉其他表中指向它的外键定义,也不会跳过依赖它的触发器或视图。如果目标库开启了 FOREIGN_KEY_CHECKS,还原时可能失败。
- 触发器里引用了被忽略的表?备份里仍会导出触发器,还原时报
Table 'mydb.log_table' doesn't exist - 视图基于被忽略的表?视图定义仍存在,但查询会报错
- 稳妥做法:先查清依赖关系,必要时手动删掉相关触发器/视图定义,或用
--skip-triggers配合使用
替代方案:用 --tables 显式指定要备份的表
当要排除的表很多时,列出要保留的反而更可靠。缺点是得先查一遍表名,且表结构变更后容易漏同步。
- 生成白名单命令示例:
mysql -Nse "SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='mydb' AND table_name NOT IN ('tmp1','tmp2')",再拼进mysqldump ... --tables 表名列表 - 注意
GROUP_CONCAT默认长度限制是 1024,表太多会截断,需临时调大:SET SESSION group_concat_max_len = 1000000 - 这个方式绕过了
--ignore-table的大小写和格式陷阱,但无法跳过information_schema或系统表(它们本来就不会被mysqldump备份)
--ignore-table 时,最容易卡在大小写和库名拼写上——它不报错,只默默失效。建议备份前先用 --dry-run(MySQL 8.0.21+)或小范围测试,确认目标表确实没出现在输出里。











