结构同步前必须做三件事:全库备份、校验字符集一致性、授予最小权限;比对时紧盯字段类型变更、NOT NULL新增、主键/索引重命名、外键约束名变更四类风险;部署前须手动调整脚本顺序、语法兼容性及ALTER合并。
结构同步前必须做这三件事
不做准备就点“比较”,等于把生产库交到自动脚本手里。navicat不会替你判断字段重命名是否影响业务逻辑,也不会提醒你text字段加默认值在mysql 8.0+会报错。
- 用
备份功能对目标库做一次全库备份——不是导出SQL,而是用Navicat内置的备份任务生成加密压缩包,恢复路径可控 - 确认源库和目标库的
character_set与collation一致,尤其注意utf8mb4_0900_as_cs和utf8mb4_unicode_ci混用会导致ALTER TABLE ... CONVERT TO语句静默失败 - 给目标库账号最小权限:只授
ALTER、CREATE、DROP(仅限目标schema)、SELECT(用于元数据读取),禁用DELETE和INSERT
比对时重点盯住这四类差异
Navicat列出的“要修改的对象”里,90%的线上事故来自没细看DDL对比面板。别只扫一眼“操作列”的+或→符号。
-
字段类型变更:比如VARCHAR(50)→VARCHAR(255)安全,但INT→TINYINT可能截断数据;Navicat不会校验现有数据是否溢出 -
NOT NULL新增:若目标表已有NULL值,同步会直接报错中断,且不回滚已执行的前面语句 -
主键/索引重命名:Navicat默认生成DROP INDEX old_name ON table+CREATE INDEX new_name,但MySQL 5.7+不支持对主键索引重命名,会变成先删后建,触发锁表 -
外键约束名变更:即使逻辑等价,Navicat也会标记为“修改”,生成DROP FOREIGN KEY+ADD CONSTRAINT,可能短暂破坏参照完整性
部署脚本前必须手动干预的三个地方
点击“部署脚本”选项卡看到的SQL,是Navicat按对象类型顺序拼出来的,不是按执行依赖排序的。直接运行大概率失败。
- 把所有
CREATE TABLE语句提到最前面,避免ALTER TABLE引用尚不存在的表 - 检查
ADD COLUMN语句是否含AFTER子句——MySQL 8.0.23+才支持该语法,老版本会报错Unknown syntax - 把涉及同一张表的多个
ALTER TABLE合并成一条,例如把ADD COLUMN a INT和MODIFY COLUMN b VARCHAR(100)写在同一句里,减少表锁次数
遇到错误时继续 ≠ 安全跳过
勾选“遇到错误时继续”只是让脚本不停止,不是让错误消失。它常被误用为“放心一键执行”的心理安慰剂。
- 这个选项对
CREATE INDEX失败无效——索引创建失败后,后续依赖它的FOREIGN KEY语句必然报错,但Navicat仍会继续执行 - 真正需要的是在“部署选项”里关闭该开关,改用
复制脚本到剪贴板,粘贴到查询编辑器中分段执行,每条ALTER后手动SELECT COUNT(*)验证 - 特别注意
RENAME TABLE操作:Navicat生成的脚本会把重命名和后续字段修改拆成两条语句,中间若有其他连接正在查这张表,第二条会卡住并拖垮整个同步流程
结构同步不是魔法按钮,是把人工判断过程可视化、可追溯的工具。最危险的时刻,永远发生在你相信“对比完成=可以执行”的那一秒。


















