解決ORA-600(16164)錯誤的過程(一)

yangtingkun發表於2009-01-04

在資料庫的alert檔案中發現了這個錯誤,這個bug似乎是由MERGE語句引起的。

 

 

錯誤資訊如下:

Errors in file /u1/oracle/admin/repdb01/bdump/repdb01_j000_20925.trc:
ORA-00600: internal error code, arguments: [16164], [0], [], [], [], [], [], []

對於的trace檔案中資訊為:

ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [16164], [0], [], [], [], [], [], []
Current SQL statement for this session:
MERGE /*+ append */ INTO
  MIS2_USER U
  USING (SELECT A.ID          USER_ID,
                A.CODE        CODE,
                A.ENABLE_FLAG USER_ENABLE_FLAG,
                B.ENABLE_FLAG ORG_ENABLE_FLAG,
                A.NAME        USER_NAME,
                B.NAME        ORG_NAME,
                C.DATA_ORG_ID ORG_ID,
                A.CREATE_DATE CREATE_DATE
           FROM GPO_USR_USER A, GPO_USR_ORG B, GPO_REG_ORG C
          WHERE A.ORG_ID = B.ID
            AND B.REG_ORG_ID = C.ID
            AND C.FACTORY_FLAG = '1'
         UNION ALL
         SELECT A.ID            USER_ID,
                A.USER_CODE     CODE,
                A.ENABLE_FLAG   USER_ENABLE_FLAG,
                B.ENABLE_FLAG   ORG_ENABLE_FLAG,
                A.USER_NAME     USER_NAME,
                B.NAME          ORG_NAME,
                A.DEFAULT_ORGID ORG_ID,
                A.CREATE_DATE   CREATE_DATE
           FROM USR_USER A, CAT_ORG B
          WHERE A.DEFAULT_ORGID = B.ID
            AND B.ORG_TYPE = '1') B
  ON (U.USER_ID = B.USER_ID)
  WHEN MATCHED THEN
    UPDATE
       SET U.CODE             = B.CODE,
           U.USER_ENABLE_FLAG = B.USER_ENABLE_FLAG,
           U.ORG_ENABLE_FLAG  = B.ORG_ENABLE_FLAG,
           U.USER_NAME        = B.USER_NAME,
           U.ORG_NAME         = B.ORG_NAME,
           U.ORG_ID           = B.ORG_ID
  WHEN NOT MATCHED THEN
    INSERT
      (USER_ID,
       CODE,
       USER_ENABLE_FLAG,
       ORG_ENABLE_FLAG,
       USER_NAME,
       ORG_NAME,
       ORG_ID,
       CREATE_DATE)
    VALUES
      (B.USER_ID,
       B.CODE,
       B.USER_ENABLE_FLAG,
       B.ORG_ENABLE_FLAG,
       B.USER_NAME,
       B.ORG_NAME,
       B.ORG_ID,
       B.CREATE_DATE)
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
6b1cea980       474  procedure MIS2.P_INIT_DATA
6a33fd260         1  anonymous block
----- Call Stack Trace -----
calling              call     entry                argument values in hex     
location             type     point                (? means dubious value)    
-------------------- -------- -------------------- ----------------------------
ksedmp()+328         CALL     ksedst()+0           FFFFFFFF7FFF5350 ?
                                                   000000000 ? 000000000 ?
                                                   00000003E ?
                                                   FFFFFFFF7FFF5BE8 ?
                                                   1031D56C8 ?
kgeriv()+208         PTR_CALL 0000000000000000     000000000 ? 000103400 ?
                                                   0001035D9 ? 000102C00 ?
                                                   1035D9000 ? 1035D9C28 ?
kgeasi()+180         CALL     kgeriv()+0           1035D9E88 ? 1036C7148 ?

錯誤SQL是一條MERGE語句,而查詢METALINK的結果也發現,這個bug確實和MERGE有關,且影響的資料庫版本就是9204Oracle10.1.0.29.2.0.5中改正了這個bug

Metalink文件Doc ID:  2754863.8中,描述了這個錯誤,不過並沒有對這個錯誤進行過多的描述,在bug文件Bug No. 2754863中,只是包含了一個引發這個錯誤的例子,並沒有詳細說明導致這個錯誤的原因,而且這個例子很複雜,SQL使用了CURSOR加表函式的方式獲取用來關聯的資料來源,在獲取內部查詢資料的時候還指定了ROWNUM。由於例子過於複雜,多個地方都可能引發這個錯誤,所以無法判斷導致問題的原因。

看來metalink只能給出錯誤的描述,在不升級版本的情況,沒有辦法指望metalink中的資訊來解決問題了。

 

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

相關文章