Email: service@parnassusdata.com 7 x 24 online support!

    You are here

    • You are here:
    • Home > Blogs > PDSERVICE's blog > Oracle ALERT Bug 18607546 ORA-600 [kdblkcheckerror]..[6266] 自己参照する行連鎖によるデータ破損で ORA-600 [kdsgrp1] / 結果不正 / ORA-8102

Oracle ALERT Bug 18607546 ORA-600 [kdblkcheckerror]..[6266] 自己参照する行連鎖によるデータ破損で ORA-600 [kdsgrp1] / 結果不正 / ORA-8102

Oracle ALERT Bug 18607546 ORA-600 [kdblkcheckerror]..[6266] 自己参照する行連鎖によるデータ破損で ORA-600 [kdsgrp1] / 結果不正 / ORA-8102

適用範囲:

Oracle Database - Enterprise Edition - バージョン 11.2.0.4 から 12.1.0.2 [リリース 11.2 から 12.1]

Oracle Database - Standard Edition - バージョン 11.2.0.4 から 12.1.0.2 [リリース 11.2 から 12.1]

この文書の内容はすべてのプラットフォームに適用されます。


本文書利用上のご注意

  本文書は英語で提供されている Document 1944645.1 (最終更新日: 2015年8月3日) の翻訳です。

  ご利用に際しては、英語の原文を併せてご参照頂くことをお勧めいたします。

 

説明

Bug 18607546 により、行連鎖した行が自分自身を連鎖先として参照してしまうため、表データの破損や結果不正が生じます。

発生条件

列数の多い表(例:255列以上)で発生しやすいといえますが、それ以下の表でも発生する可能性があります。

既に行連鎖が発生していて、なおかつ表の最後の列の値がNULLだったものをNULL以外の値で UPDATE する際に
この問題が発生する可能があります。行連鎖が発生していない行や、表の最後の列が NOT NULL として定義されて
いる表では、この問題は発生しません。

また、SYSの所有するディクショナリ表は、行連鎖が殆ど発生しないことや、行の末尾のNULLの値をNULL以外の値に
更新することのないため、この問題は発生いたしません。

実際の発生報告は 11.2.0.4 のみです。それ以前のリリース(10.2.0.4, 11.1, 11.2.0.1)では
この問題に類似する問題に関するこちらのドキュメントも参照ください。 Doc ID 7705591.8

 

現象

ORA-600 [kdsgrp1] が発生します。

db_block_checking が MEDIUM または FULL と設定されていた場合には、以下のように 
ORA-600 [kdBlkCheckError] というエラーが発生し、破損が検出されます。この際に、不正な
変更はロールバックされますので、破損ブロックがディスク上に反映されるのを防ぐことができます。
 

ORA-600 [kdBlkCheckError] [<file#>] [<block#>] [6266]

というエラーに伴い、トレースファイルに以下の出力があります。

kdrchk: Row piece pointing to itself

DBVerify や RMAN でも、上記のメッセージが出力されます。

db_block_checking が MEDIUM または FULL と設定されていない場合、ブロックの
不正な状態がディスク上にも反映され、その後に実行したSQL文の実行時に結果不正が生じたり、
以下のようなエラーが発生するという報告もあります。

ORA-8102 by UPDATE (if the table has indexes)
ORA-600 [kdsgrp1]
ORA-1499 by "analyze table <name> validate structure cascade" (logical corruption between index and table as the table is returning wrong values for the affected row)
 

回避策

破損が生じてしまった場合、以下の方法で対処を行います。

問題の生じている行をスキップして表を再作成する: "Create Table As Select (CTAS) where rowid != <rowid of head piece>" あるいは、query 句 (where rowid != <rowid of head piece>) を指定した datapump export を行い、表を truncate し、 import しなおす、などの方法が考えられます。

あるいは

dbms_repair パッケージを使用して問題のブロックを Soft Corrupt 状態とし、DMLでスキップされるようにする。

パッチ

Patch 18607546 をご利用ください。

この問題が修正されているバンドルパッチやリリース番号などの詳細は、 Doc ID 18607546.8 を参照ください。