データファイルが全滅・・ぶっ壊れた!

こんな由々しき事態に遭遇したら、冷や汗タラタラものだが
データファイルのバックアップとアーカイブログがあればリカバリ可能だ。
こんな時ほど、ナメるなよ!と DBA 魂を全開に。

対処は recover database コマンドで行うが、色々と手順を踏む必要がある。
ここではオンラインバックアップからの戻しを想定した、メディアリカバリの方法を紹介する。
(制御ファイルやREDOログファイルは生きている前提)



recover databaseによるメディアリカバリ

(1) アラートログを参照しエラー状態を確認

発生し得るエラーは、ORA-01171、ORA01122、ORA-01115 などがある。

※以後、アラートログを参照しつつ作業することをお勧めする。
Unix/Linuxの場合は、tail -f コマンドが便利。

(2) データベースの接続確認・強制終了

$ sqlplus / as sysdba
SQL> shutdown abort

ログインできた場合は abort オプションで強制シャットダウン
この場合、デフォルトの normal や immediate は不可。

(3) バックアップからデータファイルをリストア

オンラインバックアップで取得したデータファイルを OS コマンドで戻す。

(4) マウントモードで起動

$ sqlplus / as sysdba
停止状態のため、 アイドル・インスタンスへ接続 と表示される。

SQL> startup mount
正常にマウントされることを確認。

(5) データファイルのステータス確認

SQL> select name, status from v$datafile;
ステータスが ONLINE であることを確認。
※system 表領域のみ、ステータスが SYSTEM となる。

もしオフラインのデータファイルが存在するなら、以下の SQL コマンドを実行。
alter database datafile '対象ファイル(フルパス)' online;

(6) アーカイブの自動リカバリモードを有効化

SQL> set autorecovery on

(7) リカバリを実施

SQL> recover database;

ロールフォワードにより障害発生直前の状態までリカバリする。

インスタンスを起動

SQL> alter database open;

アラートログにエラーが出力されておらず、正常にアクセス可能であることを確認する。

以上でリカバリ終了。可能なら復旧したタイミングで、コールドバックアップを取得。

データファイル全損を想定したリカバリケースだったが、
単一障害でも手順に大差はなく、リストア対象が異なるくらいである。

また、ロールフォワードでは、対象のアーカイブログが1グループでも
損失している場合は、完全リカバリは行えなくなる(不完全リカバリ)。

多重化されたうち、1メンバーでも健在であれば完全リカバリ可能なので、
復旧してから健在なREDOログを元に損失メンバーを再作成すればよい。