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

Oracle ORA-600 [4000] が発生し、DATABASE起動不可

Oracle ORA-600 [4000] が発生し、DATABASE起動不可

ORACLEデータベース によくあるエラ の解決策

プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com

 

[起こりうる現象]
ORA-600 [4000] によりDBの起動不可。

以下のような bootstrap$ に対して alter文 を実行すると、ORA-701が発生します。

  alter table bootstrap$ storage (freelists 10); 

% oerr ora 701
00701, 00000, "object necessary for warmstarting database cannot be altered"
// *Cause:  Attempt to alter or drop a database object (table, cluster, or index)
//          which are needed for warmstarting the database.
// *Action: None.

実際に alter文 は上記エラーにより実行できませんが、その後DBを再起動すると、
ORA-600[4000]、ORA-704 が発生し、起動ができなくなります。

トレースファイルは以下のような出力になります。

ksedmp: internal or fatal error
ORA-00600: ?????????,??:[4000],[1],[],[],[],[],[],[]
Current SQL statement for this session:
select line#, sql_text from bootstrap$ where obj# != :1
----- Call Stack Trace -----
calling              call     entry                argument values in hex
location             type     point                (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedmp()+168         CALL     ksedst()+0           540 ? 0 ? FFBE90B0 ?
                                                   FFBE8B54 ? FFBE8B38 ? 0 ?
kgeriv()+196         PTR_CALL 00000000             3 ? 0 ? 0 ? 258 ? 1 ? FA0 ?
kgeasi()+164         CALL     kgeriv()+0           18600FC ? 18CDFF0 ? 14ABF20 ?
                                                   1 ? FFBE9878 ? 1850398 ?
ktudba()+440         CALL     kgeasi()+0           18600FC ? 18CDFF0 ? FA0 ? 2 ?
                                                   1 ? 0 ?
ktugusc()+776        CALL     ktudba()+0           1 ? FFBE990C ? 0 ? FFBE9914 ?
                                                   FFBE990C ? 0 ?
ktugti()+196         CALL     ktugusc()+0          FFBE99A0 ? 1 ? 1 ? 0 ? 0 ?
                                                   0 ?
ktuxcm()+28          CALL     ktugti()+0           FFBE9C00 ? 0 ? 0 ? 0 ?
                                                   800F6AAC ? 0 ?
ktecgetsh()+372      CALL     ktuxcm()+0           FFBE9C00 ? 1000000 ? 1 ?
                                                   80044658 ? 800C82DC ?
                                                   800C82D8 ?
ktecgsh()+252        CALL     ktecgetsh()+0        FFBE9D6C ? 1 ? FFBE9AE8 ? 4 ?
                                                   1 ? FFBE9D6C ?
kteinicnt()+216      CALL     ktecgsh()+0          FFBE9D6C ? 1 ? 4 ? 2 ? 0 ?
                                                   FFBE9D6D ?
qertbFetch()+472     CALL     kteinicnt()+0        FFBE9F70 ? 0 ? 0 ? FFBE9F6C ?
                                                   0 ? 0 ?
opifch()+4664        PTR_CALL 00000000             17 ? 0 ? 10000 ? 18D9C24 ?
                                                   0 ? 18D9C14 ?

[対象リリース]
問題が発生するリリース  :8.1.6, 8.1.7, 9.0.1, 9.2.0
問題を修正したリリース  :Oracle Database 10g (10.1.0)
問題を修正予定のリリース:なし
問題を修正したPSR       :なし
問題を修正予定のPSR     :なし

[対象プラットフォーム]
すべてのプラットフォーム

[起こりうる条件]
次の条件を満たす場合に発生します。

 - bootstrap$ に対して alter文 を実行後に、DBを再起動

[原因]
製品の不具合です。

ORA-600[4000]は、undo segemnt番号を獲得するのに失敗した場合に発生するエラーです。
ORA-701が返されるまでに、内部的に bootstrap$表のsegment header情報の更新を行うための
DISK LOCKが獲得されるのですが、そのDISK LOCKに対するundoが生成されないために、
ORA-701により処理がROLLBACKされても、DISK LOCKが開放されない状態になります。
その後、DBが起動されると、bootstrap$表がlockされているため そのlockを開放(cleanup)しよう
とするのですが、undo segmentがonlineになっていないため、ORA-600[4000] が発生します。
(今回の場合、たとえ undo segmentがonlineであったとしても、DISK LOCKに対するundoが
 存在しないため、cleanupはできません。)

[回避策]
bootstrap$ に対して alter文 を実行しないでください。
alter文を実行してしまった場合、alter文を実行する前までの状態に、BACKUPからリカバリ
する必要があります。

もし、ORA-701 が発生した時点のままデータベースが起動している場合には、以下のコマンド
を実行する事で、現象の発生を回避する事が可能です。

  SQL> select * from sys.bootstrap$;