exp/imp 是 oracle 9i 及更早版本的逻辑导出导入工具,不支持 12c+ 新特性且无法跨大版本反向迁移;生产环境应优先使用 expdp/impdp,并严格设置与源库一致的 nls_lang 字符集。

exp/imp 是 Oracle 9i 及更早版本的逻辑导出导入工具,不支持 12c+ 的新特性(如 JSON、多租户容器对象),且无法跨大版本反向迁移(比如 12.2 → 11.2 会报 ORA-31693 / ORA-39142 错误);生产环境应优先用 expdp/impdp。
exp/imp 命令执行前必须设置 NLS_LANG
字符集错位是 exp 导出乱码、imp 导入失败的头号原因。不是“可选”,是强制步骤:
- 在 shell 或 cmd 中执行导出前,先运行:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8(Linux/macOS)或set NLS_LANG=AMERICAN_AMERICA.AL32UTF8(Windows) - 该值必须与源库的
NLS_CHARACTERSET一致,可通过SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';查询 - 如果目标库字符集不同(如源库是 ZHS16GBK),则需在导入前用
imp ... FEEDBACK=1000观察警告,并手动处理字符转换异常行
exp 导出时 rows=n 和 direct=y 的区别
这两个参数常被混用,但行为完全不同:
-
rows=n:只导出表结构(CREATE TABLE)、索引、约束等 DDL,不导任何数据 —— 适合重建空库结构 -
direct=y:启用直通模式(Direct Path Export),绕过 SQL 引擎,直接从数据文件读取,性能提升明显,但不支持某些对象(如含 LONG 列的表、集群表) - 二者可共存:
exp user/pwd rows=n direct=y表示“高速导出结构”;但若只要结构,direct=y实际无意义,因结构本身不走数据路径 - 注意:
direct=y在 Oracle 11g 后默认关闭,且 12c+ 已废弃,仅兼容旧脚本
imp 导入时报 ORA-01536 空间不足或 ORA-00955 对象已存在
这类错误不是命令写错,而是权限和预置条件缺失:
-
ORA-01536:目标用户默认表空间剩余空间不足。不能只靠grant unlimited tablespace to user;,要确认该表空间物理文件是否 autoextend on,且磁盘未满 -
ORA-00955:目标用户下已有同名对象(如表、序列)。imp没有TABLE_EXISTS_ACTION这类参数,只能提前清理:drop table t1 cascade constraints;或用ignore=y跳过建表语句(但数据不会插入) -
fromuser和touser必须成对出现,且touser用户必须已存在、有对应表空间配额,否则报IMP-00015 - 导入时加
buffer=20971520(20MB)可减少日志切换频率,尤其对大表有效
exp/imp 不支持跨版本反向导入(高→低)的底层限制
Oracle 官方明确不保证 exp 从 12.2 导出的 .dmp 文件能在 11.2 上用 imp 正确解析:
- 12c 引入的元数据格式变更(如隐式主键、虚拟列标识)会被
imp当作未知块丢弃,导致部分表缺失或约束丢失 - 即使命令成功执行,也可能出现数据截断(如 CLOB 字段前 4000 字符正常,后续为空)、触发器失效、物化视图定义不完整等问题
- 唯一可靠方案是:在源库降级导出——用 11.2 的
exp客户端连接 12.2 数据库(需安装对应客户端),再导出;或改用expdp+VERSION=11.2参数 - 别信“加 ignore=y 就能跑通”的经验帖,验证必须覆盖所有业务关键表的 COUNT(*)、MIN/MAX、CHECKSUM











