前段時間上海某保險客戶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報錯。