トップ > Gold バックアップリカバリ > 6章
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モードでの復旧手順となります。