首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 非法資料庫物件導致匯出/追蹤錯誤:偵測、重編譯、徹底清除

     編輯:Oracle 資料庫相關知識

典型錯誤現象

  • EXP-00008: ORACLE error 3113 / ORA-03113:匯出同義詞時中斷。
  • 追蹤檔 ORA-07445: core dump [joe_well_known_internal()]。
  • ORA-00980:同義詞指向已不存在的表。

根本原因

使用者 Schema 下存在 非法/失效物件,常見於:

  • 基礎表被 DROP,依賴的 Synonym/View/Procedure 狀態變 INVALID (或仍顯示 VALID 但實際不可用)。
  • Java 虛擬機制 (JVM) 相關字典視圖損壞。

標準修復流程

  1. 重編譯失效物件:
    SET PAGES 500 LINES 200 TRIMS ON HEADING OFF
    SPOOL /tmp/recompile.sql
    SELECT 'ALTER '||OBJECT_TYPE||' '||OBJECT_NAME||' COMPILE;'
    FROM USER_OBJECTS WHERE STATUS = 'INVALID';
    SPOOL OFF
    @/tmp/recompile.sql
  2. 偵測「假 VALID」同義詞:
    SPOOL /tmp/check_syn.sql
        SELECT 'DESC '||SYNONYM_NAME||';' FROM USER_SYNONYMS;
        SPOOL OFF
        @/tmp/check_syn.sql  -- 報錯者即為非法同義詞
  3. 徹底刪除並重建:
    DROP SYNONYM "&synonym_name";  -- 雙引號處理大小寫/特殊字元
        CREATE SYNONYM "&synonym_name" FOR "&owner"."&table_name";
  4. 仍失效則 DROP (經開發同意):
    DROP TABLE scott."emp" CASCADE CONSTRAINTS;
        DROP TRIGGER scott."trigger_name";

終極手段:繞過 EXU9SYNU 視圖

若 DBMS_JAVA.LONGNAME() 執行即報錯,疑為 JVM 字典損壞:

DROP VIEW EXU9SYNU;
CREATE VIEW EXU9SYNU AS
SELECT "SYNNAM","SYNNAM2","SYNTAB","TABOWN","TABNODE","PUBLIC$","SYNOWN",
       "SYNOWNID","TABOWNID","SYNOBJNO","SYNTIME"
FROM SYS.EXU9SYN
WHERE 0=1;  -- 空結果集,讓匯出跳過同義詞階段
GRANT SELECT ON SYS.EXU9SYNU TO PUBLIC;

預防建議

  • 定期跑 UTL_RECOMP.RECOMP_SERIAL() 全庫重編譯。
  • DDL 變更後立即檢查依賴物件狀態。
  • 匯出前先執行上述偵測腳本,確保零非法物件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved