ablog

不器用で落着きのない技術者のメモ

オンラインREDOログ障害からのリカバリ手順

REDOログ・グループの一部のメンバが破損したケース
  • 破損したメンバのファイル名を調べる。
    • 破損していても STATUS が INVALID にならない場合がある。その場合、インスタンスを再起動すると INVALID になる。
SQL> select a.group#, a.status group_status, a.archived, b.status member_status, b.member from v$log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
    GROUP# GROUP_STATUS     MEMBER_ MEMBER
---------- ---------------- ------- --------------------------------------------------
         1 INACTIVE                 /u01/app/oracle/oradata/orcl/redo01.log
         1 INACTIVE                 /u01/app/oracle/oradata/orcl/redo11.log
         2 INACTIVE                 /u01/app/oracle/oradata/orcl/redo02.log
         2 INACTIVE                 /u01/app/oracle/oradata/orcl/redo12.log
         3 CURRENT          INVALID /u01/app/oracle/oradata/orcl/redo03.log
         3 CURRENT                  /u01/app/oracle/oradata/orcl/redo13.log
  • 破損したメンバが属するログ・グループの STATUS が CURRENT の場合、ログスイッチして INACTIVE にする。
SQL> alter system switch logfile;
SQL> alter system checkpoint;
SQL> select a.group#, a.status group_status, a.archived, b.status member_status, b.member from v$log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;

    GROUP# GROUP_STATUS     ARC MEMBER_ MEMBER
---------- ---------------- --- ------- --------------------------------------------------
         1 CURRENT          NO          /u01/app/oracle/oradata/orcl/redo01.log
         1 CURRENT          NO          /u01/app/oracle/oradata/orcl/redo11.log
         2 INACTIVE         YES         /u01/app/oracle/oradata/orcl/redo02.log
         2 INACTIVE         YES         /u01/app/oracle/oradata/orcl/redo12.log
         3 INACTIVE         YES INVALID /u01/app/oracle/oradata/orcl/redo03.log <-- GROUP_STATUS が INACTIVE であることを確認する
         3 INACTIVE         YES         /u01/app/oracle/oradata/orcl/redo13.log
  • 破損したメンバーを削除する。
SQL> alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo03.log';
Database altered.
  • グループに新しいメンバを追加する。
SQL> alter database add logfile member '/u01/app/oracle/oradata/orcl/redo03.log' reuse to group 3;
  • 再作成したREDOログ・グループの STATUS が CURRENT になるまでログスイッチし、STATUS が INVALID でなくなるこことを確認する。
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> select a.group#, a.status group_status, a.archived, b.status member_status, b.member from v$log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
    GROUP# GROUP_STATUS     ARC MEMBER_ MEMBER
---------- ---------------- --- ------- --------------------------------------------------
         1 ACTIVE           YES         /u01/app/oracle/oradata/orcl/redo01.log
         1 ACTIVE           YES         /u01/app/oracle/oradata/orcl/redo11.log
         2 ACTIVE           YES         /u01/app/oracle/oradata/orcl/redo02.log
         2 ACTIVE           YES         /u01/app/oracle/oradata/orcl/redo12.log
         3 CURRENT          NO          /u01/app/oracle/oradata/orcl/redo03.log
         3 CURRENT          NO          /u01/app/oracle/oradata/orcl/redo13.log


(↓ここから下は実機検証してません)

REDOログ・グループの全てのメンバが破損したケース

状況を確認する
  • 破損したグループがアクティブか否か確認する。
SQL> select a.group#, a.status group_status, a.archived, b.status member_status, b.member from v$log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
非アクティブなオンラインREDOログ・グループが破損した場合
  • 破損したREDOログ・グループが非アクティブでアーカイブ済みであることを確認する。
SQL> select a.group#, a.status g_stat, a.archived, b.status m_stat, b.member from v$log a, v$logfile b where a.group# = b.group# order by a.group#, b.member;
SQL> shutdown immediate
SQL> exit
  • 非アクティブでアーカイブ済みである場合、破損したREDOログ・グループをクリアする。
SQL> startup mount;
SQL> alter database clear logfile group x; -- x は破損したログ・グループの番号
  • データベースを再起動する。
SQL> shutdown immediate
SQL> startup
アクティブなオンラインREDOログ・グループが破損した場合
SQL> shutdown immediate
SQL> exit
$ sqlplus / as sysdba
SQL> startup mount
SQL> recover database until cancel;
SQL> alter database open restlogs;
SQL> shutdown immediate
SQL> exit
SQL> startup
SQL> shutdwon immediate
  • オフラインバックアップを実行する。

参考


追記(2010/11/12):
Oracle 10g 以降をアーカイブログモードで運用している本番環境で、REDOログ・グループの全メンバに障害が発生した場合、障害が発生したREDOログ・グループをARCHプロセスがアーカイブしようとしたときにアーカイブできず、アラートログにエラーが出力されるが、インスタンスは停止せず稼働し続ける。そのまま、ログスイッチしていくが、アーカイブされていないREDOログにはスイッチできないので、ここまできて、REDOログバッファをREDOログに書き込むことができなくなりハングする。復旧方法は、不完全リカバリか、無理やりログスイッチして正常なREDOログが現行になったところで、alter system checkpoint -> shutdown immediate -> startup mount -> REDOログ復旧 -> alter database open resetlogs -> shutdown immediate -> オフラインバックアップ -> startup する。アーカイブ済のREDOログ障害の場合は、アーカイブログは欠損しないので、REDOログのみ復旧できれば ok。と思う。要検証ネタ。