故障现象:
Dump continued from file: /u01/app/oracle/diag/rdbms/test/test1/trace/test1_ora_50647.trc
ORA-00600: internal error code, arguments: [13013], [5001], [455035], [67227408], [31], [67227408], [17], [], [], [], [], []
报错SQL:
- update TEST a
- set (a.A, a.B, a.C, a.A) =
- (select b.A,
- b.B,
- b.C,
- b.A
- from TEST1 b
- where a.A = :1
- and a.B = b.B
- and a.A = b.A
- and trim(a.A) is not null
- and instr(',' || :2 || ',', ',' || a.A || ',') > 0)
- where exists
- (select 1
- from TEST2 c
- where a.A = :3
- and a.A = c.A
- and a.A = c.A
- and trim(a.A) is not null
- and instr(',' || :4 || ',', ',' || a.A || ',') > 0)
某金融客户晚上跑批一个月出现三次该错误,前两次分析以为数据库坏块对表进行move 错误临时解决但是再次出现。
问题分析:
通过对报错代码转换
ORA-00600: internal error code, arguments: [13013], [5001], [455035], [67227408], [31], [67227408], [17], [], [], [], [], []
select dbms_utility.data_block_address_file(67227408) Rfile# ,dbms_utility.data_block_address_block(67227408) "Block#" from dual;
可以得到最终出问题的为表 TEST
排除坏块导致的问题需要做以下操作
- analyze table <owner>.<table name> validate structure cascade online ;
—正常无报错
报错核心函数 updThreePhaseExe 通过MOS查看到有不少BUG,发现有个BUG跟 _add_col_optim_enabled 相关。
通过以下SQL 确认该表是否使用该特性:
- select object_name, name
- from dba_objects, col$
- where bitand(col$.PROPERTY, 1073741824) = 1073741824
- and object_id = obj#
确认该表存在10几个使用了该特性的列并,但是使用了该特性未必会触发该BUG,客户希望找到触发的根源。
通过查看该表的数据,发现虽然列使用了_add_col_optim_enabled 特性但是该列中的数据不是默认值也就是被修改过,关于11G default not null 特性可以自行百度。
问题复现:
按照客户该业务逻辑以及表数据方式进行模拟测试
- CREATE TABLE TAB1 ( ID_NACE NUMBER(5) );
- insert into TAB1 values(0);
- ALTER TABLE TAB1 ADD (
- ID_INDUSTRY NUMBER(5) DEFAULT -1 NOT NULL
- );
- ALTER TABLE TAB1 ADD (
- ID_ind2 varchar2(1) DEFAULT 'U' NOT NULL);
- ALTER TABLE TAB1 ADD (err varchar2(30) );
- insert into TAB1 values(1, 1, 'C',null);
- insert into TAB1 values(2, 2, 'C',null);
- drop table tab2;
- CREATE TABLE TAB2 (
- ID_NACE NUMBER(5),
- ID_INDUSTRY NUMBER(5)
- );
- insert into TAB2 values(1, 3);
- commit;
- SQL> update tab1
- 2 set err = 'xxxxx'
- 3 where id_ind2 = 'C'
- 4 and not exists (select 1 from tab2 where tab2.id_nace = tab1.id_nace and
- 5 tab2.ID_INDUSTRY = tab1.ID_INDUSTRY);
- update tab1
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [13013], [5001], [90537], [4290641],
[3], [4290641], [17], [], [], [], [], []
在测试环境复现出该问题(12c 未复现,11.2.0.4最新PSU依然复现)。
问题根源:使用了_add_col_optim_enabled特性对表增加有默认值的列之后,该列实际存储的又被更改过。
在对该表进行update/merge 时候如果where 条件中使用该列进行关联那么将会触发该BUG
触发条件:
1.<=11.2.0.4
2.针对某一张表增加有默认值的列,并且使用到了_add_col_optim_enabled特性
3.业务实际写入或者又去修改了该默认值
4.对该表进行update/merge 时候where 条件中有该列的关联
解决方案:
1.针对以后新增加的表可以关闭_add_col_optim_enabled 特性,但是关闭之后无法使用该特性针对大表增加有默认值的列需要注意,会比较慢。
alter system set “_add_col_optim_enabled”=false;
2.临时解决通过对该表重建,问题得以解决。注意move 表是无法解决因为还是依然使用,需要新创建一张表然后insert into,如果该表之间create 时候有默认值然后去insert 是不会触发该bug。
参考:
Bug 16086769 - ORA-600 [13011] ORA-600 [13013] when executing a DML if the WHERE clause includes an added column with a default value (Doc ID 16086769.8)