结构同步前需验证连接真实性及权限,确保INFORMATION_SCHEMA可读、SHOW CREATE TABLE可用,核对MySQL版本兼容性与用户权限,关闭AUTO_INCREMENT同步并忽略引号/字段顺序等非关键差异,预览SQL时重点检查DROP操作、NOT NULL约束及外键命名。
确认连接真实可用,不是“假在线”
navicat 结构同步依赖完整读取 information_schema 和执行 show create table,连接看似正常但权限不足或网络抖动时,会静默跳过表甚至报 access denied for user。这不是功能 bug,而是元数据读取失败。
- 在源库和目标库连接中,分别手动执行:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_db_name';,比对返回数量是否一致 - 挑 1–2 个典型表(如
t_user),运行:SHOW CREATE TABLE `t_user`;,确认返回完整建表语句(注意反引号不能丢) - 若目标库是云 RDS(如阿里云、腾讯云),检查控制台是否开启「元数据访问权限」或「information_schema 可见性开关」
- 本地 Docker 实例需确认未禁用
INFORMATION_SCHEMA查询(某些轻量镜像默认关闭)
核对 MySQL 版本与权限是否匹配
结构同步本质是生成并执行 DDL,版本不兼容或权限缺失会导致语句失败、静默忽略或锁表卡死。
- 源库与目标库必须同为
MySQL 5.7+或8.0+;混用5.6与8.0时,JSON字段、隐藏索引等特性会静默丢失 - 目标库用户必须具备:
ALTER、CREATE、DROP、LOCK TABLES、SHOW VIEW权限;仅SELECT+INSERT不足以完成同步 - 若目标库存在同名但已被 DBA 手动修改的表(如加了额外索引),Navicat 不会跳过也不会提示——它只按差异部署
检查 AUTO_INCREMENT 和字段类型陷阱
Navicat 默认把 AUTO_INCREMENT 值当作结构属性同步,且对 TINYINT(1) 与 BOOLEAN、字段顺序、默认值引号等做字符串级精确比对,极易误判。
- 同步前务必打开「高级」选项页,取消勾选
AUTO_INCREMENT—— 否则目标库自增值会被强制设为源库当前值,导致主键冲突 - 新版 Navicat 16+ 支持勾选
Ignore tinyint(1) vs boolean,旧版需人工过滤这类条目,重点关注VARCHAR → TEXT、INT → BIGINT、NOT NULL ↔ NULL等真实风险项 - 勾选
Ignore column order,避免字段顺序不同被误判为「删字段 + 增字段」 -
DEFAULT '2023-01-01'和DEFAULT "2023-01-01"被视为不同,可在「Compare settings」中启用忽略引号差异
预览 SQL 前必须人工核验三处关键点
Navicat 生成的 SQL 看似可直接执行,但默认逻辑常忽略生产环境约束,不检查就运行等于埋雷。
- 检查是否有
DROP COLUMN、DROP INDEX、DROP TABLE—— 这些操作在生产环境基本不可接受,应手动取消勾选 - 确认
ALTER TABLE ... MODIFY COLUMN是否带NOT NULL强制约束:若目标表该字段存在空值,执行必报错 - 外键变更语句是否含
CONSTRAINT名字:Navicat 常省略,依赖 MySQL 自动推断,而部分版本(尤其低配云数据库)会失败
真正容易被忽略的是:Navicat 的「对比」结果只是元数据快照,它不校验数据实际长度。比如目标库 VARCHAR(50) 字段存了 80 字符,你扩到 VARCHAR(200) 是安全的;但若没查 MAX(CHAR_LENGTH(column_name)) 就直接缩容,立刻截断。


















