Navicat结构同步必须用“对象过滤”预设排除规则,因其在同步前生效、支持通配符且配置可复用;高级选项仅控制元数据比对粒度,无法跳过整表;排除后仍生成CREATE TABLE需关闭“同步不存在的对象”。

结构同步前必须用“对象过滤”预设排除规则
Navicat 的结构同步不支持在比对完成后靠手动勾选来批量跳过带前缀的表——那是临时操作,无法复用,也容易漏。真正能自动忽略 log_%、tmp_%、_audit 这类表的,只有「对象过滤」功能,它在同步流程启动前就生效,且支持通配符。
操作路径很固定:启动结构同步向导 → 点左下角「选项」→ 切到「对象过滤」标签页 → 在「排除对象」区域点「添加」→ 输入匹配模式。
-
%.%_log:匹配所有库中以_log结尾的表(注意.是字面量,%才是通配符) -
myapp.tmp_%:精确匹配myapp库下所有tmp_开头的表 -
regex:^cms\.(audit|sync)_:Navicat 15+ 支持正则,但旧版本会直接忽略该行,别混用
输完必须点「确定」保存,否则配置不生效。这个设置会记入当前同步任务的配置文件,下次双击重用时依然有效。
为什么“高级选项”里的过滤开关不管用
很多人在「高级选项」里反复翻找「排除表名包含 _log 的」这类开关,结果发现根本没有。这是因为 Navicat 的「高级选项」只控制元数据粒度,比如是否比对注释、是否比对外键、是否忽略大小写——它们影响的是“怎么比”,而不是“比哪些对象”。
试图用这些开关来跳过整张表,等于拿螺丝刀削苹果:方向错了。
- 勾选
Compare comments不会影响log_user_action是否参与比对 - 关闭
Compare foreign keys只是不校验外键定义,不会让tmp_report消失在 Source Objects 树里 - 数据库连接时限制权限(如只给 SELECT),会导致 Navicat 读不到表信息,报
Access denied for table xxx而不是静默跳过
排除后仍生成 CREATE TABLE?检查这个隐式开关
即使你在对象过滤里加了 %.%_history,部署时还是看到 CREATE TABLE `myapp.user_history` 出现在 SQL 预览里,大概率是因为「同步不存在的对象」这个默认开启的选项在捣鬼。
它的工作逻辑是:只要目标库没有这张表,不管源库是否被过滤,Navicat 都会尝试重建——相当于把你的排除规则绕过去了。
- 必须进入同步设置 → 「部署选项」→ 关闭「同步不存在的对象」
- 如果目标库已存在该表,但结构有差异,而你又想彻底跳过它,仅靠对象过滤还不够;得额外确认该表没被其他表的外键引用,否则
Compare foreign keys可能间接触发它的字段定义生成 - 验证是否真跳过:导出 SQL 文件后,用文本编辑器全局搜索
CREATE TABLE `user_history`或ALTER TABLE `user_history`
对象过滤不生效的三个典型卡点
输入 %.%_log 却没效果,不是语法错,而是环境或权限层面出了问题。
- 对象过滤只在「结构同步」和「数据同步」向导中生效,在「备份」或「导入」功能里完全不可见
- 源库连接用户缺少对
information_schema.tables的 SELECT 权限,Navicat 根本列不出表,自然没法按规则过滤 - MySQL 启用了
lower_case_table_names=0(Linux 默认),而你输的是%.%_LOG,但实际表名是user_log,大小写不匹配导致规则失效
最稳妥的做法:先用 SHOW TABLES LIKE '%_log' 在源库确认真实表名和大小写,再照抄进对象过滤框,避免任何猜测。


















