6章 完全リカバリ
前章ではNOARCHIVELOGモードでのリカバリについて確認していきましたが、本章ではARCHIVELOGモードでのリカバリを実施していきます。
ARCHIVELOGモードでの完全リカバリ
それではARCHIVELOGモードの完全リカバリについて確認していきます。
ARCHIVELOGモードであれば障害発生直前まで復旧する完全リカバリができます。
さっそくARCHIVELOGモードのリカバリの流れを確認していきましょう。
バックアップの取得
ではバックアップの取得を行っていきます。
ARCHIVELOGモードなのでオンラインでバックアップを取得できます。
$ sqlplus / as sysdba
Recovery Manager: Release 12.1.0.1.0 - Production on XX XX X XX:XX:XX 2016
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /home/oracle/arch
Oldest online log sequence 1
Next log sequence to archive 1
Current log sequence 1
それではRMANを使用してバックアップを取得します。
$ rman target /
RMAN> backup database;
・・・省略・・・
Starting Control File and SPFILE Autobackup at XX-XXX-16
piece handle=/home/oracle/backup/orcl/c-XXX-2016XX.autobkup comment=NONE
Finished Control File and SPFILE Autobackup at XX-XXX-16
前回と同様、バックアップ以降に一般ユーザのデータを更新してみます。
$ 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/users01.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/users01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
メディア障害が発生しました。それではバックアップを使用して復旧を行っていきます。
今回削除した表領域のデータファイルはクリティカル表領域ではない為、データベースを停止せずに復旧していきます。
以下、各表領域のリカバリ手順です。
ARCHIVELOGモードのリカバリ
それではARCHIVELOGモードのリカバリ方法を確認していきます。
リカバリは障害のあった表領域がクリティカルかそうでないかで復旧方法が異なります。
クリティカル表領域の場合
@データベースを停止
AデータベースをMOUNT
B対象のデータデータファイルのみをリストア
C対象データファイルのアーカイブログ&REDOログのロールフォワード
Dデータベースを起動
非クリティカル表領域の場合
@対象の表領域をオフライン
A対象のデータファイルのみをリストア
B対象データファイルのアーカイブログ&REDOログのロールフォワード
C対象の表領域をオンライン
今回は非クリティカル表領域なので対象の表領域だけオフラインにしリカバリを実施します。
$ sqlplus / as sysdba
SQL> alter database datafile
2 '/u01/app/oracle/oradata/orcl/users01.dbf' offline;
Database altered.
SQL> exit
$ rman target /
$ restore datafile 6;
Starting restore at XX-XXX-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=510 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /u01/XXX/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/XXX/dbs/7drcg8o5_1_1
channel ORA_DISK_1: piece handle=/u01/app/oracle/product/XXX tag=TAG20160XXX
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:07
Finished restore at XX-XXX-16
RMAN> recover datafile 6;
Starting recover at XX-XXX-16
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:01
Finished recover at XX-XXX-16
RMAN> exit
recoverコマンドでアーカイブログ、REDOログの変更情報をすべて適用します。
今回は対象ファイルのみのリカバリである為、recover datafileコマンドを使用しています。
全体のリカバリの場合はrecover databaseです。
それでは最後にデータファイルをオンラインにし、テーブルが復旧されたかを確認していきます。
$ sqlplus / as sysdba
SQL> alter database datafile
2 '/u01/app/oracle/oradata/orcl/users01.dbf' online;
Database altered.
SQL> select * from c##apluser.test;
ID NAME
---------- ----------
10 HEEEEY!
バックアップ以降に作成したテーブルが復旧できました。
このようにクリティカル表領域でないデータファイルはデータベースを停止せず、
対象のデータファイルのみをオフラインにしリカバリを実行できます。
一時表領域のリカバリ
一時表領域が破損した場合は、データベースは停止しません。
SQLで一時表領域が使用される場合にエラーとなります。
例えばORDER BY句を使用したSQL文実施時にPGA内で処理が出来ない場合、
一時表領域を使用しますが、そのときに一時表領域が破損していると、エラーとなります。
SQL> !rm /u01/app/oracle/12101/oradata/ORCL/temp01.dbf
SQL> select a.object_name
2 from dba_objects a ,dba_objects b order by a.object_name;
select a.object_name from dba_objects a ,dba_objects b order by a.object_name
*
ERROR at line 1:
ORA-01565: error in identifying file
'/u01/app/oracle/12101/oradata/ORCL/temp01.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
一時表領域の復旧方法は、DBを再起動するか、
新しく再作成することで復旧ができます。
今回はDBを再起動して復旧されるかを確認してみます。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
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.
Database opened.
これで復旧は終了です。アラートログを確認してみましょう。
SQL> !tail -20 /u01/app/oracle/12101/diag/rdbms/orcl/ORCL/trace/alert*.log
・・・途中省略・・・
Mon Aug 15 13:55:42 2016
Errors in file /u01/app/oracle/12101/diag/XX/ORCL/trace/ORCL_dbw0_16598.trc:
ORA-01186: file 201 failed verification tests
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/u01/app/oracle/12101/oradata/ORCL/temp01.dbf'
Mon Aug 15 13:55:42 2016
File 201 not verified due to error ORA-01157
Mon Aug 15 13:55:42 2016
SMCO started with pid=29, OS id=16648
Mon Aug 15 13:55:42 2016
Re-creating tempfile /u01/app/oracle/12101/oradata/ORCL/temp01.dbf
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Database Characterset is AL32UTF8
上記メッセージより再作成されていることが分かります。
以上がARCHIVELOGモードでの復旧手順となります。