前段时间上海某保险客户IT主管打电话过来,说他们的开发人员在开发环境中执行EXP报错,让我过去检查下。本着“客户为本,服务为根”的宗旨,第一时间赶到客户现场。sql
和客户开发人员沟通下,查看EXP报错的具体信息:数据库
正在导出 pre-schema 过程对象和操做测试 EXP-00008: 遇到 ORACLE 错误 4063加密 ORA-04063: package body "DMSYS.DBMS_DM_IMP_INTERNAL" has errorsspa 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 303ci ORA-06512: at line 1开发 EXP-00083: 调用 DMSYS.DBMS_DM_MODEL_EXP.schema_info_exp 时出现前一问题it |
第一时间怀疑是否是由于DMSYS用户下面的DBMS_DM_IMP_INTERNAL对象无效致使EXP报错的,经过PL/SQL Develop链接到数据库,查看该对象,结果证明的个人猜想。io
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报错。