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モードでのリカバリ方法となります。