つい先日、お客様から「システムが使えない」と連絡がありOracleに接続できていないことが判明。
原因はデータファイル破損でした。それを復旧したときのメモです。

まず、現在の状況がどうなっているのかを確認するためにSQL*PlusにsysユーザでSYSDBA権限で接続します。

sqlplus / as sysdba

現在の状態を確認します。

SQL> select status from v$instance;

STATUS
-----------------------------
MOUNTED

どうやらマウントはできている様子、オープンしてみます。

SQL> alter database open;
ALTER DATABASE OPEN
*
行1でエラーが発生しました。:
ORA-01172: スレッド1のリカバリは停止しました (ブロック 111455、ファイル 6)。
ORA-01151: メディア・リカバリを使用してブロックのリカバリを行い、必要であればバックアップのリストアをおこなってください

データファイルの6番が破損しているらしくオープンできません…。
なので、immediateモードでシャットダウンさせて
リカバリモードでオープンしてみます。

SQL> shutdown immediate;
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました
SQL> startup open recover;
…省略…
ORA-01172: スレッド1のリカバリは停止しました (ブロック 111455、ファイル 6)。
ORA-01151: メディア・リカバリを使用してブロックのリカバリを行い、必要であればバックアップのリストアをおこなってください

結果は変わらず、オープンできないままです。

そこで、RMANを使ってリカバリを実行してみます。
ローカルをターゲットとしてRMANでOracleインスタンスに接続します。

rman target / nocatalog

データファイルの6番をリストアします。

RMAN> restore datafile 6;
restoreが開始されました(開始時間: 13-01-10)
・
・
・
restoreが完了しました(完了時間: 13-01-10)

データファイルの6番をリカバーします。

RMAN> recover datafile 6;
recoverが開始されました(開始時間: 13-01-10)
・
・
・
recoverが完了しました(開始時間: 13-01-10)

RMANを終了させます。

RMAN> quit
Recovery Managerが完了しました。

リカバリが完了したので、SQL*Plusからオープンさせます。

sqlplus / as sysdba
SQL> alter database open;

データベースが変更されました。

データベースが正常にオープンしました!
幸運だったのは、バックアップとREDOログが揃っていたこと。
そのおかげで障害が発生する直前の状態まで戻すことができました。

ちなみに、データファイルの番号を確認にするにはSQL*Plusを使って確認できます。

sqlplus / as sysdba
SQL> select name,file#,status from v$datafile;

NAME        FILE#  STATUS
--------- ---  ----
…省略…/AAA.ORA  1    ONLINE
・
・
・
…省略…/OOO.ORA  6    ONLINE

6行が選択されました。

接続できなくなったときは青くなりましたが、良い経験をさせてもらいました。