日期:2014-05-16  浏览次数:20527 次

Oracle EXP导出报错的解决办法

前段时间上海某保险客户IT主管打电话过来,说他们的开发人员在开发环境中执行EXP报错,让我过去检查下。本着“客户为本,服务为根”的宗旨,第一时间赶到客户现场。

和客户开发人员沟通下,查看EXP报错的具体信息:

正在导出 pre-schema 过程对象和操作

EXP-00008: 遇到 ORACLE 错误 4063

ORA-04063: package body "DMSYS.DBMS_DM_IMP_INTERNAL" has errors

ORA-06508: PL/SQL: could not find program unit being called: "DMSYS.DBMS_DM_IMP_INTERNAL"

ORA-06512: at "DMSYS.DBMS_DM_MODEL_EXP", line 303

ORA-06512: at line 1

EXP-00083: 调用 DMSYS.DBMS_DM_MODEL_EXP.schema_info_exp 时出现前一问题

第一时间怀疑是不是因为DMSYS用户下面的DBMS_DM_IMP_INTERNAL对象无效导致EXP报错的,通过PL/SQL Develop连接到数据库,查看该对象,结果证实的我的猜测。

DMSYS用户下面存在部分编译失败的package,包含这个与EXP操作有关DBMS_DM_IMP_INTERNAL的package, (至于为什么系统存在编译失败的package,他们也不清楚是什么原因导致的,现在也无法追溯了)由于系统DMSYS(这个用户是DATA MINING组件使用的)下的package是加密的,无法对其下面的package进行重新编译。我尝试下了下,编译不成功。

解决方案: 用户删除后重建

删除DMSYS用户:

SQL>drop user dmsys cascade;

用户重建:通过以下脚本重建用户

SQL>@?/rdbms/admin/dminst.sql

?用户建好后,果然该用户下面所有的package对象都是有效的,于是让开发人员测试EXP导出,悲剧继续发生了,原先的错误解决了,但出现新的错误:

EXP-00008: ORACLE error 4063 encountered

ORA-04063: package body "EXFSYS.DBMS_EXPFIL_EXP" has errors

ORA-06508: PL/SQL: could not find program unit being called: "EXFSYS.DBMS_EXPFIL_EXP"

ORA-06512: at "EXFSYS.DBMS_EXPFIL_DEPASEXP", line 61

ORA-06512: at line 1

EXP-00083: The previous problem occurred when calling EXFSYS.DBMS_EXPFIL_DEPASEXP.schema_info_exp

. exporting statistics

报错信息里面报的是EXFSYS(Oracle Expression Filter 组件)用户下面的package又存在无效的,继续采用上述解决方案,对该用户进行重建,

解决方案:删除DMSYS用户:

SQL>drop user exfsys cascade;

用户重建:通过以下脚本重建用户

SQL>@?/rdbms/admin/catexf.sql

上述工作完成后,让开发人员测试EXP导出,EXP导出正常,问题解决。

总结:

通过Oracle自带脚本对系统用户进行重建,将该系统用户下面的失效对象(这些对象是加密的)进行重新编译,从而解决EXP报错。