一套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