Navicat“数据同步”功能比导入向导更可靠,因其支持字段级映射、冲突处理、事务回滚及INSERT/UPDATE/DELETE语句生成,避免精度丢失与类型错误;而导入向导易致NUMBER被截断为DECIMAL等兼容性问题。
Oracle到MySQL同步时,数据同步功能比导入向导更可靠
直接用导入向导迁移 oracle 数据到 mysql 容易丢精度或报类型错误,比如 number(10,2) 可能被截断成 decimal(10,0)。真正做跨库同步,应该走 工具 → 数据同步 路径——它内置字段级映射、冲突处理和事务回滚,不是简单 dump 再 load。
关键点:
-
数据同步会自动对比源/目标表结构,生成 INSERT/UPDATE/DELETE 语句,不依赖目标表已存在 - 必须提前在 Oracle 中建好数据库链接(
CREATE DATABASE LINK),否则 Navicat 无法识别远程 Oracle 实例 - 如果目标 MySQL 表名含下划线,而 Oracle 表名是大写驼峰(如
ORDER_HEADER),勾选转换对象名为小写比手动改名更稳妥
同步前必须配置 OCI,否则连不上 Oracle
Navicat 不自带 Oracle 驱动,必须手动指定 oci.dll 路径,否则点击“测试连接”直接报 ORA-12154: TNS:could not resolve the connect identifier 或空白错误。
实操要点:
- 下载与 Oracle 服务端版本匹配的
instantclient-basic-windows.x64-xx.x.x.x.zip(比如服务端是 19c,就下 19.x 的 client) - 解压后,在 Navicat 中进入
工具 → 选项 → 环境 → OCI library,填入instantclient_19_XX\oci.dll的绝对路径 - 路径里不能有中文或空格,否则 Navicat 加载失败但不提示——这是最常被忽略的坑
数据同步里三个开关决定是否丢数据
默认设置下,数据同步可能只插入新记录,旧数据不动,看起来“同步成功”,实际是半残状态。
务必检查这三个选项:
-
插入记录:控制是否新增行,必须勾选 -
更新记录:控制是否覆盖已有主键/唯一键匹配的行,不勾选 = 不更新脏数据 -
删除记录:控制是否删掉目标库中源库已不存在的行,生产环境慎开,建议先关
另外,使用交易要勾选——否则中途失败,部分表已写入,没法回滚。
大表同步卡住?不是网络问题,是没开分批导入
同步超过 10 万行的表时,Navicat 默认单条 SQL 提交,Oracle 侧 PGA 内存溢出,ORA-04030 报错后进程挂起,界面无响应。
解决方法很简单:
- 在
数据同步 → 高级设置中,启用分批导入 - 把
每批记录数设为 5000(Oracle 默认arraysize是 100,设太高反而慢) - 同时勾选
扩展插入语句,让 Navicat 把 5000 条合并成一条带 VALUES(...) 的 INSERT,减少网络往返
这个组合能让 80 万行订单表从超时失败变成 2 分 17 秒完成,但很多人根本找不到“分批导入”在哪——它藏在高级设置底部,非默认展开。











