トップ > DBA上級 バックアップリカバリ > 5章
5章 NOARCHIVELOGモードでのリカバリ
本章ではリカバリの方法を確認していきます。試験でもARCHIVELOGなのかそうでないかを判断し、適切な復旧方法を求める問題も出離題されますので、よりリカバリに関する理解を深めて行きましょう。

リカバリの実施


本章ではNOARCHIVELOGモードでのリカバリを行って行きましょう。

NOARCHIVELOGモードではアーカイブログファイルが作成されないため、 リカバリはバックアップを取得した時点しか戻せません。

それでは実際にバックアップを取得後、リストアを実施するためにバックアップを取得します。


  $ rman target /
  
  RMAN> shutdown immediate

  using target database control file instead of recovery catalog
  database closed
  database dismounted
  Oracle instance shut down

  RMAN> startup mount

  connected to target database (not started)
  Oracle instance started
  database mounted

  Total System Global Area    1068937216 bytes

  Fixed Size                     2296576 bytes
  Variable Size                746587392 bytes
  Database Buffers             314572800 bytes
  Redo Buffers                   5480448 bytes

  RMAN> backup database;
  ・・・
  Starting Control File and SPFILE Autobackup at 05-AUG-16
  piece handle=/home/oracle/backup/orcl/c-397531058-20160805-00.autobkup comment=NONE
  Finished Control File and SPFILE Autobackup at 05-AUG-16

  RMAN> alter database open;
  

これでデータファイル、SPFILE,制御ファイルのバックアップが完了しました。
DB障害を発生させる前に、バックアップ以降に一般ユーザのデータを更新してみます。


  $ sqlplus c##apluser/apluser

  SQL> create table test (id number(5),name varchar2(10));

  Table created.

  SQL> insert into test values (10,'HEEEEY!');

  1 row created.

  SQL> commit;

  Commit complete.

  SQL> select * from test;

          ID NAME
  ---------- ----------
          10 HEEEEY!
        

上記でバックアップ以降にオブジェクトを作成しました。 このデータはバックアップ取得以降に実施されたので、リカバリ後はなくなります。

それではデータファイルを削除し、メディア障害を発生させてみます。

  $ rm /u01/app/oracle/oradata/orcl/users.dbf

  $ sqlplus / as sysdba

  SQL> alter system flush buffer_cache;

  System altered.

  SQL> select * from c##apluser.test;
  select * from c##apluser.test
                           *
  ERROR at line 1:
  ORA-01116: error in opening database file 6
  ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/users.dbf'
  ORA-27041: unable to open file
  Linux-x86_64 Error: 2: No such file or directory
  Additional information: 3


USERS表領域のデータファイルが存在しないため、エラーになりました。 途中で実行している「alter system flush buffer_cache;」は データベースバッファキャッシュをクリアするコマンドです。

データベースバッファキャッシュにtestテーブルの情報が存在した場合、 データファイルにアクセスされないため、破損に気づけないので、実行しています。

それではこの状況でデータベースを停止してみます。


  SQL> shutdown immediate
  
  ORA-01116: error in opening database file 6
  ORA-01110: data file 6: '/home/oracle/12101/oradata/ORCL/users01.dbf'
  ORA-27041: unable to open file
  Linux-x86_64 Error: 2: No such file or directory
  Additional information: 3


データファイルが破損しているため、IMMEDIATEオプションでは停止できません。
このような時はABORTオプションで停止します。


  SQL> shutdown abort
  ORACLE instance shut down.


停止できました。次はバックアップをリストアしていきます。

NOARCHIVELOGモードの場合のリカバリは、制御ファイル、すべてのデータファイルをリストアし、 ロールフォワードせずに、データベースを起動します。

NOARCHIVELOGモードのリカバリ

@データベースを停止
AデータベースをNOMOUNT
B制御ファイルをリストア
CデータベースをMOUNT
Dすべてのデータファイルをリストア
EREDOログを適用しないnoredoオプションを使用しリカバリ
FDBをresetlogsオプション付きでDB起動

制御ファイルはMOUNT時に読み込まれるファイルなので、読み込まれる前の状態であるNOMOUNTでリストアする必要があります。 またデータファイルはOPEN時に読み込まれるファイルである為、OPEN前のMOUNT状態でリストアする必要があります。

それでは実際に試してみます。

  $ rman target /

  RMAN> shutdown immediate

  database dismounted
  Oracle instance shut down

  RMAN> startup nomount

  connected to target database (not started)
  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

  RMAN> restore controlfile from 
     2  '/home/oracle/backup/orcl/c-397531058-20160805-00.autobkup';

  ・・・・
  output file name=/u01/app/oracle/oradata/orcl/control03.ctl
  Finished restore at 08-JUL-16
  

上記コマンドはNOMOUNT状態で制御ファイルのリストアを実施しています。 NOMOUNTで実施しているのは、制御ファイルが読み込まれる前の状態で実施する必要があるからです。

  RMAN> alter database mount;

  Statement processed
  released channel: ORA_DISK_1

  RMAN> restore database;

  Starting restore at XX-XXX-XX
  Starting implicit crosscheck backup at XX-XXX-XX
  allocated channel: ORA_DISK_1

  ・・・・
  Finished restore at 08-JUL-16
  

MOUNT状態としデータファイルのリストアを実施する「restore database」コマンドを実行しています。 このコマンドを実行すると、RMANが自動的にリストアに必要なデータファイルをピックアップし、 リストアしてくれます。

MOUNT状態で実施するのは、データファイルが読み込まれる前の状態である必要がある為です。


  RMAN> recover database noredo;
  Starting recover at 08-JUL-16
  using channel ORA_DISK_1

  Finished recover at 08-JUL-16
  

restoreコマンド後、recoverコマンドを実行していますが、 noredoオプションはアーカイブログの適用を試行しないように指定します。 NOARCHIVELOGモードの場合は、アーカイブログがない為、このオプションを使用します。


  RMAN> alter database open resetlogs;
  
  Statement processed
  

最後にresetlogsオプション付きでデータベースを起動します。 resetlogsを指定すると、REDOログがクリアされ、 またREDOログの順序番号がリセットされ、1から順序番号が開始されます。

これでリカバリは完了です。リカバリはリストア時に戻りますので、
リカバリ直前に作成したテーブルは存在しません。

  $ sqlplus / as sysdba

  SQL> select * from c##apluser.test;
                           *
  ERROR at line 1:
  ORA-00942: table or view does not exist


NOARCHIVELOGモードの場合は、アーカイブログが作成されない為、障害発生直前の復旧はできません。
これを許容できないシステムの場合はARCHIVELOGモードでの運用をお勧めします。

以上がNOARCHIVELOGモードでのリカバリ方法となります。