utlrp.sql 一次性統一編譯無效物件(pl/sql procedure等)

tolywang發表於2007-08-31
....9.2.0/rdbms/admin/utlrp.sql
安裝patch後利用utlrp.sql編譯資料庫中無效物件

oracle9i資料庫在打patch後發現在alert中每天定時會產生一些ora-00600錯誤,錯誤程式碼為:

Errors in file /oracle/admin/c3rpt/bdump/c3rpt_j006_28040.trc:
ORA-00600: internal error code, arguments: [17069], [0x3E8C55AE0], [], [], [], [], [], []

在相應的trace檔案中可以看到如下資訊:

KSTDUMP: End of in-memory trace dump
ORA-00600: internal error code, arguments: [17069], [0x3E8C55AE0], [], [], [], [], [], []
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 1
OPIRIP: Uncaught error 447. Error stack:
ORA-00447: fatal error in background process
ORA-00600: internal error code, arguments: [17069], [0x3E8C55AE0], [], [], [], [], [], []
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 1

其中ora-06508資訊說明是要呼叫的物件不存在, 透過dba_objects查詢, 發現要呼叫的物件狀態為invalid, 在dba_objects中還存在一些這樣狀態的資料庫物件.

於是呼叫$ORACLE_HOME/RDBMS/ADMIN/utlrp.sql對資料庫中的invalid物件進行重新編譯.

編譯結束後連續跟蹤了幾天,沒有再次出現上述問題.

總結:utlrp.sql指令碼可以在資料庫執行的狀態下執行以編譯、資料庫中的invalid物件. oracle建議在對資料庫進行遷移、升級、降級後都執行一遍utlrp.sql以編譯無效物件。

為了保證系統的的資料詞典的完整性和有效性,最好的打patch後在migrate狀態下執行catpatch.sql,否則可能會在exp/imp時報EXP-00056: 遇到 ORACLE 錯誤 31600
ORA-31600: 輸入值 EMIT_SCHEMA 無效, 它用於引數 NAME, 位於函式 SET_TRANSFORM_PARAM 中
ORA-06512: 在"SYS.DBMS_SYS_ERROR", line 105
ORA-06512: 在"SYS.DBMS_METADATA_INT", line 3926
ORA-06512: 在"SYS.DBMS_METADATA_INT", line 4050
ORA-06512: 在"SYS.DBMS_METADATA", line 836
ORA-06512: 在line 1
EXP-00056: 遇到 ORACLE 錯誤 31600
ORA-31600: 輸入值 EMIT_SCHEMA 無效, 它用於引數 NAME, 位於函式 SET_TRANSFORM_PARAM 中
ORA-06512: 在"SYS.DBMS_SYS_ERROR", line 105
ORA-06512: 在"SYS.DBMS_METADATA_INT", line 3926
ORA-06512: 在"SYS.DBMS_METADATA_INT", line 4050
ORA-06512: 在"SYS.DBMS_METADATA", line 836
ORA-06512: 在line 1
EXP-00000: 匯出終止失敗
等錯誤

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章