必须严格区分源库(基准)与目标库(待更新),通过「工具→结构同步」启动,确认左侧为目标库、右侧为源库,状态栏显示“将对[test_db]应用更改”即方向正确;过滤存储过程等对象,忽略注释、外键名、列序,显式设置mysql版本,禁用“删除目标中不存在的对象”,预览sql并导出后补充分号再执行。

要在Navicat中准确同步两个数据库结构,必须严格区分源库(含最新结构)与目标库(待更新),从「工具→结构同步」入口启动,跳过「数据同步」「备份」等无关功能,否则生成的脚本可能误删表或重建全量结构。
确认源库和目标库方向
右键你想更新的那个数据库(比如测试库test_db)→ 选择「结构同步」→ 弹窗中左侧自动填入该库,右侧手动选择基准库(比如开发库dev_db);【左侧是将被修改的目标库,右侧是作为比对基准的源库】。
顶部状态栏若显示“将对 [test_db] 应用以下更改”,说明方向正确;若显示反了,立刻关闭重开,不要点下一步。
这一步不能靠猜测——Navicat界面只写“数据库1”“数据库2”,不标“源/目标”,选错就等于让脚本把开发库当模板去覆盖生产库。
过滤无关对象并校验环境
在「对象选择」页,取消勾选Stored Procedures、Functions、Events、Triggers;这些对象定义易因注释/空格/换行触发虚假差异,且业务逻辑变更不应由结构同步驱动。
手动排除tmp_、log_、schema_migrations等临时表或迁移表,Navicat默认比对全部对象,一旦纳入可能生成报错语句或覆盖关键业务数据。
检查字符集与排序规则是否一致:若源库用utf8mb4_0900_as_cs,目标库用utf8mb4_unicode_ci,Navicat会标为“修改”并生成CONVERT语句,但该操作可能锁表,实际无需执行——点击差异项→切换到DDL比较标签,确认仅COLLATE不同后,右键该条目→「忽略此项」。
关键选项设置(三处必调)
方法一:进入「选项」页(不是「高级」页),勾选:
✔ 忽略对象定义中的注释
✔ 忽略外键名称
✔ 忽略列顺序
方法二:在「高级」页,将「MySQL 版本」显式设为当前目标库版本(如8.0+),否则生成的DEFAULT '0000-00-00'会在MySQL 8.0+报错Invalid default value。
【不勾选“删除目标中不存在的对象”】——除非你明确要清掉目标库的冗余表或索引,否则默认启用会导致DROP TABLE误执行。
预览并导出可执行SQL
第一步:点击「下一步」进入SQL预览页,逐条检查语句,重点盯:
• DROP COLUMN(字段丢失风险)
• ALTER TABLE ... MODIFY COLUMN(尤其是TEXT→MEDIUMTEXT等无业务依据的类型升级)
• SET FOREIGN_KEY_CHECKS=0(该语句可能让外键级联失效,建议手动删掉)
第二步:点击右上角「导出SQL文件」,打开导出的.sql文件,全局替换\n为;\n——Navicat导出内容默认无分号结尾,直接执行必报ERROR 1064。
第三步:若目标库数据量大,避免直接运行全量脚本;把ADD COLUMN NOT NULL这类高危语句拆出来,先加可空字段→UPDATE填值→再ALTER为NOT NULL。











