不能直接用Navicat结构同步将生产库当源、开发库当目标自动执行,因默认勾选“Drop objects not exist in source”会清空开发库表结构;必须取消该选项,仅生成SQL文件供人工审查后离线交付,并过滤DROP/RENAME语句、补全NOT NULL默认值、核对字符集与实际数据长度。
不能直接用 navicat 的“结构同步”把生产库当源、开发库当目标来“同步给开发团队”——这不是功能限制,而是安全红线。 这个操作在技术上可行,但一旦误点「run」或跳过校验,就会清空开发库所有表结构(包括 drop table),导致本地开发环境瞬间不可用。真正安全的做法是:只生成脚本、只人工审查、只离线交付。
为什么“PROD → DEV”方向必须禁用自动执行
Navicat 不区分“上线”和“下放”,它只认左右面板的「源」和「目标」。当你把生产库设为源、开发库设为目标时,比对出的差异(比如生产库多了一张 audit_log 表)会默认生成 DROP TABLE 语句去删开发库里没有的表——而开发库本来就不该有这张表,删了反而破坏环境一致性。
- Navicat 默认勾选
Drop objects not exist in source,这是为“收敛结构”设计的,不是为“下放结构” - 开发库通常含测试数据、临时字段、调试索引,这些在生产库不存在,会被一并删除
- 一旦执行失败(如权限不足、锁表),部分语句已生效,开发环境进入半残状态,恢复成本远高于重装
正确做法:用“结构同步”生成只读交付物
目标不是让 Navicat 去改开发库,而是让它帮你生成一份可审计、可复现、可分发的结构快照。
- 打开结构同步向导,左面板选
PROD_MySQL_OrderDB(源),右面板选DEV_MySQL_OrderDB(目标) - 在「Compare options」页,务必取消勾选
Drop objects not exist in source和Ignore auto-increment value - 点击「比较」后,不点「Run」,直接点「Save as SQL File」,保存为
prod_struct_20260604.sql - 把该文件发给开发团队,并附带说明:此脚本仅用于参考,严禁直接执行;如需更新本地结构,请手动提取 CREATE/ALTER 语句,在本地测试库验证后再应用
开发团队拿到脚本后该怎么用
脚本本身不是银弹,它只是起点。开发人员必须做三件事才能安全落地:
- 用文本编辑器打开
prod_struct_20260604.sql,过滤掉所有DROP、RENAME、TRUNCATE相关语句——这些在开发环境毫无意义且危险 - 重点关注
CREATE TABLE和ALTER TABLE ... ADD COLUMN,检查是否含NOT NULL但无DEFAULT;若有,必须补上默认值,否则本地 MySQL 8.0+ 会拒绝执行 - 对新增字段,运行
SELECT MAX(CHAR_LENGTH(column_name)) FROM table_name确认现有测试数据长度,避免 VARCHAR 收缩导致本地插入失败
最常被忽略的一点:Navicat 生成的脚本不包含字符集与排序规则的显式声明,比如 COLLATE utf8mb4_0900_as_cs。开发团队若直接套用,可能让本地表用错 utf8 导致中文乱码。安全做法是,对关键表,先在生产库执行 SHOW CREATE TABLE order_header\G,复制完整输出,再与 Navicat 脚本逐行比对。


















