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ログ・グループが破損した場合
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
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。と思う。要検証ネタ。