整库迁移排除历史大表须在导出阶段用mysqldump --ignore-table=库名.表名过滤,每表单独写参数、大小写敏感、不支持通配符;navicat需用对象过滤并关闭“同步不存在的对象”;动态生成命令可查information_schema拼接;排除后--single-transaction仍受被排除表ddl锁影响。

整库迁移时排除指定历史大表,核心是别让它们进 dump 文件——不是靠导入时跳过,而是导出阶段就过滤掉。
mysqldump 命令行必须重复写 --ignore-table
一个 --ignore-table 只能排除一张表,且必须带完整库名和表名,大小写敏感,不支持通配符。比如要跳过 myapp.log_operation 和 myapp.tmp_user_import:
mysqldump -u root -p myapp \ --ignore-table=myapp.log_operation \ --ignore-table=myapp.tmp_user_import \ --single-transaction \ --skip-add-locks > clean_dump.sql
常见错误:
-
--ignore-table=log_operation(漏库名,无效) -
--ignore-table=myapp.log_%(通配符不被识别,直接忽略该参数) -
--ignore-table=myapp.a,myapp.b(逗号分隔非法,只生效第一个)
Navicat 排除要用「对象过滤」而非手动取消勾选
手动在备份向导里取消勾选表,表面看起来跳过了,但只要「同步不存在的对象」开关开着,还原时仍会重建这些表——等于白设。真正可靠的路径是:
- 备份/同步向导 → 左下角「选项」→ 「对象过滤」标签页
- 在「排除对象」点「添加」,填模式:
myapp.log_operation、myapp.tmp_%、%.%_history(注意.是字面量,%才是通配) - 务必关闭「同步不存在的对象」(默认开启,危害最大)
- 右键同步日志 → 「查看同步语句」,确认生成的 SQL 里没有对应表的
CREATE TABLE或INSERT
大表太多时,优先用表名列表动态过滤
上百张表里有十几个历史大表,一个个写 --ignore-table 容易漏。更稳的做法是先查出所有要排除的表名,再拼成命令:
mysql -Nse "SELECT CONCAT('--ignore-table=', table_schema, '.', table_name)
FROM information_schema.tables
WHERE table_schema='myapp'
AND (table_name LIKE 'log%' OR table_name LIKE 'tmp%' OR table_name REGEXP '_history|_archive')" \
| xargs mysqldump -u root -p myapp --single-transaction > clean_dump.sql
注意:xargs 对空格和特殊字符敏感,如果表名含破折号或括号,建议改用 while 循环 + printf %q 转义。
最容易被忽略的一点:排除大表后,--single-transaction 的一致性快照仍会覆盖全库,只是不导出数据;但如果被排除的表本身锁了 DDL(比如正在 ALTER),整个 mysqldump 仍可能卡住。所以排除前,最好确认这些表近期没结构变更操作。











