必须取消勾选“Run synchronisation immediately”才能禁用自动执行并导出SQL脚本;该选项位于同步向导“设置同步选项”页,取消后进入预览页,再点击Export SQL按钮即可导出可审查、可版本控制的DDL脚本。

Navicat结构同步时如何禁用自动执行,只导出SQL
Navicat 的「结构同步」默认会直接执行差异操作,但你真正需要的只是生成可审查、可版本控制的 CREATE TABLE / ALTER TABLE 脚本。关键在于关闭「自动运行」开关,并手动触发导出 —— 这个选项藏在同步向导最后一步,不是设置里。
- 启动结构同步后,在「选择要同步的对象」页面勾选目标表,点击「下一步」
- 进入「设置同步选项」页,**务必取消勾选
Run synchronisation immediately(立即运行同步)** —— 这是唯一能阻止自动执行的开关 - 点击「下一步」后,界面不再跳转执行,而是显示「预览」页,左侧为源结构,右侧为目标结构,中间列出所有差异操作
- 此时点击工具栏的
Export SQL按钮(图标为一张纸加箭头),即可保存纯 DDL 脚本
导出的SQL脚本里为什么有DROP语句?能去掉吗
Navicat 默认生成的脚本包含 DROP TABLE IF EXISTS 和重建逻辑,这是「全量结构覆盖」模式的体现。它不区分「增量修改」和「重置重建」,只要目标表存在且结构不一致,就倾向走 DROP + CREATE 路径。
- 若你只想生成
ALTER TABLE类变更(比如只加字段、改类型),需提前确保目标库中该表**结构基本一致**,且 Navicat 能识别出「最小变更路径」 - 没有全局开关能强制只输出 ALTER;但可通过「预览」页手动删掉不需要的
DROP行,再导出 —— 导出按钮支持对预览内容二次编辑 - 注意:如果源表有自增主键、外键或索引,而目标表缺失对应定义,Navicat 仍可能生成 DROP,因为它认为「重建更安全」
导出的SQL在MySQL 8.0+执行报错:Unknown system variable 'sql_log_bin'
这是 Navicat 在导出脚本时自动插入了 MySQL 主从控制语句,常见于使用 root 或高权限账号连接时。脚本开头会出现类似 SET sql_log_bin = 0; 的行,但在某些托管环境(如阿里云 RDS、腾讯云 CVM MySQL)或低权限账号下,该变量不可写,导致整个脚本失败。
- 打开导出的 SQL 文件,手动删除所有含
sql_log_bin的SET行(通常在文件最顶部) - 如果后续还要复用该脚本做自动化部署,建议在执行前统一加判断:
SET @sql_log_bin_saved = @@sql_log_bin; SET sql_log_bin = 0;→ 执行完再恢复,但需确认账号有权限 - 更稳妥的做法:用普通开发账号连接 Navicat(无 SUPER 权限),Navicat 就不会注入
sql_log_bin相关语句
同步预览里显示「No differences found」但实际结构有差异
这通常不是 Navicat 坏了,而是它比对的维度有限 —— 它默认忽略注释、字符集排序规则(collation)、部分引擎参数(如 ROW_FORMAT)、以及 JSON 字段的 CHECK 约束等。这些「非核心结构」差异不会触发同步提示,但可能影响兼容性。
- 检查「同步选项」页中的
Compare options(比较选项)按钮,勾选Compare comments、Compare collations、Compare row format等细粒度项 - MySQL 8.0+ 的隐藏列(如
INVISIBLE)、函数索引、全文索引的解析支持依赖 Navicat 版本;v16 及以上对 8.0 支持较好,v15 可能完全忽略函数索引差异 - 如果用了
utf8mb4_0900_as_cs这类新 collation,旧版 Navicat 可能识别为「未知」而跳过比对 —— 升级客户端是最直接解法
导出脚本本身不解决逻辑一致性问题,比如外键引用的表是否已存在、触发器是否被禁用、视图定义是否依赖临时表——这些得靠人工核对,Navicat 不会帮你验证 SQL 是否能在目标库真正跑通。


















