navicat「结构同步」能可靠生成ddl脚本,但不保障安全上线;需前置验证元数据可读性、严格设定源/目标顺序、人工筛选禁用drop类操作、执行前审查脚本并核对非结构差异。
直接上结论:navicat 的「结构同步」能可靠比对并生成 ddl 脚本,但同步本身不等于安全上线——它只负责结构变更,不校验数据影响、不绕过权限限制、也不自动规避高危操作。真正决定成败的,是比对前的验证、比对中的筛选和部署前的脚本审查。
先手动验证两个库是否“可读全量元数据”
很多“比对结果为空”或“部分表没出现”,根本不是 Navicat 问题,而是连接权限或配置挡住了元数据访问:
- 在开发库连接里执行
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_db_name';,记下数量 - 在生产库连接里执行同样语句,必须返回相同数量;否则 Navicat 会漏表
- 挑一个关键表(比如
t_user),分别运行SHOW CREATE TABLE `t_user`;,确认两边都返回完整建表语句(含反引号) - 若用阿里云 RDS 或腾讯云 TDSQL,进控制台检查是否开启了「information_schema 可见性」或「元数据访问权限」开关
源和目标顺序不能颠倒,否则脚本方向全错
Navicat 结构同步不是双向 diff 工具,它是单向生成「从源到目标」的变更脚本:
- 你想知道「开发库比生产库多了哪些字段/索引」→ 开发库必须设为
源,生产库为目标 - 如果反过来,Navicat 会生成把生产库结构覆盖到开发库的脚本,可能删掉你本地新加的字段
- 比对结果界面左侧永远是
源(开发库)状态,右侧是目标(生产库)状态;绿色+表示开发有、生产无,红色−表示开发删了、生产还有
比对后必须人工筛选,禁用 DROP 类操作
默认全选差异项是危险操作,生产环境严禁直接勾选以下三类变更:
-
DROP COLUMN:删字段会丢失数据,且不可逆 -
DROP INDEX:可能破坏查询性能或唯一约束,DBA 通常会手动加索引 -
DROP TABLE:绝对禁止,Navicat 不会提示“此表线上正被使用”
只保留安全项:新增字段、新增索引、扩大字段长度(如 VARCHAR(50) → VARCHAR(100))。类型变更(如 INT → BIGINT)要特别小心——MySQL 5.7+ 支持在线 DDL,但旧版本会锁表,得查文档确认。
点“运行”前,务必打开并检查生成的 SQL 脚本
Navicat 生成的脚本未必能直接执行,尤其当生产库已有数据时:
- 重点找带
MODIFY COLUMN ... NOT NULL或CHANGE COLUMN ... NOT NULL的语句——如果该字段存在空值,执行必报错 - 检查是否有
ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4这类隐式字符集转换,可能触发全表重建 - 点击「在查询编辑器打开脚本」,复制到新窗口,用
SELECT COUNT(*) FROM t_xxx WHERE col IS NULL;验证风险字段 - 若发现高危语句,别点“运行”,先手动改脚本,或拆成多步执行(比如先加字段,再用 UPDATE 补值,最后加 NOT NULL 约束)
最常被忽略的一点:Navicat 不会告诉你某个字段在生产库被 DBA 手动改过注释、加过隐藏索引,或者外键引用关系已被调整。这些“非结构元数据”的差异,只能靠人眼交叉核对 SHOW CREATE TABLE 输出。











