“PROD → DEV”方向不能点Run,因Navicat将生产库设为源、开发库为目标时会生成DROP语句删除开发库中独有的测试表、临时字段等;必须关闭“Drop objects not exist in source”和“Compare auto-increment value”选项,仅保存SQL人工审核后执行。
结构同步时为什么“PROD → DEV”方向不能点 Run
navicat 的结构同步不区分“上线”和“下放”,只认左右面板的「源」和「目标」。当你把生产库设为源、开发库设为目标,它默认认为目标应完全收敛到源——于是生成 drop table、drop column 语句去删开发库里没有的对象。而开发库本就该比生产库多测试表、临时字段、调试索引,这些全会被清空。
常见错误现象包括:
- 执行后本地
dev_user_log表消失,导致单元测试批量失败 - 开发库中手动添加的
is_debug TINYINT DEFAULT 0字段被删,应用启动报错列不存在 - 同步中途因权限不足卡住,部分
ALTER TABLE已生效、部分未执行,环境进入半残状态
必须关闭的两个高危选项
在结构同步向导的「Compare options」页,这两项不取消,等于主动交出删库权限:
-
Drop objects not exist in source:勾选即允许删表/删列/删索引,生产环境严禁启用 -
Compare auto-increment value:勾选会导致目标库主键自增值被重置,后续插入可能触发重复主键冲突
其他可酌情关闭的选项:Compare comments(注释差异常误报)、Compare collation(字符集校对规则不一致易致语法错误)。
正确交付流程:只生成 SQL,不自动执行
目标不是让 Navicat 去改库,而是让它帮你生成一份可审计、可复现的结构快照。操作要点如下:
- 左面板选
PROD_MySQL_OrderDB(源),右面板选DEV_MySQL_OrderDB(目标) - 点「比较」后,**绝不点「Run」**,直接点「Save as SQL File」,保存为
prod_struct_20260727.sql - 交付前人工过滤:删除所有
DROP和RENAME语句,补全NOT NULL字段的默认值(Navicat 不自动加),核对CHARSET和实际字段长度是否匹配 - 开发团队收到后,只提取
CREATE TABLE或ALTER TABLE ... ADD COLUMN类语句,在本地测试库验证通过再应用
同步前必须确认的三件事
跳过这三步,生成的 SQL 很可能根本跑不通:
- 源库与目标库 MySQL 版本兼容(如
JSON字段不能从 8.0 同步到 5.6) - 连接用户在目标库具备
ALTER、CREATE权限(仅SELECT权限会静默跳过变更) - 目标库中是否存在同名但已被手动修改过的表(Navicat 不提示冲突,直接按差异覆盖)
最容易被忽略的是最后一点:一张叫 audit_log 的表,生产库是规范建模,开发库却被人加了 tenant_id 字段用于多租户测试——结构同步若不人工干预,这个字段就会被删掉。











