--ignore-table必须写成--ignore-table=数据库名.表名格式才生效,漏库名、大小写错误、逗号分隔或反斜杠均静默失效;排除多表需重复该参数;表名区分大小写;导出少量表时建议用--tables显式指定。

mysqldump 里 --ignore-table 怎么写才不静默失效
直接写 --ignore-table=dbname.tablename 是唯一生效格式,漏掉库名、大小写错、用反斜杠或逗号分隔都会让 mysqldump 完全不报错,但该表照常导出。
-
--ignore-table=users(缺库名)→ 失效 -
--ignore-table=dbname\users(Windows 路径式)→ 失效 -
--ignore-table=dbname.users,dbname.logs(逗号分隔)→ 语法错误或被当做一个表名处理 - 正确写法:
--ignore-table=app_db.audit_log、--ignore-table=app_db.tmp_cache,重复多次参数 - Linux 下表名区分大小写,
app_db.AUDIT_LOG≠app_db.audit_log,后者才可能匹配成功
只导出几个表,别靠 --ignore-table 硬排除
如果要导出的表少(比如就 3 张),显式列举比排除几十张更可靠、更易验证。
- 必须加
--tables参数,且紧接在数据库名后:mysqldump -u root -p mydb --tables users orders logs > partial.sql - 表名之间用空格分隔,不能用逗号;含短横线等特殊字符时,需用反引号包裹:
--tables `user-profile` `api-log` - 不加
--tables,命令会被解析成 “备份数据库 + 把后续字符串当额外参数”,大概率报错或导出失败 - 该方式默认包含建表语句和数据,不带
DROP TABLE,除非你额外加--add-drop-table
想跳过整个库?别用 --ignore-table
--ignore-table 只认 “库.表” 粒度,不支持忽略整库。误用会导致系统库(如 mysql、information_schema)被一并导出,恢复时可能覆盖权限表,导致新实例无法登录。
- 稳妥做法:用
--databases显式列出业务库:mysqldump -u root -p --databases app_db order_db payment_db > prod.sql - 旧版本 MySQL(--ignore-database,强行用
--all-databases配合该参数会失败 - 即使用了
--ignore-database=mysql(5.7.12+),也要注意它对GRANT语句无效——权限语句仍会出现在 dump 文件末尾 - 若需彻底清理权限,得额外加
--skip-triggers --skip-routines --skip-events,并人工检查 dump 文件结尾的GRANT块
复制过滤时 replicate-do-db 为什么总“漏同步”
因为 replicate-do-db 不是按 SQL 操作的目标库匹配,而是看当前会话是否执行过 USE db_name。跨库语句(如 INSERT INTO log_db.audit_log)在 USE app_db 下执行,就会被忽略规则放行。
- ORM 或应用代码常用显式库名语法(
db1.table1),天然绕过replicate-do-db的 USE 匹配逻辑 - 混用
replicate-do-db和replicate-ignore-db会导致优先级混乱,MySQL 不保证执行顺序 - GTID 模式下,修改
replicate-do-db必须重启从库,SET GLOBAL会报错:Variable 'replicate_do_db' is a read only variable - 更稳的选择是
replicate-wild-do-table=app_db.%或replicate-do-table=app_db.users,它们基于事件元数据中的真实库表名匹配,不受 USE 上下文影响
--ignore-table 看似生效,GRANT 语句仍可能把已删表的权限带到目标库;而复制过滤若依赖 replicate-do-db,只要应用层写了 INSERT INTO other_db.t,规则就形同虚设。











