oracle imp导入时报错误 14692 的解决方法

Oracle12c 在做imp导入操作时报错,错误提示如下:

oracle imp导入时报错误 14692 的解决方法

这是由于表sys_log 下的字段content 和表user_role下的字段power 曾经超过了4000个字符,oracle12c默认将它们设置成secureFile方式的存储形式了。而这种存储形式默认情况下通过imp导入是有问题的。

 

所以解决的办法1:

就是把secureFile方式的存储形式取消掉。

 

执行select * from user_lobs;可以看到哪些字段启用了secureFile。

oracle imp导入时报错误 14692 的解决方法

执行结果清晰可见,就是这两个字段。

 

取消的方法如下:

  1. 找到该表该字段,删除。然后单击“应用”
  2. 重新执行select * from user_lobs;这个时候可以看到结果集中已经没有这个字段了。
  3. 重新把这个字段加回去,不过长度不能超过4000,否则系统会自动又设置成secureFile。
  4. 如果我们真的是需要4000以上的长度,可以在导入之后,把字段长度增长。

解决的办法2:(推荐使用)

其实根据错误提示,问题的根源其实就是dmp文件的建表语句有个store as 字句。这跟secureFile方式的存储形式冲突了。那我们就把dmp文件用JDEdit 或者记事本打开,查找STORE AS SECUREFILE,把LOGGING NOCOMPRESS 后面的LOB打头的语句删到底即可。保存之后,就可以成功导入了,而且省去了改动字段大小的步骤。

 

补充说明:

执行select * from user_lobs;可以看到结果中的一个字段:segment_created。这个字段的意思是当表中没有数据的时候,是否创建segment(段,oracle的一种存储空间资源),默认是不创建,这会造成1个问题:当数据表中没数据时,数据表的表结构根本就不导入。

oracle imp导入时报错误 14692 的解决方法

解决的办法很简单,执行alter table 表名allocate extent;

这个时候再执行select * from user_lobs;可以看到结果变YES 了。问题解决。