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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27126919/viewspace-2129943/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值