一套Linux上的10.2.0.4系统,日志中频繁出现ORA-00600[6711]内部错误:
<a href="http://blog.51cto.com/maclean/1277546#">?</a>
<code>Wed Sep 1 21:24:30 2010</code>
<code>Errors </code><code>in</code> <code>file /s01/10gdb/admin/YOUYUS/bdump/youyus_smon_5622.trc:</code>
<code>ORA-00600: internal error code, arguments: [6711], [4256248], [1], [4256242], [0], [], [], []</code>
<code>Wed Sep 1 21:24:31 2010</code>
<code>Non-fatal internal error happenned while SMON was doing logging scn-></code><code>time</code> <code>mapping.</code>
MOS上有一个关于6711内部错误十分简单的Note,该文档声称出现6711错误极有可能是部分类型为簇(cluster)的数据字典表存在潜在的讹误,这个Note甚至没有告诉我们该错误argument参数的意义。 不过其实我们可以猜出来,因为是和corruption相关的错误,那么实际上可能关联的几个因素无非是obj#,file#,block#;4256248和4256242 两个数字像极了Data Block Address,把他们当做dba来看待,也就指向了1号数据文件的61938块和61944数据块,我们来看看这些块属于哪个对象:
<code>SQL> </code><code>set</code> <code>linesize 200;</code>
<code>SQL> </code><code>select</code> <code>segment_name, segment_type</code>
<code> </code><code>2 </code><code>from</code> <code>dba_extents</code>
<code> </code><code>3 </code><code>where</code> <code>relative_fno = 1</code>
<code> </code><code>4 </code><code>and</code> <code>(61938 </code><code>between</code> <code>block_id </code><code>and</code> <code>block_id + blocks </code><code>or</code>
<code> </code><code>5 61944 </code><code>between</code> <code>block_id </code><code>and</code> <code>block_id + blocks);</code>
<code>SEGMENT_NAME SEGMENT_TYPE</code>
<code>--------------------------------------------------------------------------------- ------------------</code>
<code>SMON_SCN_TO_TIME CLUSTER</code>
不出意料是一个cluster,SMON_SCN_TO_TIME是SMON_SCN_TIME表的基簇,SMON_SCN_TIME表用以记录数据库中scn对应的时间戳。我们直接查看用以创建数据字典的sql.bsq文件,可以进一步了解他们的结构:
<code>cat $ORACLE_HOME/rdbms/admin/sql.bsq|grep -A 24 </code><code>"create cluster smon_scn_to_time"</code>
<code>create</code> <code>cluster smon_scn_to_time (</code>
<code> </code><code>thread number /* thread, compatibility */</code>
<code>)</code>
<code>/</code>
<code>create</code> <code>index</code> <code>smon_scn_to_time_idx </code><code>on</code> <code>cluster smon_scn_to_time</code>
<code>create</code> <code>table</code> <code>smon_scn_time (</code>
<code> </code><code>thread number, /* thread, compatibility */</code>
<code> </code><code>time_mp number, /* </code><code>time</code> <code>this recent scn represents */</code>
<code> </code><code>time_dp </code><code>date</code><code>, /* </code><code>time</code> <code>as</code> <code>date</code><code>, compatibility */</code>
<code> </code><code>scn_wrp number, /* scn.wrp, compatibility */</code>
<code> </code><code>scn_bas number, /* scn.bas, compatibility */</code>
<code> </code><code>num_mappings number,</code>
<code> </code><code>tim_scn_map raw(1200),</code>
<code> </code><code>scn number </code><code>default</code> <code>0, /* scn */</code>
<code> </code><code>orig_thread number </code><code>default</code> <code>0 /* </code><code>for</code> <code>downgrade */</code>
<code>) cluster smon_scn_to_time (thread)</code>
<code>create</code> <code>unique</code> <code>index</code> <code>smon_scn_time_tim_idx </code><code>on</code> <code>smon_scn_time(time_mp)</code>
<code>create</code> <code>unique</code> <code>index</code> <code>smon_scn_time_scn_idx </code><code>on</code> <code>smon_scn_time(scn)</code>
从以上脚本可以看到这个簇上存在多个索引,我们需要进一步validate验证所有这些对象:
<code>SQL> analyze </code><code>table</code> <code>SMON_SCN_TIME validate structure;</code>
<code>Table</code> <code>analyzed.</code>
<code>SQL>analyze </code><code>table</code> <code>SMON_SCN_TIME validate structure </code><code>cascade</code><code>;</code>
<code>SQL> analyze cluster SMON_SCN_TO_TIME validate structure;</code>
<code>Cluster analyzed.</code>
<code>SQL> analyze cluster SMON_SCN_TO_TIME validate structure </code><code>cascade</code><code>;</code>
<code>analyze cluster SMON_SCN_TO_TIME validate structure </code><code>cascade</code>
<code>*</code>
<code>ERROR </code><code>at</code> <code>line 1:</code>
<code>ORA-01499: </code><code>table</code><code>/</code><code>index</code> <code>cross</code> <code>reference failure - see trace file</code>
到这里问题已经很清晰了,问题出在SMON_SCN_TO_TIME的索引smon_scn_to_time_idx身上,极有可能是该索引上出现了逻辑讹误。所幸有问题的仅仅是索引,找出问题所在后要解决就显得容易得多了:
<code>SQL> </code><code>alter</code> <code>index</code> <code>smon_scn_to_time_idx rebuild ;</code>
<code>Index</code> <code>altered.</code>
<code>/* 在索引出现讹误的情况下仅仅rebuild往往是无效的,在我们rebuild的同时告警日志中再次出现了ORA-00600[6711]错误 !!! */</code>
<code>/* 我们需要的彻底把有问题的索引</code><code>drop</code><code>掉,并再次创建!!! */</code>
<code>SQL> </code><code>drop</code> <code>index</code> <code>smon_scn_to_time_idx ;</code>
<code>Index</code> <code>dropped.</code>
<code>SQL> </code><code>create</code> <code>index</code> <code>smon_scn_to_time_idx </code><code>on</code> <code>cluster smon_scn_to_time;</code>
<code>Index</code> <code>created.</code>
<code>/* 至此问题解决,告警日志中不再出现错误! * /</code>
<code>/* That's great! * /</code>
本文转自maclean_007 51CTO博客,原文链接:http://blog.51cto.com/maclean/1277546