【Oracle】ORA-01113の原因と解決方法|file needs media recovery・データファイルのリカバリが必要な時の確認ポイント

【Oracle】ORA-01113の原因と解決方法|file needs media recovery・データファイルのリカバリが必要な時の確認ポイント Oracle

ORA-01113: file n needs media recovery は、Oracle Databaseで対象データファイルにメディアリカバリが必要な状態のまま、データベースをOPENしたり、データファイルをONLINEにしようとした時に発生するエラーです。検索では file needs media recovery と省略して探されることも多いです。多くの場合、直後に ORA-01110 が続き、どのデータファイルが問題なのかが表示されます。

このエラーは、単に ALTER DATABASE OPEN を再実行して直るタイプではありません。対象ファイルを特定し、必要なアーカイブログやREDOを適用してからOPENします。直前にRMANリストア、制御ファイル復元、データファイルコピー、障害復旧、Data Guard操作をしている場合は、復旧方針を確認してから進めます。

先に結論
まず ORA-01110 で対象データファイル番号とパスを確認します。次に v$recover_filev$datafilev$database、alert.logで復旧が必要な範囲を見ます。単一ファイルなら RECOVER DATAFILE、DB全体なら RECOVER DATABASE、RMAN管理ならRMANで復旧します。
スポンサーリンク

復旧前に確認すること

ORA-01113は復旧操作に直結するエラーなので、コマンドを打つ前に現状を残します。特に本番環境では、対象ファイル、必要なアーカイブログ、直前に行った操作、バックアップの有無を確認してから進めます。

対象ファイル

ORA-01110v$recover_filev$datafile でファイル番号とパスを確認します。

必要なログ

リカバリに必要なアーカイブログやオンラインREDOが残っているかを確認します。足りない場合は復旧方針が変わります。

直前の操作

RMANリストア、OSコピー、ストレージ復元、制御ファイル復元、Data Guard操作のどれが直前にあったかを整理します。

現状保全

可能ならalert.log、RMAN出力、対象ファイル情報、バックアップ一覧を保存してから復旧作業に入ります。

ORA-01113とは

Oracle公式のエラー説明では、ORA-01113は、メディアリカバリが必要なファイルを含む状態で、データベースのOPENやファイルのONLINEを試みた時に発生します。対処は、まず対象ファイルへメディアリカバリを適用することです。

前段のエラーとして ORA-01109 database not open が出ることもあります。ORA-01109はOPENされていない状態を示し、ORA-01113はOPENできない理由として、データファイル側にリカバリが必要なことを示します。

ORA-01110で対象ファイルを確認する

ORA-01113は、対象ファイル番号だけでは判断しにくいため、併発する ORA-01110 を見ます。ORA-01110は別エラーの詳細として、対象データファイル番号とファイル名を表示する補助的なメッセージです。

error-example.txt
ORA-01113: file 7 needs media recovery
ORA-01110: data file 7: '/u01/app/oracle/oradata/ORCL/users02.dbf'

この例では、データファイル番号 7users02.dbf が復旧対象です。まずファイル番号とパスを控え、以降の確認SQLで状態を見ます。

復旧が必要なファイルを一覧する

v$recover_file は、リカバリが必要なファイルの確認に使います。ORA-01113の対象が1ファイルだけなのか、複数ファイルなのかを最初に確認します。

check-recover-file.sql
SELECT file#,
       online_status,
       error,
       change#,
       time
FROM v$recover_file
ORDER BY file#;
check-datafile-status.sql
SELECT df.file#,
       df.name,
       df.status,
       df.enabled,
       df.checkpoint_change#,
       ts.name AS tablespace_name
FROM v$datafile df
JOIN v$tablespace ts
  ON ts.ts# = df.ts#
ORDER BY df.file#;

対象が特定の表領域だけなら、表領域単位やデータファイル単位での復旧を検討します。RMANでの表領域復旧は 特定の表領域だけを復元する方法、表領域バックアップは RMANで表領域単位のバックアップを取得する方法 も参考になります。

alert.logで前後のエラーを確認する

ORA-01113だけを見るのではなく、アラートログで前後に出ているエラーを確認します。どのファイルで、どの時点のリカバリを要求しているのか、追加でORA-01110、ORA-01157、ORA-01589などが出ていないかを見ます。

check-diagnostic-dest.sql
SELECT name,
       value
FROM v$diag_info
WHERE name IN ('Diag Trace', 'Diag Alert');
alert-log-recovery-check.sh
# Linux例: Diag Traceで確認したディレクトリに移動して直近ログを見る
cd /u01/app/oracle/diag/rdbms/orcl/ORCL/trace
tail -n 300 alert_ORCL.log

# 関連エラーだけ拾う例
grep -Ei 'ORA-01113|ORA-01110|ORA-01157|ORA-01589|media recovery|RESETLOGS' alert_ORCL.log

データベース全体の状態を確認する

ファイル単位の状態だけでなく、データベース全体がMOUNTなのか、OPENしようとして失敗しているのか、Data Guard構成なのかも確認します。

check-database-role.sql
SELECT name,
       open_mode,
       database_role,
       controlfile_type,
       checkpoint_change#
FROM v$database;

CONTROLFILE_TYPE がバックアップ制御ファイルを示す場合や、不完全リカバリ後の場合は、OPEN RESETLOGS が必要になることがあります。制御ファイルやSPFILEの復元が絡む場合は 制御ファイルとSPFILEのバックアップ・復元 を確認してください。

単一ファイルをリカバリする

対象が特定のデータファイルだけで、必要なアーカイブログやREDOがそろっている場合は、SQL*Plusから RECOVER DATAFILE を実行できます。

recover-datafile.sql
sqlplus / as sysdba

SELECT file#, name FROM v$datafile WHERE file# = 7;

RECOVER DATAFILE 7;

ALTER DATABASE DATAFILE 7 ONLINE;

SELECT * FROM v$recover_file WHERE file# = 7;
SYSTEM/SYSAUX/UNDOは慎重に扱う
SYSTEM、SYSAUX、UNDO表領域のデータファイルでORA-01113が出ている場合、影響範囲が大きくなります。単純なONLINE操作ではなく、DB全体のリカバリやMOUNT状態での復旧が必要になることがあります。

データベース全体をリカバリする

複数ファイルが対象、またはOPEN時に全体としてリカバリを要求される場合は、RECOVER DATABASE を検討します。この操作は復旧方針に関わるため、バックアップ、アーカイブログ、直前の障害内容を確認してから実行します。

recover-database.sql
sqlplus / as sysdba

STARTUP MOUNT;

RECOVER DATABASE;

ALTER DATABASE OPEN;

アーカイブログが不足している場合、リカバリは途中で止まります。FRA不足やアーカイブログ削除が絡む場合は ORA-00257の記事RMANでアーカイブログを自動削除する方法 も合わせて確認してください。

アーカイブログが足りるか確認する

ORA-01113の復旧では、必要な変更を適用するためのアーカイブログやREDOが必要です。ログが不足している場合、完全リカバリではなく、復旧可能な時点への不完全リカバリを検討することになります。

check-archive-log-mode.sql
ARCHIVE LOG LIST;

SELECT name,
       open_mode,
       log_mode,
       checkpoint_change#
FROM v$database;
rman-list-archivelog.rman
rman target /

LIST BACKUP OF ARCHIVELOG ALL;
LIST ARCHIVELOG ALL;
CROSSCHECK ARCHIVELOG ALL;
ログがない場合は無理に進めない
必要なアーカイブログがない状態で完全リカバリを続けることはできません。復旧可能な時点、業務影響、バックアップ世代を確認し、不完全リカバリやRESETLOGSの判断に進みます。

RMANで確認・復旧する

本番環境では、RMANでバックアップとリカバリを管理していることが多いです。RMANを使う場合は、対象ファイルの状態確認、リストア、リカバリをRMAN側で実行します。

rman-recover-datafile.rman
rman target /

LIST BACKUP OF DATAFILE 7;
REPORT NEED BACKUP;

LIST FAILURE;
ADVISE FAILURE;

RESTORE DATAFILE 7;
RECOVER DATAFILE 7;

SQL 'ALTER DATABASE DATAFILE 7 ONLINE';
rman-validate-database.rman
rman target /

RESTORE DATABASE VALIDATE;
RECOVER DATABASE VALIDATE;

RMANの基本コマンドやバックアップ運用は RMAN完全ガイド を参照してください。テーブル単位の復旧が目的なら 指定したテーブルのみリストアする方法 も選択肢になります。

OPEN RESETLOGSが必要な場合

不完全リカバリやバックアップ制御ファイルを使ったリカバリの後は、ORA-01589 が出て RESETLOGS または NORESETLOGS の指定を求められることがあります。これは復旧手順上の重要な分岐です。

open-resetlogs.sql
-- 不完全リカバリ後など、必要な場合だけ実行
ALTER DATABASE OPEN RESETLOGS;

-- RESETLOGS後は必ず新しいバックアップを取得する
-- RMAN例:
-- BACKUP DATABASE PLUS ARCHIVELOG;
RESETLOGSは最終判断として扱う
OPEN RESETLOGS はログ系列を切り替える重要操作です。実行前に、復旧地点、必要なREDO/アーカイブログの有無、業務影響、実行後のフルバックアップ取得を確認します。

Data Guard環境での注意点

Data Guard環境では、スタンバイDBのデータファイルやアーカイブログ適用状態が原因でORA-01113が見えることがあります。プライマリと同じ手順で安易にOPENやRESETLOGSを実行せず、ロールと適用状態を確認します。

check-dataguard-recovery.sql
SELECT name,
       open_mode,
       database_role,
       switchover_status
FROM v$database;

SELECT process,
       status,
       thread#,
       sequence#
FROM v$managed_standby
ORDER BY process;

Data Guard構成の切り分けは Data Guard完全ガイド を参照してください。スタンバイDBを通常DBとして開く操作は、運用設計やロール遷移に関わるため、手順を確認してから行います。

よくある原因

RMANリストア後にRECOVERしていない

データファイルを戻しただけで、必要なREDOやアーカイブログを適用していない状態です。

アーカイブログが不足している

復旧に必要なログが削除済み、退避漏れ、FRA不足で欠けているケースです。復旧可能地点を見直します。

制御ファイル復元後の整合性差

バックアップ制御ファイルとデータファイルのSCNに差があり、追加リカバリやRESETLOGS判断が必要になります。

データファイルだけ古いものに戻した

OSコピーやストレージ復元で一部データファイルだけ古い時点に戻り、他ファイルや制御ファイルとSCNが合わない状態です。

Data Guardの適用遅延・構成不整合

スタンバイ側でREDO適用が追いついていない、またはファイル配置やログ適用に問題があるケースです。

ORA-01109・ORA-01110・ORA-01589との関係

ORA-01113

対象データファイルにメディアリカバリが必要なことを示します。復旧対象を確認してRECOVERします。

ORA-01110

対象データファイル番号とファイル名を示す補助メッセージです。ORA-01113などの原因特定に使います。

ORA-01109

データベースがOPENされていない状態です。OPENできない理由としてORA-01113が続くことがあります。

ORA-01589

不完全リカバリやバックアップ制御ファイルリカバリ後、OPEN時にRESETLOGS/NORESETLOGSの指定が必要な状態です。

対応手順のまとめ

  1. ORA-01110 で対象データファイル番号とパスを確認する
  2. v$recover_file で復旧が必要なファイル一覧を確認する
  3. alert.logで前後の関連エラーとメディアリカバリ要求を確認する
  4. v$datafilev$database で状態、表領域、ロールを確認する
  5. アーカイブログやRMANバックアップが復旧に足りるか確認する
  6. 単一ファイルなら RECOVER DATAFILE、複数や全体なら RECOVER DATABASE を検討する
  7. RMAN管理ならRMANで RESTORE / RECOVER / VALIDATE を実行する
  8. OPEN時に ORA-01589 が出たら、RESETLOGS/NORESETLOGSの判断を慎重に行う
  9. 復旧後はOPEN確認、アプリ接続確認、新しいバックアップ取得まで行う

よくある質問

ORA-01113はALTER DATABASE OPENで直りますか?

通常は直りません。対象ファイルにメディアリカバリが必要な状態なので、先に RECOVER DATAFILERECOVER DATABASE を実行します。

ORA-01110はエラー原因ですか?

ORA-01110は対象ファイルを示す補助メッセージです。原因そのものは、併発しているORA-01113などの関連エラーで判断します。

アーカイブログがない場合はどうしますか?

必要なログがなければ完全リカバリできない可能性があります。バックアップから復旧可能な時点を見直し、不完全リカバリやRESETLOGSの判断が必要になります。

RESETLOGS後にやることはありますか?

新しいログ系列になるため、復旧後に新しいフルバックアップを取得します。RMAN運用ならバックアップ方針とリカバリカタログの状態も確認します。

参考