navicat“复制数据库”功能仅导出重建表结构与数据,并非真正克隆;需手动勾选include views/routines/events、设置目标库匹配字符集、启用disable foreign key checks、勾选drop tables before recreate,否则易出现外键错误、对象缺失、乱码或自增id重置等问题。
navicat 的“复制数据库”功能不能真正克隆整个数据库(含用户权限、存储过程定义、事件、函数依赖等),它只导出并重建表结构和数据,且默认跳过视图、触发器、外键约束等关键对象——除非你手动勾选所有选项并确认源库字符集与目标库完全一致。
为什么“复制数据库”常失败或结果不完整
这个功能本质是“导出 + 执行建表语句 + INSERT”,不是真正的逻辑复制或物理拷贝。常见问题包括:
-
ERROR 1215 (HY000): Cannot add foreign key constraint:目标库未启用FOREIGN_KEY_CHECKS=0,或外键引用的表尚未创建 - 视图、存储过程、函数缺失:默认不勾选
Include Views/Include Routines,且即使勾选,若源库 routine 定义中含DEFINER='user@host',在本地执行会报错 - 字符集错乱:源库用
utf8mb4_unicode_ci,目标库默认latin1_swedish_ci,导致中文变问号 - 自增 ID 重置:复制后新表的
AUTO_INCREMENT值从 1 开始,而非继承原值
必须手动调整的 4 个关键选项
打开 工具 → 复制数据库 后,别直接点“开始”:
- 在“源数据库”页,确认已连接到正确的远程库,并勾选
Include Views、Include Routines、Include Events(如果需要) - 在“目标数据库”页,选择本地已存在的空库(不要选
新建数据库,它不会自动设字符集),然后点击右侧编辑按钮,在弹窗中将Collation显式设为与源库一致(如utf8mb4_unicode_ci) - 勾选
Drop tables before recreate(避免表已存在报错),但注意这会清空目标库所有现有表 - 务必勾选
Disable foreign key checks during execution,否则外键依赖顺序错误会导致中断
复制后必须验证的三件事
运行完成不等于可用。立即检查:
- 执行
SELECT COUNT(*) FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'your_db';,比对源库数量;若为 0,说明DEFINER权限不足或 routine 被跳过 - 对任意一张有外键的表,执行
SHOW CREATE TABLE table_name;,确认FOREIGN KEY语句是否出现在输出里 - 查一条含中文的数据:
SELECT * FROM your_table LIMIT 1;,看是否显示正常;若乱码,需修改目标库默认字符集:ALTER DATABASE your_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
最易被忽略的是 routine 的 DEFINER —— Navicat 不会帮你改,也不提示。如果你不需要原 DEFINER,可在复制前在源库执行:SELECT CONCAT('ALTER DEFINER=`root`@`localhost` ', ROUTINE_TYPE, ' ', ROUTINE_NAME, ';') FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='your_db';,把结果批量执行一遍再复制。











