在Navicat结构比对中应优先使用「对象过滤」设置排除规则(如mysql.、information_schema.等),而非手动取消勾选,因其可复用、防遗漏;需注意匹配完整对象名、关闭默认开启的“同步不存在的对象”选项以确保生效。
直接在「对象过滤」里加排除规则,比手动取消勾选可靠得多,且能复用、防遗漏。
在比对窗口的对象过滤中配置排除模式
Navicat 的结构比对默认会把 mysql、information_schema、performance_schema、sys 这些系统库里的表也拉进来比——但它们不该参与业务同步。关键不是等比对完再点掉,而是在比对前就屏蔽。
- 打开结构同步向导 → 选择源/目标库后,点击左下角「选项」→ 切换到「对象过滤」标签页
- 在「排除对象」区域点击「添加」,输入完整匹配模式:
mysql.*、information_schema.*、%.%_log、%.%_history - 注意:
.是字面量,*才是通配符;%_log不生效,必须写成.%_log(因为完整对象名是db_name.table_name) - Navicat 15+ 支持
regex:pattern前缀,旧版只认*和?,别混用
为什么手动取消勾选容易出问题
比对界面左侧展开所有表后,靠眼睛找并逐个取消勾选,看似简单,实则高危:
- 漏掉伪装日志表:比如
user_operation_record、audit_trail、sync_log_detail,名字不带log却承担日志功能 - 下次比对又要重来,不可复用;自动化场景(如 CLI 或定时任务)根本没法点
- 即使取消了某张表,若同步设置中开启了「同步不存在的对象」(该选项默认开启),Navicat 仍可能重建它
- Ctrl+F 搜索关键词
log、record、temp、_bak、__migrations是补救手段,但属于被动防御
确认排除是否真正生效
排除规则设完不代表万事大吉,得验证它有没有被 Navicat 正确解析:
- 比对完成后,检查差异列表顶部是否还有来自
mysql.user或sys.schema_table_statistics的条目;有就是没拦住 - 右键某条疑似被排除的表 → 「查看同步语句」,看生成的 SQL 是否为空或跳过
- 如果用了正则但没加锚点(如只写
log),它会匹配catalog、blog_post等所有含 log 的表名 - 大小写敏感开启时,
USER_*不会匹配user_profile;MySQL 默认不区分,但连接参数或lower_case_table_names设置可能改变行为
最易被忽略的是:排除规则匹配的是「完整对象名」,不是单独表名;且「同步不存在的对象」这个默认开启的开关,会让所有过滤努力白费——关掉它,才是让排除真正落地的最后一环。


















