首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 非法物件導致 EXP/EXPDP 失效:同義詞懸空、JVM 錯誤、視圖重建完整排查指南

     編輯:Oracle 資料庫基礎

前言

EXP-00008 ORA-03113 (10g) 或 ORA-00980 (8i) 伴隨 ORA-07445 [joe_well_known_internal],核心原因往往是**同義詞指向已刪除物件**、**JVM 內部函數解析失敗**、**視圖定義殘留無效引用**。本文提供從現象到根因的標準化排查腳本與修復流程。

一、典型錯誤現象

版本導出工具錯誤碼跟蹤關鍵字
10gEXPEXP-00008 ORA-03113DBMS_JAVA.LONGNAME, EXU9SYNU
8iEXPORA-00980同義詞轉換失敗

二、標準化排查腳本 (按順序執行)

步驟 1:重編譯所有無效物件

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

步驟 2:檢測懸空同義詞 (USER_OBJECTS 顯示 VALID 但實際不可用)

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" 即為懸空同義詞

步驟 3:徹底清理懸空同義詞並重建

-- 針對每個報錯同義詞
DROP SYNONYM "synonym_name";  -- 雙引號防大小寫/特殊字符
CREATE SYNONYM "synonym_name" FOR "owner"."table_name";

步驟 4:清理頑固物件 (雙引號強制刪除)


DROP TABLE scott."emp" CASCADE CONSTRAINTS;
DROP TRIGGER scott."trigger_name";

步驟 5:JVM 相關錯誤終極方案 — 重建系統視圖 EXU9SYNU

若上述步驟完成仍報 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 常見) 解析 EXU9SYNUORA-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 發布前驗證,可將導出失敗率降至趨近於零。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved