结构同步用于生产环境必须严格遵循脚本预览、手动校验、备份三步;源/目标库标识须明确(如DEV_/PROD_)、生产库标红警示;黄色警告提示可能截断需查实际数据长度;生成SQL无事务,大表操作须拆分并补默认值;字符集等关键项应以SHOW CREATE TABLE核对。
结构同步 功能本身不自动保证安全,是否能用于生产环境,取决于你是否跳过关键审查环节。直接点:只要目标库是生产库,就绝不能跳过脚本预览、手动校验和备份三步。
选错源/目标方向会导致 DROP TABLE 被执行到生产库
navicat 不会阻止你把生产库当“源”、开发库当“目标”,但这样生成的脚本会清空开发库结构——如果反向操作,就是删生产表。
- 每次打开
工具 → 结构同步后,第一眼先确认左栏标着“源”的连接名是不是 DEV_ 开头,右栏“目标”是不是 PROD_ 开头 - 连接别名必须带环境标识,比如
DEV_MySQL_OrderDB和PROD_MySQL_OrderDB,别用模糊名如order_db - 生产连接建议设为红色标签(连接属性 → 外观 → 颜色),视觉上形成强警示
比对结果里出现黄色警告时,ALTER COLUMN 可能导致数据截断
比如开发库字段是 VARCHAR(200),生产库是 VARCHAR(50),比对会标黄并提示“可能截断”。Navicat 默认生成的修改语句不会加数据校验逻辑,直接执行等于丢数据。
- 遇到黄色标记,先查生产库该字段最长实际值:
SELECT MAX(CHAR_LENGTH(column_name)) FROM table_name; - 若结果 > 50,就不能直接收缩;要么扩生产库长度,要么在应用层做兼容处理
- Navicat 的“忽略此差异”仅隐藏显示,不改变生成逻辑,慎点
生成的 SQL 脚本默认不含事务控制,大表 ADD COLUMN 可能锁表数分钟
Navicat 15+ 版本生成的脚本是单条 DDL 拼接,没有 BEGIN TRANSACTION / COMMIT 包裹。MySQL 5.7+ 对 ADD COLUMN 默认是 inplace,但若字段非空且无默认值,仍会触发全表拷贝。
- 检查脚本中是否有
ADD COLUMN xxx NOT NULL—— 这类语句必须补默认值,否则线上执行失败 - 对大表(行数 > 100 万),建议手动拆分:先
ADD COLUMN xxx VARCHAR(32) DEFAULT '',再用后台任务分批UPDATE - 不要依赖 Navicat 的“遇到错误时继续”选项,DDL 报错后后续语句大概率不执行,状态不可控
字符集和排序规则不一致时,SHOW CREATE TABLE 比 Navicat 同步更可靠
Navicat 在跨版本或跨实例同步时,偶尔漏导 COLLATE 或误写 utf8(实际应为 utf8mb4),导致中文乱码或索引失效。
- 对关键表,同步前先在开发库运行:
SHOW CREATE TABLE order_header\G,复制整段输出 - 重点核对三处:
ENGINE=InnoDB、DEFAULT CHARSET=utf8mb4、COLLATE=utf8mb4_0900_ai_ci(MySQL 8.0)或utf8mb4_unicode_ci(5.7) - 如果生产库是只读实例,还要确认
sql_mode是否含STRICT_TRANS_TABLES,缺失会导致默认值插入失败











