Oracle資料庫DDL審計觸發器觸發的bug問題
晚上加班要做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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE DDL觸發器Oracle觸發器
- oracle ddl 觸發器Oracle觸發器
- 資料庫觸發器,禁止DDL操作資料庫觸發器
- 審計資料庫登陸登出觸發器資料庫觸發器
- ORACLE資料庫DDL審計觸發器與隱藏引數_system_trig_enabledOracle資料庫觸發器
- 審計資料庫登陸失敗觸發器資料庫觸發器
- oracle trigger觸發器審計schema物件的變更ddlOracle觸發器物件
- Oracle 觸發器 限制DDL操作Oracle觸發器
- Oracle使用系統級觸發器審計重要帳號的DDL語句Oracle觸發器
- 觸發器限制指定IP訪問oracle資料庫觸發器Oracle資料庫
- oracle觸發器~ 更新多表的問題Oracle觸發器
- DML操作 DDL觸發器觸發器
- Oracle中審計刪除(DELETE)操作的觸發器Oracledelete觸發器
- Oracle觸發器觸發級別Oracle觸發器
- 資料庫開發---常用物件-觸發器資料庫物件觸發器
- Oracle觸發器死鎖問題解決Oracle觸發器
- oracle巧用觸發器提高資料庫安全級別Oracle觸發器資料庫
- Oracle觸發器Oracle觸發器
- SQL資料庫觸發器例項SQL資料庫觸發器
- oracle 觸發器實現禁止在資料庫中建立dblink ---透過觸發器實現Oracle觸發器資料庫
- Oracle觸發器6(建立系統事件觸發器)Oracle觸發器事件
- 根據業務寫觸發器(oracle觸發器片)觸發器Oracle
- oralce觸發器解決問題觸發器
- SQL Server資料庫級別觸發器SQLServer資料庫觸發器
- Oracle之觸發器Oracle觸發器
- Oracle使用觸發器實現ID自增的問題Oracle觸發器
- SQL Server 2005中使用DDL觸發器監控資料庫變化SQLServer觸發器資料庫
- 10.1.0.3delete觸發器的bug3Ddelete觸發器
- 透過觸發器禁止模式物件的DDL操作觸發器模式物件
- oracle 觸發器的例項Oracle觸發器
- ORACLE觸發器詳解Oracle觸發器
- Oracle登陸觸發器Oracle觸發器
- oracle 觸發器-表同步Oracle觸發器
- Oracle 登入觸發器Oracle觸發器
- oracle 觸發器 client 事件Oracle觸發器client事件
- 資料庫DDL操作審計資料庫
- oracle變異表觸發器相關問題解決Oracle觸發器
- Oracle開發基礎-觸發器Oracle觸發器