必须严格遵循「脚本预览→手动校验→备份后执行」三步流程,禁用直接同步;源库须为dev_开头、目标库为prod_开头;字段收缩、字符集、大表ddl等均需人工核验与拆分。
不能直接点“同步”就推到生产库——只要目标库是 prod_ 开头的连接,就必须走「脚本预览 → 手动校验 → 备份后执行」三步,跳过任意一环都可能丢数据或锁表。
确认源/目标方向是否选反
Navicat 不会阻止你把生产库当“源”、开发库当“目标”。一旦选反,生成的脚本就是 DROP TABLE + CREATE TABLE,直接清空开发库;若反向操作,等于在生产环境删表。
- 每次打开「结构同步」后,第一眼先看左栏标着“源”的连接名是不是以
DEV_开头,右栏“目标”是不是PROD_开头 - 连接别名必须带环境标识,例如
DEV_MySQL_OrderDB和PROD_MySQL_OrderDB,禁用order_db这类模糊名 - 生产连接建议设为红色标签(连接属性 → 外观 → 颜色),视觉强警示
黄色警告意味着可能丢数据,别点“忽略此差异”
比对结果里出现黄色标记,常见于字段长度收缩(如 VARCHAR(200) → VARCHAR(50))或类型变更(如 INT → TINYINT)。Navicat 默认生成的 ALTER COLUMN 不做数据校验,执行即截断。
- 先查生产库该字段实际最大长度:
SELECT MAX(CHAR_LENGTH(column_name)) FROM table_name; - 若结果 > 50,就不能直接收缩;要么扩生产库长度,要么应用层兼容
-
忽略此差异只隐藏显示,不改变生成逻辑,慎点
生成的 SQL 脚本默认无事务,大表操作必须拆分
Navicat 17 生成的脚本是单条 DDL 拼接,没有 BEGIN TRANSACTION/COMMIT 包裹。对百万级大表,ADD COLUMN xxx NOT NULL 会触发全表拷贝,锁表数分钟甚至失败。
-
ADD COLUMN必须补默认值,否则线上执行报错:ADD COLUMN xxx VARCHAR(32) DEFAULT '' - 大表(行数 > 100 万)建议手动拆分:先加可空字段,再用后台任务分批
UPDATE,最后MODIFY COLUMN ... NOT NULL - 别依赖「遇到错误时继续」选项——DDL 报错后后续语句大概率不执行,状态不可控
字符集和排序规则必须用 SHOW CREATE TABLE 核对
Navicat 同步时偶尔漏导 COLLATE 或误写 utf8(实际应为 utf8mb4),导致中文乱码、索引失效或 JOIN 结果异常。
- 同步前,在开发库运行:
SHOW CREATE TABLE order_header\G,复制整段输出 - 重点核对三处:
ENGINE=InnoDB、DEFAULT CHARSET=utf8mb4、COLLATE=utf8mb4_0900_as_cs(MySQL 8.0)或utf8mb4_unicode_ci(5.7) - 新列若未显式指定
CHARACTER SET和COLLATE,会继承库级默认值,而它可能和旧列不一致
最易被忽略的是:Navicat 的「Synchronize to Database」按钮等于绕过所有人工确认环节,不校验从库延迟、不检测外键依赖、不清除中间状态。真实生产环境里,DBA 拒绝执行任何没经过 pt-online-schema-change 或 pg_repack 包装的 DDL ——哪怕只是加个默认值。











