结构同步前必须确认三件事:MySQL版本兼容性、目标库用户权限、目标库是否存在同名但已手动修改的表;Options中必须关闭Drop objects not exist in source等高危开关;比对后须手动取消所有DROP类及类型变更操作的勾选,并审阅生成SQL。
结构同步前必须确认的三件事
navicat 结构同步本质是生成并执行 ddl 脚本,不是“智能覆盖”,而是按差异项逐条执行 alter、drop、create。一旦勾选了高危操作,它真会删表——不打招呼,也不备份。
动手前务必核对:
-
MySQL版本兼容性:比如源库用JSON类型(5.7+),目标库是 5.6,同步直接报错 - 目标库用户权限:必须有
ALTER、CREATE、DROP;只给SELECT和INSERT时,Navicat 会静默跳过变更,你以为同步成功了,其实字段根本没加 - 目标库是否存在同名但已手动修改的表:Navicat 不识别“DBA 上周加的索引”,默认按差异部署,可能把生产环境的关键索引一并删掉
Options 里哪些开关必须关掉
Navicat 的同步选项不是装饰,几个关键开关直接决定会不会删表。默认全开=主动邀请风险。
必须取消勾选:
-
Drop objects not exist in source:这是“允许删表/删列/删索引”的总开关。只要勾了,哪怕源库只是删了一个测试字段,它也会在生产库执行DROP COLUMN -
Drop tables if they exist:同步时若勾选此项,Navicat 默认走DROP TABLE+CREATE TABLE流程,外键引用下直接报错Cannot truncate a table referenced in a foreign key constraint -
Compare auto-increment value:自增 ID 是运行时状态,不是结构定义;同步它会导致目标库主键重置,后续插入撞Duplicate entry
其他如 Compare comments 或 Compare collation,跨版本或跨引擎时易触发语法报错,建议先关,确认无误再开。
比对后“勾选”环节才是安全临界点
很多人点完“对比”就直接点“部署”,但真正决定删不删表的,是中间那个勾选列表——它就是你的操作确认单。
点击“对比”后,Navicat 列出所有差异项,默认全选。你必须手动取消勾选:
- 所有带
DROP前缀的行:DROP COLUMN、DROP INDEX、DROP TABLE - 类型变更类操作,如
MODIFY COLUMN xxx INT → BIGINT:旧版 MySQL 可能隐式锁表,且若字段含空值,NOT NULL强制约束会直接失败
点“部署”后别急着点“运行”,先看生成的 SQL 脚本——重点扫一眼有没有 DROP、TRUNCATE、RENAME TO 这类不可逆语句。哪怕只有一行,也得停下来重审。
为什么不能跳过结构同步直接 dump 导入
有人图省事,用 mysqldump --no-data 导出结构再导入,看似一样,实则是重建而非同步。
问题在于:
- 它会丢掉目标库已有的数据、索引统计信息、分区定义、存储过程依赖关系
- 如果目标库有
TRIGGER或VIEW依赖原表,DROP TABLE后这些对象直接失效,且 Navicat 不会帮你重建 - 字符集和排序规则可能被强制覆盖,比如把
utf8mb4_0900_as_cs强行改成utf8mb4_general_ci,导致排序行为突变
结构同步的“差异部署”逻辑虽复杂,但它是唯一能保留生产库已有状态、只动该动的部分的方式。想省事,反而最不省事。











