我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

ORA-600(16515)错误

上一篇 / 下一篇  2008-03-24 23:50:16 / 个人分类:Bug

在协助其他部门迁移数据库的过程中,在一台9201服务器上发现了这个错误。

 

查询METALINK,发现ORA-600(16515)错误对应两种情况,一种是分区执行了SPLIT操作以后,再次收集统计信息报错。这种情况受影响的版本是92069207,在9208fixed

另一种是由于表中以及存在了统计,导致收集列的统计信息报错,可能发生这种情况的版本就包括9201。从版本上怀疑是第二种情况,下面登陆问题数据库具体检查一下。

Errors in file d:\oracle\admin\newzb\udump\newzb_j000_772.trc:ITPUB个人空间` e5PN5cW/B.[J
ORA-00600:
内部错误代码,参数: [16515], [D], [21], [39643], [5], [0], [], []
0Tz'jci(V0ORA-06512:
"SYS.DBMS_STATS", line 9136
&Q IY1BLw,M0ORA-06512:
"SYS.DBMS_STATS", line 9616ITPUB个人空间9@*HD'G1r5m:Z
ORA-06512:
"SYS.DBMS_STATS", line 9800
D @w,]"{FJe0ORA-06512:
"SYS.DBMS_STATS", line 9854ITPUB个人空间w3E9` a[#sw8F
ORA-06512:
"SYS.DBMS_STATS", line 9831
&f0Y)efO ]l4M5Yi-p3T0ORA-06512:
line 1

从服务器上alert文件中发现上面的错误,从对应的TRACE文件中找到出现问题JOB用户NI_JL013JOB语句:

DECLARE job BINARY_INTEGER := :job; next_date DATE := :mydate;  broken BOOLEAN := FALSE; BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT => 'FOR ALL INDEXED COLUMNS'); :mydate := next_date; IF broken THEN :b := 1; ELSE :b := 0; END IF; END;

NI_JL013用户登陆,手工执行收集统计信息的操作:

SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT=>'FOR ALL INDEXED COLUITPUB个人空间L{-?/QgGE
MNS');
1bwH7`;aT6FZ#u0BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT=>'FOR ALL INDEXED COLUMNS'ITPUB个人空间&j;B,{6IP3E
); END;

*ITPUB个人空间bU,N'j6VV
ERROR
位于第1:ITPUB个人空间[P"?D;q
ORA-00600:
内部错误代码,参数: [16515], [D], [40], [39643], [10], [0], [], []ITPUB个人空间7E1Y:Us4lH)D"y e
ORA-06512:
"SYS.DBMS_STATS", line 9136ITPUB个人空间(y)u4Z7tSX2gb
ORA-06512:
"SYS.DBMS_STATS", line 9616ITPUB个人空间nv4pU\
ORA-06512:
"SYS.DBMS_STATS", line 9800ITPUB个人空间7AAYI[6|
ORA-06512:
"SYS.DBMS_STATS", line 9854
S$KQV f&a0ORA-06512:
"SYS.DBMS_STATS", line 9831
x.}#us(rG3XmU0ORA-06512:
line 1

检测USER_TABLESLAST_ANALYZED列,找出问题表T_INVITE_M_DIVIDE

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT =>
kq G5rD)i0 'FOR ALL INDEXED COLUMNS')ITPUB个人空间/^L#nF'l2F:|
BEGIN DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT => 'FO
%rt%@FaR0R ALL INDEXED COLUMNS'); END;

*
uA4I:Hv-`0ERROR
位于第1:ITPUB个人空间 EI3U B!S*g
ORA-00600:
内部错误代码,参数: [16515], [D], [40], [39643], [10], [0], [], []
3S5i"{;yzb7}Km,e.Y0ORA-06512:
"SYS.DBMS_STATS", line 9136
kIo,T._v0ORA-06512:
"SYS.DBMS_STATS", line 9150ITPUB个人空间/D1F)dWQ [
ORA-06512:
line 1

现在问题已经定位到表上了,根据metalink文档Note 2252824.8的描述,删除统计信息,然后重新收集,可以解决这个问题:

SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE')

PL/SQL过程已成功完成。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT =>ITPUB个人空间3YU&Eg7Yq D8T Z
 'FOR ALL INDEXED COLUMNS')

PL/SQL过程已成功完成。

想要重现问题也很简单,只需要使用ANALYZE语法收集一下统计信息就可以了:

SQL> ANALYZE TABLE T_INVITE_M_DIVIDE COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;

表已分析。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT =>ITPUB个人空间kw;wy|/S+v
 'FOR ALL INDEXED COLUMNS')ITPUB个人空间*[{%w5m|j
BEGIN DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT => 'FO
Uz2y(pS&z0R ALL INDEXED COLUMNS'); END;

*
rv VM-J{7O!q5A2K0ERROR
位于第1:
2O Q{0h {Q0O{.v;\U0ORA-00600:
内部错误代码,参数: [16515], [D], [40], [39643], [10], [0], [], []
9tuJ3Jdd0ORA-06512:
"SYS.DBMS_STATS", line 9136ITPUB个人空间"kF9B["h&sX-W
ORA-06512:
"SYS.DBMS_STATS", line 9150
rQ7{WD tA#hQ+g0ORA-06512:
line 1

通过对问题的分析,除了将数据库版本升级到9202以上外,还可以通过修改统计信息脚本的方式来避免问题。

在每次收集统计信息前,可以先执行DBMS_STATS.DELETE_SCHEMA_STATS,这样随后的统计信息收集工作就不会报错了。

不过这要求统计信息统计的工作比较在夜里没有工作进行的时候运行,否则在DELETE_SCHEMA_STATSGATHER_SCHEMA_STATS之间登陆的用户,很可能会使用RBO作为优化模式。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar