EXP-00008 ORA-03113 (10g) 或 ORA-00980 (8i) 伴隨 ORA-07445 [joe_well_known_internal],核心原因往往是**同義詞指向已刪除物件**、**JVM 內部函數解析失敗**、**視圖定義殘留無效引用**。本文提供從現象到根因的標準化排查腳本與修復流程。
| 版本 | 導出工具 | 錯誤碼 | 跟蹤關鍵字 |
|---|---|---|---|
| 10g | EXP | EXP-00008 ORA-03113 | DBMS_JAVA.LONGNAME, EXU9SYNU |
| 8i | EXP | ORA-00980 | 同義詞轉換失敗 |
SET PAGES 500 LINES 200 TRIMS ON HEADING OFF
SPOOL /tmp/recompile_invalid.sql
SELECT 'ALTER '||object_type||' '||object_name||' COMPILE;'
FROM user_objects
WHERE status = 'INVALID';
SPOOL OFF
@/tmp/recompile_invalid.sql
SPOOL /tmp/check_syn.sql
SELECT 'DESC '||synonym_name||';' FROM user_synonyms;
SPOOL OFF
SET FEEDBACK ON
@/tmp/check_syn.sql
SET FEEDBACK OFF
-- 輸出中出現 "ORA-00980: synonym translation is no longer valid" 即為懸空同義詞
-- 針對每個報錯同義詞
DROP SYNONYM "synonym_name"; -- 雙引號防大小寫/特殊字符
CREATE SYNONYM "synonym_name" FOR "owner"."table_name";
DROP TABLE scott."emp" CASCADE CONSTRAINTS;
DROP TRIGGER scott."trigger_name";
若上述步驟完成仍報 ORA-07445 [joe_well_known_internal],說明 JVM 內部解析同義詞視圖時觸發 Bug。
CONNECT / AS SYSDBA
-- 1. 刪除舊視圖
DROP VIEW sys.exu9synu;
-- 2. 重建為空視圖 (WHERE 0=1 保證無數據,避免 JVM 遍歷)
CREATE VIEW sys.exu9synu AS
SELECT "SYNNAM","SYNNAM2","SYNTAB","TABOWN","TABNODE",
"PUBLIC$","SYNOWN","SYNOWNID","TABOWNID","SYNOBJNO","SYNTIME"
FROM sys.exu9syn
WHERE 0 = 1;
-- 3. 授權
GRANT SELECT ON sys.exu9synu TO PUBLIC;
原理:EXP 導出同義詞時會查詢 EXU9SYNU,JVM 嘗試對每行調用 DBMS_JAVA.LONGNAME,空視圖直接跳過,繞過 Bug。
| 根因 | 表現 | 修復 | 預防 |
|---|---|---|---|
| 原表 DROP 後同義詞未清理 | EXP 報 ORA-00980/03113 | 步驟 2-3 重建 | DDL 規範:DROP TABLE 同步 DROP SYNONYM |
| 同義詞指向跨 Schema 物件,目標 Schema 重建 | 同義詞 VALID 但 DESC 失敗 | 步驟 2-3 重建 | 避免跨 Schema 同義詞,改用 VIEW + GRANT |
| JVM Bug (10g 常見) 解析 EXU9SYNU | ORA-07445 joe_well_known_internal | 步驟 5 重建空視圖 | 10g 打 Patch 10.2.0.5+ / 升級 11g+ |
| 物件名含特殊字符/保留字 | DROP 失敗提示不存在 | 雙引號強制刪除 | 命名規範:無特殊字符、無保留字 |
-- 檢測懸空同義詞
SELECT 'DANGLING SYNONYM: '||synonym_name
FROM user_synonyms s
WHERE NOT EXISTS (
SELECT 1 FROM all_objects o
WHERE o.owner = DECODE(s.table_owner, NULL, USER, s.table_owner)
AND o.object_name = s.table_name
);
-- 檢測無效物件
SELECT object_type, object_name, status
FROM user_objects
WHERE status = 'INVALID';
導出失效 90% 由**懸空同義詞**或 **JVM 視圖 Bug** 引起。建立「DDL 變更檢查清單」:DROP TABLE → 檢查同義詞 → 同步清理;10g 環境**預執行步驟 5 重建 EXU9SYNU 空視圖** 作為預防性維護。將上述腳本納入 CI/CD 發布前驗證,可將導出失敗率降至趨近於零。