1. 程式人生 > >The Invalid Object of Oracle Database

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]
blog comments powered by Disqus