9章 REDOログファイルのリカバリ
本章ではREDOログファイルが破損した場合のリカバリについて確認していきます。
REDOログファイルのリカバリ概要
REDOログファイルは多重化が可能です。
1部のメンバーが破損した場合は、コピーを行うことで復旧が可能です。
REDOログファイル全損時は、REDOログファイルがカレントであるか、
そうでないかによってリカバリ方法が異なります。
インスタンス障害時はカレントREDOログに最新の変更情報が格納されている為、
その変更情報を使用してインスタンスリカバリを行います。
その為、カレントREDOログが破損してしまうと、インスタンス障害時、
最新の変更情報が適用できず、整合性を保つことが出来なくなる為、
データベースは起動できません。
カレントでないREDOログに関しては、アーカイブログに出力されていれば、
不要な変更情報しかない為、そのREDOログが破損していても、内容をクリアすれば
DB起動が可能です。
REDOログファイルメンバーの一部破損
@破損していないメンバーのREDOログをコピー
REDOログファイルの一部の破損であれば、DBを停止せずに復旧が可能です。
REDOログファイルの復旧方法として一番簡単なリカバリ方法です。
カレントでないREDOログファイルメンバー全破損
カレントでないREDOログファイルメンバー全破損
@DBを停止(DBが起動中の場合)
AREDOログファイルのクリア
BDBを起動
カレントでないREDOログファイルメンバー全破損
カレントでないREDOログファイルメンバー全破損
カレントでないREDOログの場合は、バックアップリストアは不要です。
破損したREDOログファイルをクリアするコマンドを実施して起動します。
カレントREDOログファイルメンバー全破損
@DBを停止(DBが起動中の場合)
Aバックアップリストア
B不完全リカバリ実施
CDBを起動
カレントのREDOログはまだデータファイルに適用できていない更新情報も含まれる為、そのREDOログファイルが破損すると、
DBの一貫性が保てなくなり、DBは不整合の状態となってしまいます。
カレントREDOログが破損した場合は、DBは起動できなくなる為、バックアップからの不完全リカバリ必要になります。完全リカバリはカレントのREDOログが必要である為、実施できません。
カレントでないREDOログのリカバリ
カレントREDOリカバリ作業は不完全リカバリの手順と同じ方法で方式なので、今回はカレントでないREDOログの全破損時を見ていきましょう。
  SQL> select g.group#,f.member,g.status from v$log g,v$logfile f
    2  where g.group# = f.group#
    3  order by group#;
      GROUP# MEMBER                                           STATUS
  ---------- ------------------------------------------------ ----------------
           1 /u01/app/oracle/12101/oradata/ORCL/redo01.log    CURRENT
           2 /u01/app/oracle/12101/oradata/ORCL/redo02.log    UNUSED
           3 /u01/app/oracle/12101/oradata/ORCL/redo03.log    UNUSED
上記SQLはREDOログファイルの情報を取得しています。今回の構成はメンバーは1つのみです。
カレントのREDOログは「redo01.log」なので、redo02.logを削除してみます。
  SQL> !rm /u01/app/oracle/12101/oradata/ORCL/redo02.log
  SQL> startup force
  
  ORACLE instance started.
  Total System Global Area 1068937216 bytes
  Fixed Size                  2296576 bytes
  Variable Size             746587392 bytes
  Database Buffers          314572800 bytes
  Redo Buffers                5480448 bytes
  Database mounted.
  ORA-03113: end-of-file on communication channel
  Process ID: 16178
  Session ID: 751 Serial number: 5
REDOログファイルを削除した為、起動エラーとなりました。アラートログファイルを確認してみます。
  SQL> !tail -15 /u01/app/oracle/12101/diag/rdbms/orcl/ORCL/trace/alert*.log
  ・・・途中省略・・・
  ARC2: Becoming the 'no FAL' ARCH
  ARC2: Becoming the 'no SRL' ARCH
  Mon Aug 15 13:28:17 2016
  ARC1: Becoming the heartbeat ARCH
  Mon Aug 15 13:28:17 2016
  Errors in file /u01/app/oracle/12101/diag/rdbms/orcl/ORCL/trace/ORCL_lgwr_16148.trc:
  ORA-00313: open failed for members of log group 2 of thread 1
  ORA-00312: online log 2 thread 1: '/u01/app/oracle/12101/oradata/ORCL/redo02.log'
  ORA-27037: unable to obtain file status
  Linux-x86_64 Error: 2: No such file or directory
  Additional information: 3
上記のアラートログから「redo02.log」が存在しせず起動できないことが分かります。
以前、ご紹介しましたが、RMANバックアップにはREDOログファイルは取得されません。
基本的にREDOログファイルをバックアップからリストアする方法は行いません。
では今回はカレントでないREDOログを復旧していきます。
REDOログファイルの破損なので、データベースはREDOログファイルが読み込まれる直前のMOUNT状態にします。
  SQL> startup mount
  SQL> alter database clear logfile group 2;
  Database altered.
  SQL> alter database open;
  Database altered.
カレントでないREDOログファイルをクリアすることでデータベースが起動できます。
上記クリアコマンドは、v$logのSTATUSが「UNUSED」、「INACTIVE」の場合、実行が出来ます。
「ACTIVE」や「CURRENT」の場合は、リカバリ時に必要な変更情報が存在する状態の為、
上記コマンドは失敗します。
「ACTIVE」や「CURRENT」の場合は、データベースの不完全リカバリを実施します。
以上がREDOログファイルの復旧方法となります。