必须用Data Transfer做单向迁移,因Navicat的“还原”仅支持同源备份文件(如.nb3),不识别Oracle RMAN/dump;“同步”仅限同构库且要求结构严格一致,跨Oracle/PostgreSQL会报类型映射错误或静默跳过字段。

不能用“还原”或“同步”,必须走 Data Transfer 功能做单向迁移;默认配置几乎必然失败,关键设置不调,表建不成功或数据错乱。
为什么 Data Transfer 是唯一可行路径
Navicat 的「还原」只认同源备份文件(如 PostgreSQL 的 .nb3),Oracle 的 RMAN 或导出 dump 完全不识别;「同步」要求结构严格一致、主键可用,且仅支持同构库(Oracle ↔ Oracle),跨到 PostgreSQL 会直接报错或静默跳过字段。
常见错误现象:Error: Unsupported data type mapping for column "CREATED_DATE" (Oracle DATE → PostgreSQL TIMESTAMP),本质是类型比对失败,不是网络问题。
Data Transfer 必须手动改的三项设置
以下三处不改,90% 的表会建错或数据溢出:
- 传输模式:必须选
Transfer structure and data(不是“仅结构”或“仅数据”) - 冲突处理:必须勾选
Drop tables if exist(PostgreSQL 不支持CREATE OR REPLACE TABLE,不删旧表就报relation "xxx" already exists) - 高级选项 → 字段映射:
Edit Type Mapping里重点覆盖:-
NUMBER(10,0)→ 改为bigint(默认integer溢出后变负数) -
DATE→ 改为timestamp without time zone(选with time zone会导致时区误解释) -
VARCHAR2(4000)→ 改为text(避免 emoji 或 UTF-8 四字节字符截断)
-
迁移后必须补的三件事
Navicat 不生成索引、约束、注释,也不处理大小写和关键字冲突:
- 批量转小写表名:
SELECT 'ALTER TABLE "' || tablename || '" RENAME TO ' || lower(tablename) || ';' FROM pg_tables WHERE schemaname = 'public'; - 批量转小写字段名:
SELECT 'ALTER TABLE ' || table_name || ' RENAME "' || column_name || '" TO ' || lower(column_name) || ';' FROM information_schema.columns WHERE table_schema = 'public'; - 手动重建主键、唯一约束、索引(Navicat 从不自动建这些)
容易被忽略的性能与兼容性细节
Oracle 的 NULL 和空字符串等价,PostgreSQL 严格区分——迁移后若业务 SQL 依赖该行为,需加 COALESCE(col, '') 适配。
Oracle 的 ROWID 和 PostgreSQL 的 ctid 不可比,所以别信「Compare data」选项,它只会卡住或漏数据。
大对象(CLOB/BLOB)建议单独测试,启用 为BLOB 使用十六进制格式 可提升稳定性;fetchSize 设为 500 能防 Oracle 端内存溢出。


















