暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库DDL审计触发器触发的bug问题

东方宏达EHONDA 2016-12-02
565

晚上加班要做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;


文章转载自东方宏达EHONDA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论