天天看点

ORA-00600[6711]错误一例

一套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-&gt;</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&gt; </code><code>set</code> <code>linesize 200;</code>

<code>SQL&gt; </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&gt; analyze </code><code>table</code> <code>SMON_SCN_TIME validate structure;</code>

<code>Table</code> <code>analyzed.</code>

<code>SQL&gt;analyze </code><code>table</code> <code>SMON_SCN_TIME validate structure </code><code>cascade</code><code>;</code>

<code>SQL&gt; analyze cluster SMON_SCN_TO_TIME validate structure;</code>

<code>Cluster analyzed.</code>

<code>SQL&gt; 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&gt; </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&gt; </code><code>drop</code> <code>index</code> <code>smon_scn_to_time_idx ;</code>

<code>Index</code> <code>dropped.</code>

<code>SQL&gt; </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