在Navicat同步前,需在「Select Objects」页通过右键取消全选后手动勾选、搜索关键词排除或使用Filter(支持*和?)批量排除表/视图;同步结构时须在Object Types页关闭无关对象类型,并在Compare Options中禁用依赖分析以防报错。
同步前如何在 Navicat 中过滤掉特定表或视图
navicat 的数据同步(data synchronization)和结构同步(structure synchronization)默认会扫描整个数据库,但实际中常需跳过日志表、临时表、测试用的 _bak 表等。关键不是“事后删”,而是在同步向导里提前排除——这一步必须在「选择要同步的对象」环节完成。
操作路径:启动同步向导 → 连接源与目标 → 到达「Select Objects」页面 → 左侧树形结构展开后,右键点击数据库名或 schema 节点,选「Uncheck All」,再手动勾选真正需要的表/视图/存储过程。这是最稳妥的起点,避免误同步。
- 不推荐直接勾选顶层数据库:一旦勾选,所有子对象默认全选,容易漏掉隐藏的系统表或中间表
- 若表名有规律(如都带
tmp_或log_),可先在左侧搜索框输入关键词快速定位,再逐个右键 → 「Exclude」 - 排除操作仅对本次同步生效;下次同步需重新设置,Navicat 不自动保存排除规则
用「Filter」功能按名称正则排除对象
当要排除的表数量多、命名有统一模式时,手动勾选效率低且易错。Filter 功能支持通配符和简单正则,是批量排除的核心手段。
在「Select Objects」页,点击右上角 Filter 按钮 → 勾选「Exclude objects matching the pattern」→ 输入排除模式。注意:Navicat 的 Filter 不支持完整正则,只认 *(任意字符)和 ?(单字符),例如:
- 排除所有备份表:
*_bak或*_backup - 排除测试库里的临时对象:
test_*(前提是这些表都在同一 schema 下) - 不能写
^tmp_.*$或\d+_\w+—— 会被忽略或报错
Filter 应用后,被匹配的对象会变灰且不可勾选,但不会从列表中消失。若误配导致关键表被灰掉,可清空 Filter 文本框并点「OK」重载列表。
同步结构时为何存储过程/函数仍被同步?检查「Object Types」选项卡
很多用户发现已排除表,但 PROCEDURE 或 FUNCTION 仍被同步过去——问题常出在「Object Types」未关闭对应类型。Navicat 同步是分维度的:表结构、数据、视图、函数、事件等各自独立开关。
在「Select Objects」页顶部,切换到 Object Types 标签页:
- 取消勾选不需要的类型,如
Stored Procedures、Functions、Events、Triggers - 即使某张表被排除,它的触发器(
Triggers)仍可能被同步,因为触发器属于独立对象类型 -
Indexes和Foreign Keys默认开启,若目标库已有约束或索引冲突,建议同步前取消勾选,后续单独处理
排除后仍报错:检查「Compare Options」里的隐式依赖
有时明明排除了 audit_log 表,同步却失败并提示「Unknown column 'created_at' in 'field list'」——这说明其他未排除的表(如 users)在视图或函数定义里引用了它,而 Navicat 在结构同步时会尝试解析依赖关系。
解决方法:进入「Compare Options」设置页(通常在「Select Objects」前一步),调整以下两项:
- 取消勾选
Compare dependent objects:禁用自动依赖分析,避免因引用已排除对象而中断 - 勾选
Ignore comments and whitespace in routines:防止函数体注释格式差异引发误判 - 若同步目标是低版本 MySQL,还需关掉
Compare definer clause,否则DEFINER=`admin`@`%`会导致语法错误
依赖检查是双刃剑:开得太严,排除失效;关得太松,可能漏掉真实冲突。线上环境建议先关掉做一次干净同步,再人工校验关键对象定义是否一致。


















