需在结构同步的「表过滤」页勾选「仅同步匹配以下模式的表」并填写业务表前缀(如user_%,order_%),Navicat 16不支持否定通配符或全局黑名单,系统表须手动添加到白名单中。
结构同步里怎么跳过 tmp_、log_ 这类表?
navicat 16 不会自动识别“临时表”语义,它只按表名字面匹配。你得手动告诉它哪些表不用比,否则 tmp_import_batch、log_operation_202505 这类表一旦被纳入,生成的 ddl 脚本可能误删或重建,甚至因权限不足直接报错中断。
操作路径是:打开「工具 → 结构同步」→ 选好源库和目标库 → 点右下角「选项」→ 切到「表过滤」页(不是「高级」或「比较设置」):
- 勾选「仅同步匹配以下模式的表」
- 在输入框里填类似
user_%、order_%这种业务主表前缀(用%,不是正则) - 如果要排除多类表,不建议写
NOT (tmp_% OR log_%)—— Navicat 不支持否定通配符,只能正向白名单 - 若必须保留部分临时表(比如
tmp_user_cache是长期缓存),就拆成两次比对:第一次用tmp_user_%单独比,第二次用其他前缀
为什么不能靠「忽略表名」列表来排除?
Navicat 16 的「结构同步」没有全局“黑名单”输入框。所谓「排除表」功能只存在于「数据对比」窗口的 Key Columns 设置旁,结构同步里压根没这入口。你如果在「比较设置」页看到「忽略对象」选项,那只是针对视图、存储过程等非表对象,对表名无效。
常见错误是:在「比较设置」里勾了「忽略视图」,以为顺带也跳过了 tmp_* 表——结果它们全被扫进去了,脚本里冒出一堆 DROP TABLE IF EXISTS tmp_xxx。
云数据库上排除临时表还有个隐藏坑
阿里云 RDS、腾讯云 CDB 等托管服务默认会注入系统表,如 rds_slow_log、mysql_innodb_cluster_metadata。这些表名不带 tmp 或 log,但同样不该参与业务结构比对。
解决办法只有两个:
- 在「表过滤」里显式加上已知系统表名,用英文逗号分隔,例如:
user_%,order_%,rds_slow_log,mysql_innodb_cluster_metadata - 更稳妥的是先连上目标库,执行
SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_db' AND table_name NOT LIKE 'tmp%' AND table_name NOT LIKE 'log%' AND table_name NOT LIKE 'rds%';,把结果复制出来,粘贴进「仅同步匹配以下模式的表」框中(注意把换行换成英文逗号)
别指望 Navicat 自动区分“临时”语义;它只认名字,不认用途。漏掉一个 backup_config_old 可能导致生产环境被 DROP,这种事没法回滚。


















