Navicat通过“结构同步+数据传输”组合实现覆盖式迁移:先用结构同步勾选“删除目标中不存在的对象”和“清空目标表”,再用数据传输选择“插入/更新”并再次勾选“清空目标表”,同时确保权限、字符集、连接关闭及外键约束一致。
用 Navicat 的「结构同步 + 数据传输」组合实现覆盖式迁移
navicat 本身没有“覆盖模式”这个开关,所谓“覆盖目标表并清空再写入”,实际要靠两个功能配合:先用 结构同步 确保表结构一致(含清空选项),再用 数据传输 执行全量写入。单独用任一功能都容易漏掉约束、索引或触发器,导致后续报错。
执行前必须检查的三件事
跳过这步,90% 的失败都发生在这里:
-
目标库(本地开发库)必须有足够权限——至少要有DROP、CREATE、INSERT、DELETE权限,否则清空和重建会静默失败 - 确认测试库和开发库的
字符集和排序规则一致(比如都是utf8mb4+utf8mb4_0900_ai_ci),否则同步后中文乱码或唯一键冲突 - 关闭所有连接到开发库的应用程序(包括你本地跑的
localhost:3000服务),避免Table 'xxx' is locked或事务阻塞
结构同步时勾选「删除目标中不存在的对象」和「清空目标表」
这是实现“覆盖”的关键动作。进入 工具 → 结构同步,选择测试库为源、开发库为目标后,在「选项」页注意以下设置:
- 勾选
删除目标中不存在的对象:确保开发库里多出来的测试表、视图、存储过程会被删掉 - 勾选
清空目标表:对已存在的同名表,先执行TRUNCATE TABLE(比 DELETE 快,且重置自增 ID) -
不勾选
仅同步结构(不传输数据):这个选项是默认开启的,但你要关掉它——否则结构同步完就停了,没数据 - 点击
下一步后,预览 SQL 里如果看到大量DROP TABLE和TRUNCATE TABLE,说明配置正确
数据传输必须设为「插入/更新」+「清空目标表」
结构同步只管建表和清空,真正把测试库的数据写进去,得靠 工具 → 数据传输。这里最容易踩坑的是「映射方式」:
- 在「字段映射」页,每张表都要点开,确认「目标字段」和「源字段」一一对应;若字段名不同(比如测试库叫
user_name,开发库叫name),手动拖拽匹配,否则会插成 NULL - 在「高级」页,务必选择
插入/更新模式,并勾选清空目标表(再次清空,防结构同步漏掉某些情况) - 取消勾选
忽略重复键错误:让它报错,而不是跳过——重复主键通常意味着主从不一致,该停下来查 - 如果表很大(>10 万行),勾选
使用多线程并调高线程数(如 4),但别超过开发库 MySQL 的max_connections限制
整个流程没有一键“覆盖”按钮,核心在于两次清空(结构同步一次、数据传输一次)+ 显式控制写入逻辑。最常被忽略的是字符集和外键约束——如果测试库关了 FOREIGN_KEY_CHECKS 而开发库没关,TRUNCATE 会直接失败。动手前,先在开发库执行一遍 SET FOREIGN_KEY_CHECKS = 0; 更稳妥。











