Oracle資料庫DDL審計觸發器觸發的bug問題

shytodear發表於2016-12-07

     晚上加班要做oracle 12c資料庫PSU補丁升級,有業務同事說Oracle UNDO表空間耗盡,
登上去看,有個異常SQL在做delete全表的操作,表有1億多資料,大量佔用UNDO。
與業務同事商量,最後kill掉該會話,並加速回滾,並建議以後可改為truncate表操作。
等待回滾,只能推遲補丁升級的時間了!

接著在別的資料庫又遇到了問題,下面主要分析描述下:

一、案例現象:

環境:AIX平臺,Oracle 10.2.0.5.12

1、業務部門說資料泵expdp倒出報錯,倒出指令碼之前一直沒問題,報錯如下:
UDE-00008: operation generated ORACLE error 31623
ORA-31623: a job is not attached to this session via the specified handle
ORA-06512: at "SYS.DBMS_DATAPUMP", line 2772
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3886
ORA-06512: at line 1


2、查詢問題的過程中,又收到簡訊告警,該例項日誌檔案系統空間使用率100%。
發現資料庫產生了一個17G的core檔案,進行緊急清理。隨後檢查alert日誌有ORA-600錯誤:
Thu Nov 24 22:55:21 BEIST 2016
Errors in file /oraclelog/wkxdb/udump/wkxdb2_ora_22479732.trc:
ORA-00600: internal error code, arguments: [kole_t2u], [34], [], [], [], [], [], []

二、處理過程:

1、打算先幫同事看下資料泵的報錯:
a、調整引數streams_pool_size 、aq_tm_processes
b、檢視資料庫元件狀態dba_registry、檢視無效物件 
...
不斷的嘗試後資料泵報錯依舊!

2、這時資料庫又產生了一個17G的core檔案,緊急清理後,懷疑資料泵倒出報錯可能和這個ORA-600報錯有關係,
檢視相應的trace檔案,發現是一個常見的bug問題,擷取中文非法字元插入CLOB欄位,觸發Oracle BUG。
進一步檢視trace檔案中的sql是資料庫DDL審計語句(上幾天針對資料庫安全基線加固,建立了DDL審計觸發器)。

見MOS文件:
ORA-600 [kole_t2u], [34] - description, bugs, and reasons (文件 ID 734474.1)


發現了原因,先禁掉了DDL審計觸發器,ORA-600問題不再出現。執行資料泵倒出,也不再報錯,可以正常倒出
alter TRIGGER TRIG_AFTER_DDL disable;
說明這2個問題都跟DDL審計觸發器有關!


3、期間又有一個庫,日誌檔案系統空間使用率100%
環境:Oracle 11.2.0.4

資料庫alert日誌中一直報ORA-07445錯誤:
Fri Nov 25 00:02:44 2016
Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x90] [PC:0x10B1DC8D4, nszgclient()+2420] [flags: 0x0, count: 1]
Errors in file /oracle/app/oracle/diag/rdbms/wfddb/wfddb/trace/wfddb_m000_20323.trc  (incident=176012):
ORA-07445: exception encountered: core dump [nszgclient()+2420] [SIGSEGV] [ADDR:0x90] [PC:0x10B1DC8D4] [Address not mapped to object][]


##trace檔案:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /oracle/app/oracle/product/11.2.0
System name:    SunOS
Node name:      wfddb
Release:        5.10
Version:        Generic_147440-09
Machine:        sun4u
Instance name: wfddb
Redo thread mounted by this instance: 1
Oracle process number: 56
Unix process pid: 25659, image: oracle@wfddb (M000)


*** 2016-11-26 22:36:38.971
*** SESSION ID:(21.41901) 2016-11-26 22:36:38.971
*** CLIENT ID:() 2016-11-26 22:36:38.971
*** SERVICE NAME:(SYS$BACKGROUND) 2016-11-26 22:36:38.971
*** MODULE NAME:(MMON_SLAVE) 2016-11-26 22:36:38.971
*** ACTION NAME:(Auto-Flush Slave Action) 2016-11-26 22:36:38.971


Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x90] [PC:0x10B1DC8D4, nszgclient()+2420] [flags: 0x0, count: 1]

後臺程式M000觸發ddl trigger,不斷產生core檔案,導致檔案系統滿!
緊急清理了core檔案,禁掉了DDL觸發器,資料庫不再產生core檔案!

上面Oracle 10g的庫也偶爾會有ora-7445[nazsgcnm+0044]的報錯:
Sat Nov 26 18:31:45 BEIST 2016
Errors in file /oraclelog/wkxdb/bdump/wkxdb2_m000_9242408.trc:
ORA-07445: exception encountered: core dump [nazsgcnm+0044] [SIGSEGV] [Address not mapped to object] [0x7C7A03A67C724476] [] []
Sat Nov 26 18:31:46 BEIST 2016
Trace dumping is performing id=[cdmp_20161126183146]

三、最終處理辦法:
1、針對ora-600報錯:重建DDL審計表,用varchar2(4000)代替CLOB,並對觸發器程式碼進行相應調整,新增異常控制。
2、針對ora-7445報錯:由於是後臺程式M000觸發的,所以在DDL觸發器程式碼中增加了相應控制(判斷是後臺程式直接退出trigger)。
3、最後根據Oracle原廠建議:DDL觸發器還是慎用,最後禁掉了DDL觸發器。


####
BEGIN                 
  IF SYS_CONTEXT('USERENV', 'SERVICE_NAME') = 'SYS$BACKGROUND' THEN
    RETURN;        --exit the trigger
  END IF;


  BEGIN 
    v_num := ora_sql_txt(v_sql_text);
    FOR i IN 1 .. v_num LOOP
      v_sql_stmt := v_sql_stmt || v_sql_text(i);
    END LOOP;
  EXCEPTION
    WHEN OTHERS THEN    --ORA-06502: PL/SQL: numeric or value error: character string buffer too small
      NULL;
  END;




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

相關文章