OracleデータベースにおけるORA-01122エラーの解決

エラーの概要

  • ORA-01122: 「データベースファイルの照合検査でエラーが発生しました」
  • 伴うエラー: 通常はORA-01110、ORA-01201、ORA-01202、ORA-01204、ORA-01205と共に発生します。
  • 意味: データベースファイルと制御ファイルの情報に不一致があることを示します。

一般的な原因

  1. ファイルヘッダの不一致: ファイルヘッダと制御ファイルに記録されたファイルサイズまたは作成時間の不一致。
  2. 不正確なファイルサイズ: 制御ファイルに記録されたサイズが実際のファイルサイズと一致しない。
  3. 作成時間の差異: ファイルヘッダと制御ファイルに記録された作成時間に違いがある。
  4. システム変更番号(SCN)の問題: ファイルヘッダと制御ファイルに記録されたSCNに不一致がある。
  5. 誤ったファイル番号: ファイルヘッダに記録されたファイル番号が誤っている。
  6. 誤ったファイルタイプ: ファイルヘッダに記録されたファイルタイプ番号がデータファイルタイプと一致しない。
  7. データベースIDの不一致: ファイルヘッダに記録されたデータベースIDが制御ファイルに記録されたIDと一致しない。

診断ステップ

  1. ファイルの状態確認: v$datafileビューを使用して、どのファイルがオンラインまたはオフラインかを確認します。
  2. データファイルヘッダのダンプ: alter session set events ‘immediate trace name file_hdrs level 10’;コマンドを使用してデータファイルヘッダをダンプし、分析します。
  3. トレースファイルの分析: トレースファイルを作成し、不一致を見つけ出します。

解決策

  1. オフラインファイルのリカバリ
    • ファイルがオフラインで必要なデータが含まれている場合は、バックアップからファイルをリカバリします。
    • リカバリ後、データベースがマウントまたはクロスモードの場合は、ファイルの状態をオンラインに変更します。
    • データベースがオープン状態の場合は、リカバリ中はファイルをオフラインのままにし、リカバリ後にオンラインに変更します。
  2. オンラインで破損したファイルの処理
    • データベースが稼働しているが、破損したデータファイルが不要な場合は、ファイルをオフラインにして対応する表領域を削除します。
    • データベースが破損したファイルのために起動できない場合は、ファイルをオフラインにしてリカバリプロセスを繰り返します。
  3. データファイルの交換
    • ファイルが回復不可能な場合は、バックアップからの交換を検討します。
  4. Oracleサポートへの相談
    • 複雑なケースでは、ガイダンスのためにOracle技術サポートに連絡することが推奨されます。

重要な考慮事項

  • バックアップの検証:常にバックアップが最新で信頼性があることを確認してください。
  • 影響評価:影響を受けるデータの重要性とリカバリまたは交換の影響を理解してください。
  • データの一貫性:リカバリ後、データの一貫性と完全性を確認してください。

結論

ORA-01122エラーは、Oracleデータベースのデータファイル情報と制御ファイル記録の不一致を示しています。このエラーを解決するには、一連の診断およびリカバリステップを実施する必要があります。解決方法は、不一致の性質と影響を受けるファイルの状態によって異なります。内部の不整合が複雑である場合やデータが重要である場合は、Oracleの技術サポートチームに相談することをお勧めします。

ORA-1110 、ORA-1122がエラが一緒に現れたとは該当する番号/名前のデータファイルにトラブルが起こったと意味する。例えば、ORA-1200はデータファイルが現れるとはデータファイル自身の大きさが予想した大きさより小さいである。
完全なバックアップとアーカイブを持っているデータベースに対して、RESTORE、REOCOVERでデータファイルをリカバリしてください。何の物理バックアップがないデータベースに対して、DDなどの方法でデータファイルの大きさを修正することによって、トラブルを避けられる。けど、これはせいぜいトラブルを避けるだけで、なくしたデータはリカバリできない。

[質問]
DBのOPEN時に以下のエラーが発生します。

SQL> startup
ORACLE instance started.
Total System Global Area      57483672 bytes
Fixed Size                       38980 bytes
Variable Size                 42240340 bytes
Database Buffers              13107200 bytes
Redo Buffers                   2097152 bytes
Database mounted.
ORA-01122: database file 5 failed verification check
ORA-01110: data file 5: 'D:\ORA817\ORADATA\ORA817\USERS01.DBF'
ORA-01207: file is more recent than control file - old control file

[回答]
原因となるエラーは、ORA-1207 ファイルが制御ファイルより新しくなっています(制御ファイルが古い) です。
このエラーは、制御ファイルとデータファイルヘッダの持つSCNが一致しないために発生します。
制御ファイルだけを過去のbackupから戻した場合や、マシンクラッシュなどの障害によって
データファイルヘッダの情報と制御ファイルの情報に不整合が生じてしまったようなケースもあります。

このような状態は、ログファイルの適用でリカバリすることができます。
但し、以下のものが必要です。
 -最新の状態のオンラインREDOログ
 -アーカイブログモードの場合は、最新までのアーカイブログすべて
  (ノーアーカイブログモードでも起動できる可能性がありますので下記をご確認ください)

-----
mountモードで起動後

recover database using backup controlfile;
 このコマンドを実行すると、以下が表示されます。

  ORA-00279: 変更: 363383(08/09/02 10:46:35で生成)にはスレッド番号: 1が必要です。
  ORA-00289: 検討すべきログ・ファイル: D:\ORA817\ORADATA\ORA817\archive\arch1_335.dbf
  ORA-00280: 変更: 363383(スレッド: 1)は順序番号: 335に存在します。
  ログを指定してください: {<RET>=suggested | filename | AUTO | CANCEL}

 ここでアーカイブログの指定を行います。 
 検討すべきログファイルで問題なければリターンキーを押します。
 別の場所に該当のアーカイブログがある場合は、フルパスでファイル名を指定してリターンキーを押します。

 ログの適用を続けていくと、最新のアーカイブログを適用したにもかかわらず
 まだリカバリ完了のメッセージが出力されない(次のログを要求される)状態になります。
 これは、using backup controlfile句を使用した場合は
 現在のオンラインREDOログの情報がないためで、アーカイブログのsuggestionのみ行われます。
 (using backup controlfile/until cancelを指定していないリカバリでは自動で
  オンラインREDOを参照し、リカバリが行われます。)
 上記のログ指定プロンプトで、オンラインREDOログ名をフルパスで指定する必要があります。
 
 どのREDOログが必要かをディクショナリ等で確認できませんので
 うまくいかない場合は、別のREDOlogを指定してご確認ください。
 誤ったREDOログの指定をした場合には、以下のエラーが発生しますが
 誤ったREDOログが適用されてしまうようなことはございません。
 
  ORA-310:アーカイブログは順序番号nnnを含んでいますが、順序番号nnnが必要です。

 再度 recover database using backup controlfile; を実行して
 正しいREDOログファイル名を指定すれば問題ありません。

 最新の状態までログの適用が完了すれば、以下のメッセージが表示されます。

 ログが適用されました。
 メディア・リカバリが完了しました。
 
上記の対処は基本的にアーカイブログモードの場合にアーカイブログを適用していく手順ですが、
ノーアーカイブログモードの場合でも、リカバリに必要なオンラインREDOログが
まだ上書きされていなければ、オンラインREDOログの適用だけでリカバリできます。

recover database using backup controlfile;
を実行後、ログの指定でオンラインREDOログをフルパスで指定してください。 



 ログが適用されました。
 メディア・リカバリが完了しました。

このメッセージが表示されたら、以下のコマンドを使用してDBをOPENしてください。
alter database open resetlogs;

上記でうまくリカバリができない場合は、制御ファイルの再作成による復旧をご検討ください。

[参考資料]
DSI Advanced Backup, Restore and Recovery Techniques の資料を一部参照

[Error#]
ORA-1207