The Invalid Object of Oracle Database
異常症狀
在Oracle EBS系統中可以正常開啟物料編輯頁面,輸入料號、描述等,選擇物料模板,點選 儲存按鈕儲存;此時切換到組織屬性或組織分配頁,再切換回物料屬性頁或者按料號查詢該 物料,均無法找到該物料的資訊;直接在資料庫中查詢該物料為空。
異常確認
登入到Oracle ERP系統,輸入物料確實無法儲存;最大化編輯頁面,Oracle Forms左下角沒 有儲存資料的事務操作提示。
環境
- Oracle RDBMS : 11.1.0.7.0
- Oracle Applications : 12.1.1
異常解決
在ERP伺服器上部署了一些定時任務,其中每天結束前(23:55)會定時檢查資料庫系統的警 告日誌,若有錯誤,則會發送郵件通知。
2012-10-29 收到來自此ERP系統的警告日誌郵件通知。
警告日誌
alert_PROD.log.2012-10-28
Fri Oct 26 14:24:24 2012 Errors in file /u1/PROD/prodora/db/tech_st/11.1.0/admin/PROD_poprod/diag/rdbms/prod/ PROD/trace/PROD_ora_14573.trc (incident=22169): ORA-00600: internal error code, arguments: [qcsgpvc3], [], [], [], [], [], [], [], [], [], [], [] Incident details in: /u1/PROD/prodora/db/tech_st/11.1.0/admin/PROD_poprod/diag/rdbms/ prod/PROD/incident/incdir_22169/PROD_ora_14573_i22169.trc Non critical error ORA-48913 caught while writing to trace file "/u1/PROD/prodora/db/tech_st/11.1.0/admin/PROD_poprod/diag/rdbms/ prod/PROD/incident/incdir_22169/PROD_ora_14573_i22169.trc" Error message: ORA-48913: Writing into trace file failed, file size limit [10485760] reached Writing to the above trace file is disabled for now on...
跟蹤日誌
PROD_ora_14573_i22169.trc
... ... *** 2012-10-26 14:24:24.811 *** SESSION ID:(307.48840) 2012-10-26 14:24:24.811 *** CLIENT ID:() 2012-10-26 14:24:24.811 *** SERVICE NAME:(PROD) 2012-10-26 14:24:24.811 *** MODULE NAME:(PL/SQL Developer) 2012-10-26 14:24:24.811 *** ACTION NAME:(Main session) 2012-10-26 14:24:24.811 Dump continued from file: /u1/PROD/prodora/db/tech_st/11.1.0/admin/PROD_poprod/diag/rdbms/PROD_ora_14573.trc
PROD_ora_14573.trc
ORA-00600: internal error code, arguments: [qcsgpvc3], [], [], [], [], [], [], [], [], [], [], []
========= Dump for incident 22169 (ORA 600 [qcsgpvc3]) ========
----- Beginning of Customized Incident Dump(s) -----
QCSGPVC3: icodefs yet to be processed = 1
QCSGPVC3: ico = 0x7fa94803cad0
QCSGPVC3: ico->icocop = 0x7fa9478e3ab8
QCSGPVC3: ico->icocop->colkcc = (nil)
QCDDMP: -------------------------------------------------------
QCDDMP: qcsgpvc3_CTX: [0x7fa94801ee10]
QCDDMP: {
QCDDMP: ->ctxqbc: [0x7fa94801d068]
QCDDMP: {
QCDDMP: ->qbcqtxt: N/A
QCDDMP: ->qbcfro: [0x7fa94801d3f0]
QCDDMP: {
QCDDMP: ->frooid: [(nil)]
QCDDMP: ->frotni: MTL_SYSTEM_ITEMS_INTERFACE
QCDDMP: ->froaid: MTL_SYSTEM_ITEMS_INTERFACE
QCDDMP: ->frotyp = 2
QCDDMP: ->froflg = 0x4b
... ...
其中MTL_SYSTEM_ITEMS_INTERFACE表為物料介面表,用於臨時儲存物料資訊。無法儲存物 料,可能和此表異常相關。
在MOS上找到關於ORA-600[qcsgpvc3]的一篇文件,有可能是儲存過程依賴的表結構發生了變 更,重新編譯儲存過程時會出現此錯誤。
根據此文件,在R12的測試環境上進行測試,過程如下:
SQL> create table xx_qcsgpvc( c1 varchar2(60),c2 number);
Table created.
SQL> create or replace package xx_qcsgpvc_p is
2 procedure po(c1 varchar2, c2 number);
3 end xx_qcsgpvc_p;
4 /
Package created.
SQL> create or replace package body xx_qcsgpvc_p is
2 procedure po(c1 varchar2,c2 number)
3 is
4 begin
5 insert into xx_qcsgpvc(c1,c2) values (c1,c2);
6 end po;
7 end xx_qcsgpvc_p;
8 /
Package body created.
SQL> alter table xx_qcsgpvc rename column c2 to i_problem;
Table altered.
SQL> alter package xx_qcsgpvc_p compile body;
Warning: Package Body altered with compilation errors.
警告日誌
alert_VIS.ora
Mon Oct 29 09:15:01 2012
Errors in file
/u1/VIS/visora/db/tech_st/11.1.0/admin/VIS_demoerp/diag/rdbms/
vis/VIS/trace/VIS_ora_925.trc (incident=24961):
ORA-00600: internal error code, arguments: [qcsgpvc3], [], [], [], [], [], [], [], [], [], [], []
Incident details in:
/u1/VIS/visora/db/tech_st/11.1.0/admin/VIS_demoerp/diag/rdbms/vis/
VIS/incident/incdir_24961/VIS_ora_925_i24961.trc
跟蹤日誌
VIS_ora_925_i24961.trc
... ...
*** 2012-10-29 09:15:01.536
*** SESSION ID:(278.26930) 2012-10-29 09:15:01.536
*** CLIENT ID:() 2012-10-29 09:15:01.536
*** SERVICE NAME:(SYS$USERS) 2012-10-29 09:15:01.536
*** MODULE NAME:(SQL*Plus) 2012-10-29 09:15:01.536
*** ACTION NAME:() 2012-10-29 09:15:01.536
Dump continued from file:
/u1/VIS/visora/db/tech_st/11.1.0/admin/VIS_demoerp/diag/rdbms/
vis/VIS/trace/VIS_ora_925.trc
ORA-00600: internal error code, arguments: [qcsgpvc3], [], [], [], [], [], [], [], [], [], [], []
========= Dump for incident 24961 (ORA 600 [qcsgpvc3]) ========
----- Beginning of Customized Incident Dump(s) -----
QCSGPVC3: icodefs yet to be processed = 1
QCSGPVC3: ico = 0x7fc230514c90
QCSGPVC3: ico->icocop = 0x7fc2305152b8
QCSGPVC3: ico->icocop->colkcc = (nil)
QCDDMP: -------------------------------------------------------
QCDDMP: qcsgpvc3_CTX: [0x7fc2305106b8]
QCDDMP: {
QCDDMP: ->ctxqbc: [0x7fc230514438]
QCDDMP: {
QCDDMP: ->qbcqtxt: N/A
QCDDMP: ->qbcfro: [0x7fc2305147c0]
QCDDMP: {
QCDDMP: ->frooid: [(nil)]
QCDDMP: ->frotni: XX_QCSGPVC
QCDDMP: ->froaid: XX_QCSGPVC
QCDDMP: ->frotyp = 2
QCDDMP: ->froflg = 0x43
... ...
根據以上日誌,可能是系統物件做過更改,導致依賴於這些物件的儲存過程失效而無法正常 執行。
檢視物料相關表建立編譯時間
SELECT owner,
object_name,
object_type,
created,
last_ddl_time,
TIMESTAMP,
status
FROM dba_objects do
WHERE do.object_name IN ('MTL_SYSTEM_ITEMS_INTERFACE', 'MTL_SYSTEM_ITEMS_B');
物料表和物料介面表近期均未更改和重編譯。
緊接著查詢系統無效物件
無效物件
SELECT owner,
object_name,
object_type,
status
FROM dba_objects
WHERE status = 'INVALID'
ORDER BY owner,
object_type,
object_name;
output:
APPS OE_ITEMS_MV MATERIALIZED VIEW INVALID
APPS XX_IMPORT_MATERIEL_PCK PACKAGE BODY INVALID
APPS XX_ITEM_DEFAULT_SUBINVENTORY TRIGGER INVALID
無效物件和依賴關係
SELECT object_name,
object_type,
referenced_owner,
referenced_type,
referenced_name
FROM user_objects,
user_dependencies
WHERE object_name = NAME
AND status != 'VALID'
ORDER BY object_name,
object_type,
referenced_owner,
referenced_type,
referenced_name;
生成無效物件的編譯指令碼
SELECT decode(object_type,
'PACKAGE BODY',
'alter package ' || owner || '.' || object_name ||
' compile body;',
'alter ' || object_type || ' ' || owner || '.' || object_name ||
' compile;')
FROM dba_objects
WHERE status = 'INVALID'
AND object_type IN ('PACKAGE BODY',
'PACKAGE',
'FUNCTION',
'PROCEDURE',
'TRIGGER',
'VIEW')
ORDER BY object_type,
object_name;
編譯後,還有無效觸發器APPS.XX_ITEM_DEFAULT_SUBINVENTORY
。
再次嘗試新建物料時,依然無法儲存。
通過與客製化開發人員溝通,瞭解到最近在嘗試開發物料匯入功能,以減輕物料錄入的負 擔。此觸發器在11i中使用過,但在R12中不再使用,這裡暫且drop掉該觸發器或者禁用該觸 發器:
DROP TRIGGER apps.XX_ITEM_DEFAULT_SUBINVENTORY;
再次嘗試新建物料時,可以正常儲存。
根據ORA-600[qcsgpvc3]的錯誤提示以及近期有客製化功能開發可以總結,因物件結構發生 變更使得系統中存在一些無效物件從而導致物料無法儲存。在本例中,引起物料無法儲存的 應是依賴於物料基礎表MTL_SYSTEMS_ITEM_B的觸發器XX_ITEM_DEFAULT_SUBINVENTORY無效, 即當對物料基礎表進行插入操作時該觸發器無法執行,導致整個操作失敗。在客製化開發過 程中,涉及到更改標準功能或者系統標準物件等,因Oracle系統的龐大和複雜性,無法確定 做出更改後所有功能都可以正常使用;但對資料庫系統的日常維護來說,定期檢查和編譯無 效物件是必須的,否則某些功能將不能正常執行。
指令碼
檢查資料庫系統警告日誌,結合crontab,若有ora error message,則傳送郵件通知
checkalert.sh
#!/bin/sh
#abstract:
#oracle database daily alert check and send mail notifications if ora error messages occur
#history:
#2012-08-14 [email protected] first release
#variables
script_basepath=/u1/PROD/prodora/itsection/adm/sql
mail_date=$(date +%Y-%m-%d\ %H:%M:%S)
receipt=[email protected]
hostname=$(hostname)
#path
ORACLE_HOME=/u1/PROD/prodora/db/tech_st/11.1.0
export ORACLE_HOME
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:
$ORACLE_HOME/bin
export PATH
ORACLE_SID=PROD
export ORACLE_SID
#sql log file
script_name=alert
sqllog="${script_basepath}/${script_name}.log"
#check alert log
if [ "${script_name}" == "alert" ]; then
alert_basepath=/u1/PROD/prodora/db/tech_st/11.1.0/admin/PROD_poprod/diag/rdbms/prod/PROD/trace
alert_log=${alert_basepath}/alert_$ORACLE_SID.log
if [ -f ${alert_log} ]; then
current_date=$(date +%F)
current_log=${alert_log}.${current_date}
mv ${alert_log} ${current_log}
touch ${alert_log}
grep -i ORA- ${current_log} > ${sqllog}
else
echo -e "Oracle Instance alert log file ${alert_log} does not exist!"
touch ${alert_log}
fi
fi
#mail
if [ ! -e ${sqllog} ]; then
echo -e "sqllog file ${sqllog} does not exist!"
exit 0
fi
if [ `cat ${sqllog} | wc -l` -gt 0 ]; then
cat ${sqllog} | mail -s "${mail_date}:${hostname} dba daily check of ${script_name}" ${receipt}
fi
參考
- Bug 7172752 - OERI[qcsgpvc3] recompiling a package body [ID 7172752.8]
- Invalid Objects In Oracle Applications FAQ [ID 104457.1]