必须用结构同步或导出sql克隆数据库结构,因“复制数据库对象”仅得空表且丢索引、外键等;结构同步可自动识别差异并生成完整ddl,导出sql需手动勾选索引外键、处理definer及字符集。
直接用“复制数据库对象”或拖放表,大概率只得到空壳——索引、外键、注释、自增起始值全丢。真要克隆结构,必须绕过右键快捷入口,走结构同步或导出 sql 两条路径。
结构同步向导是唯一能自动识别并生成完整 DDL 的方式
Navicat 15 的「结构同步」不是简单比对表名,它会逐对象解析 CREATE 语句,识别字段类型变更、索引缺失、外键引用不一致等细节,并生成可执行的 ALTER / DROP / CREATE 脚本。
- 启动路径:菜单栏 → 工具 → 结构同步
- 源库和目标库必须同时在线且可连;目标库可以是空库,但不能是只读连接
- 同步前务必勾选「显示所有对象差异」,否则视图、存储过程等可能被跳过
- 生成的部署脚本默认不含
DROP TABLE,若目标表已存在且结构冲突,需手动勾选「删除目标中不存在的对象」 - 时间戳字段(
TIMESTAMP)的CURRENT_TIMESTAMP默认值可能被忽略,检查脚本里是否保留了DEFAULT CURRENT_TIMESTAMP
导出 SQL + 手动清理是最可控的备选方案
当结构同步失败(比如跨大版本 MySQL 或含特殊字符集定义),导出 SQL 是兜底手段,但 Navicat 默认导出行为有陷阱:
- 右键数据库 → 「转储 SQL 文件」→ 「结构」:默认不导出索引语句,除非在弹窗中点开「高级」页签,勾选「导出索引」和「导出外键」
- MySQL 8.0+ 的隐藏列(
INVISIBLE)、生成列(GENERATED COLUMN)在旧版 Navicat 15.0.28 前无法识别,导出后变成普通字段,建议升级到 15.0.32+ - 导出的 SQL 文件默认用
utf8编码,若源库含 emoji 或四字节 UTF-8 字符,需在导出前确认连接的Initial statement设为SET NAMES utf8mb4 - 导出后别直接执行:先全局替换
CREATE DATABASE为USE target_db,避免意外建库覆盖
“复制数据库对象”功能实际只适合单表迁移,别信它的名字
这个菜单项名字极具误导性——它底层调用的是分批 CREATE TABLE LIKE + INSERT SELECT,对整个数据库运行时会静默跳过触发器、事件、函数,且不校验外键依赖顺序。
- 即使勾选了「复制数据」,也仅对表生效;视图、存储过程会被跳过,无任何提示
- 目标库若已存在同名表,操作会失败并只在底部状态栏闪一下「Operation failed」,不会弹错误框
- 跨实例(如从本地 MySQL 迁到远程 MySQL)时,字符集和排序规则(
COLLATE)大概率丢失,ENGINE=InnoDB DEFAULT CHARSET=utf8mb4这类关键定义不会自动补全 - 真正需要跨实例结构克隆时,应改用「数据传输」工具,并在「选项」里取消勾选「复制数据」,只留「结构」——它比“复制数据库对象”更稳
最易被忽略的一点:Navicat 15 不会自动处理 DEFINER 权限上下文。导出的视图或存储过程中若含 DEFINER=`user`@`host`,导入后在目标库执行会报错 ERROR 1449: The user specified as a definer does not exist,必须手动替换成目标库存在的账号,或删掉整段 DEFINER 子句。











