ここではSYSTEM表領域に障害が発生した場合を例に挙げ、リカバリの手順を説明します。
SYSTEM表領域はインスタンスが稼働するために必須の領域であり、オフラインにすることはできません。このため、SYSTEM表領域に障害が発生した場合には、いったんインスタンスを停止する必要があります。
先にも説明したように障害が発生した場合には、アラートログ、動的パーフォマンス・ビュー(v$recover_file、v$datafile_header)を確認し、どのデータファイルに障害が発生したのかを確認します。
リスト1は、SYSTEM表領域に障害が発生した場合のアラートログへの出力例です。
oracle@single> view /opt/app/oracle/admin/v102/bdump/alert_v102.log …… Sun Jan 28 02:57:34 2007 Errors in file /opt/app/oracle/admin/v102/bdump/v102_ckpt_13596.trc: ORA-01243: system tablespace file suffered media failure ORA-01122: database file 1 failed verification check ORA-01110: data file 1: '/opt/app/oracle/oradata/system01.dbf' ORA-01251: Unknown File Header Version read for file number 1 CKPT: terminating instance due to error 1243 ……
SYSTEM表領域に障害が発生している場合には、インスタンスを停止してからデータベースをmountモードで起動し直す必要があります。まだインスタンスが起動している場合には、インスタンスを強制停止します。
上述した「1.障害個所の確認」のように、SYSTEM表領域のデータファイル(および、ほかに障害が確認されたデータファイル)にて障害が発生していることが確認できた場合、対象のデータファイルをバックアップからリストアします(リスト2)。
oracle@single> cp -p /work/ONLINE_BACKUP/system01.dbf /opt/app/oracle/ oradata/
アーカイブREDOログファイル、オンラインREDOログファイルを使用して、リストアしたデータファイルを障害発生直前の状態までリカバリします。
リカバリのコマンドは、「ALTER DATABASE RECOVER」文ではなく、SQL*Plusの「RECOVER DATABASE」文を使用する方が一般的です。
また、アーカイブREDOログファイルを自動的にすべて反映させる場合には、SET句で「AUTORECOVERY ON」を設定することで可能になります(リスト3)。
SQL> startup mount ORACLEインスタンスが起動しました。 Total System Global Area 109051904 bytes Fixed Size 1217980 bytes Variable Size 83888708 bytes Database Buffers 20971520 bytes Redo Buffers 2973696 bytes データベースがマウントされました。 SQL> SQL> set autorecovery on SQL> recover database …… ORA-00279: 変更3811478(01/28/2007 03:08:40で生成)にはスレッド1が必要です ORA-00289: 検討すべきログ・ファイル: /opt/app/oracle/archive/1_17_611947833.dbf ORA-00280: 変更3811478(スレッド1)は順序番号17に存在します。 ORA-00278: ログ・ファイル'/opt/app/oracle/archive/1_16_611947833.dbf'はこのリカバリでは必要なくなりました ログが適用されました。 メディア・リカバリが完了しました。
アーカイブREDOログファイルを、初期化パラメータ「LOG_ARCHIVE_DEST」など、本来のディレクトリ下でなく、別のディレクトリに保存している場合や、障害により一時的に別のディレクトリ下にある場合、以下のいずれかの方法でリカバリに使用するアーカイブREDOログファイルの場所を設定します。
ただし、ALTER SYSTEM文によって初期化パラメータ「LOG_ARCHIVE_DEST」を変更した場合、アーカイブREDOログファイルの出力先も変更されるため、SET文のLOGSOURCEを設定する方法やRECOVER AUTOMATIC FROM文でアーカイブREDOログファイルの出力先を設定する方法が推奨されます。
動的パフォーマンス・ビューのv$recover_fileにレコードがなく、v$datafile_headerのERROR列がNULLであることを確認し、表領域が正常にリカバリできたことを確認します。(リスト4)。
SQL> select t.name tablespace_name, d.name file_name, r.* from v$recover_file r,v$datafile d,v$tablespace t 2 where r.file# = d.file# 3 and d.ts# = t.ts#; レコードが選択されませんでした。 SQL> select tablespace_name,name,error,recover,fuzzy,checkpoint_change#,checkpoint_time from v$datafile_header; TABLESPACE_NAME NAME ERROR REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_TIME ------------------------------ ---------------------------------------- -------------------- --- --- ------------------ ------------------- SYSTEM /opt/app/oracle/oradata/system01.dbf NO NO 3811488 2007/01/28 03:08:47 UNDOTBS1 /opt/app/oracle/oradata/undotbs01.dbf NO NO 3811488 2007/01/28 03:08:47 SYSAUX /opt/app/oracle/oradata/sysaux01.dbf NO NO 3811488 2007/01/28 03:08:47 USERS /opt/app/oracle/oradata/users01.dbf NO NO 3811488 2007/01/28 03:08:47 USERS02 /opt/app/oracle/oradata/users02.dbf NO NO 3811488 2007/01/28 03:08:47 USERS03 /opt/app/oracle/oradata/users03.dbf NO NO 3811488 2007/01/28 03:08:47 6行が選択されました。
リカバリが正常に完了したので、運用を再開するためにデータベースをオープンします。これでオフラインリカバリの手順は終了です(リスト5)。
SQL> alter database open; データベースが変更されました。
Copyright © ITmedia, Inc. All Rights Reserved.