トップ > DBA上級 バックアップリカバリ > 14章
14章 フラッシュバックデータベース
フラッシュバック機能を利用することでリカバリ作業をより簡単にできるようになります。
本章ではフラッシュバックデータベースについて学んでいきます。

フラッシュバックデータベースとは


本章ではフラッシュバックデータベースについてご紹介です。

フラッシュバック機能はOracle Database10gからの新機能となりますが、この機能を使用してデータベースのリカバリなどを行うことが出来ます。

・フラッシュバッククエリ
・フラッシュバックバージョンクエリ
・フラッシュバックトランザクションクエリ
・フラッシュバックトランザクション
・フラッシュバックテーブル
・フラッシュバックドロップ
・フラッシュバックデータベース

上記のようにフラッシュバックは色々な機能がありますが、本章ではフラッシュバックデータベースをご紹介いたします。

フラッシュバックデータベースとはデータベースを過去の状態に戻す機能であり、不完全リカバリと同じ機能を提供します。

不完全リカバリとはDBのバックアップをリストアし、アーカイブログを適用し、データベースを現在より過去の時点に戻します。
フラッシュバックも同様の機能を提供します。フラッシュバックはフラッシュバックログを使用し、データベースをリストアせずに、過去の状態に戻すことが出来ます。その為、不完全リカバリと比較するとリストア作業が不要である為、リカバリ時間が短くてすみます。

フラッシュバックデータベースはフラッシュバックログを使用して、データベースを過去の状態に戻します。

ただしデータベース構成ファイルの物理的な破損や変更に関わるような状況の場合、フラッシュバックデータベースは使用できません。

・表領域を削除する前に戻す
・データファイル縮小する前に戻す
・データファイルを削除する前に戻す
etc

その他の制約事項は以下マニュアルを参照ください。
「フラッシュバック・データベースの制約」
Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド


フラッシュバックデータベースの設定


フラッシュバックデータベースはフラッシュバックログを使用します。このログはREDOログやアーカイブログでもないまったく別のログです。
以下の設定を行います。

1. ARCHIVELOGモードの有効化
2. フラッシュバックログの格納先と使用領域の最大サイズを指定
3. フラッシュバックデータベースの有効化

ARCHIVELOGモードは前回の章で紹介しているので省略します。
フラッシュバックログの格納先と領域サイズの設定は以下のパラメータを指定します。

 DB_RECOVERY_FILE_DEST='/u01/app/oracle/flash_recovery_area'
 DB_RECOVERY_FILE_DEST_SIZE=10G
 DB_FLASHBACK_RETENTION_TARGET=1440

「DB_FLASHBACK_RETENTION_TARGET」はフラッシュバックログの最低保持期間です。

フラッシュバックデータベースの有効化は以下で実施します。


  SQL> SELECT status FROM v$instance;

  STATUS
  ------------
  MOUNTED

  SQL> ALTER DATABASE FLASHBACK ON;
  
  Database altered.
  
  SQL> SELECT flashback_on FROM v$database;

  FLASHBACK_ON
  ------------------
  YES


上記を設定したらこれで設定は完了です。
では実際にフラッシュバックデータベースを実行してみましょう。


  SQL> archive log list
  
  Database log mode              Archive Mode
  Automatic archival             Enabled
  Archive destination            /u01/app/oracle/oradata/orcl/arch
  Oldest online log sequence     27
  Next log sequence to archive   29
  Current log sequence           29


アーカイブログモードは既に有効となっています。

ではDB_RECOVERY_FILE_DEST,DB_RECOVERY_FILE_DEST_SIZEを設定していきましょう。


  SQL> alter system set db_recovery_file_dest_size = 10G;

  System altered.

  SQL> alter system set
    2  db_recovery_file_dest = '/u01/app/oracle/oradata/orcl/recovery';
    
  alter system set db_recovery_file_dest = '/u01/app/oracle/oradata/orcl/recovery'
  *
  ERROR at line 1:
  ORA-02097: parameter cannot be modified because specified value is invalid
  ORA-16019: cannot use db_recovery_file_dest with LOG_ARCHIVE_DEST or
  LOG_ARCHIVE_DUPLEX_DEST


db_recovery_file_destの設定はエラーとなってしましました。db_recovery_file_destを設定するためにはLOG_ARCHIVE_DESTを設定していてはだめなようです。

一度、LOG_ARCHIVE_DESTの設定を解除し、LOG_ARCHIVE_DEST_1に設定を行います。


  SQL> alter system reset log_archive_dest scope=spfile;

  System altered.

  SQL> shutdown immediate
  
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  
  SQL> startup
  
  ORACLE instance started.

  Total System Global Area  524288000 bytes
  Fixed Size                  2926320 bytes
  Variable Size             390072592 bytes
  Database Buffers          125829120 bytes
  Redo Buffers                5459968 bytes
  Database mounted.
  Database opened.
  
  SQL> show parameter log_archive_dest

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  log_archive_dest                     string


  SQL> alter system set
    2  log_archive_dest_1 = 'LOCATION=/u01/app/oracle/oradata/orcl/arch';

  System altered.

  SQL> show parameter log_archive_dest

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  log_archive_dest                     string
  log_archive_dest_1                   string      LOCATION=/u01/app/oracle/orada
                                                   ta/orcl/arch


log_archive_dest_1に設定が完了しました。それでは再度db_recovery_file_destを設定します。


  SQL> alter system set
    2  db_recovery_file_dest = '/u01/app/oracle/oradata/orcl/recovery';

  System altered.

  SQL> show parameter DB_RECOVERY_FILE

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  db_recovery_file_dest                string      /u01/app/oracle/oradata/orcl/r
                                                   ecovery
  db_recovery_file_dest_size           big integer 10G



次はフラッシュバックデータベースの有効化を行います。


  SQL> SELECT flashback_on FROM v$database;

  FLASHBACK_ON
  ------------------
  NO

  SQL> shutdown immediate
  
  Database closed.
  Database dismounted.
  ORACLE instance shut down.

  SQL> startup mount
  
  ORACLE instance started.

  Total System Global Area  524288000 bytes
  Fixed Size                  2926320 bytes
  Variable Size             390072592 bytes
  Database Buffers          125829120 bytes
  Redo Buffers                5459968 bytes
  Database mounted.

  SQL> alter database flashback on;

  Database altered.

  SQL> alter database open;

  Database altered.

  SQL> SELECT flashback_on FROM v$database;

  FLASHBACK_ON
  ------------------
  YES



フラッシュバックデータベースの実行


それではフラッシュバックデータベースを実行する環境が整ったので実際に試してみましょう。

[構文] フラッシュバックデータベース
 RMAN> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);

上記コマンドをMOUNT状態で実施しデータベースを過去の時間帯に戻します。その後はデータベースを読み取り専用でオープンし、問題なければ、リセットログを実施し起動します。


  SQL> select * from emp;

      EMP_ID NAME          DEPT_ID
  ---------- ---------- ----------
           1 Tom                10
           2 Son                20
           3 Jon                30

  SQL> select * from dept;

     DEPT_ID DEPT_NAME
  ---------- ----------
          10 IT
          20 Consulting
          30 HR


では上記のテーブルを誤ってTRUNCATEしてしまったとします。
フラッシュバックデータベースで時間指定で戻してみます。


  SQL> truncate table emp;

  Table truncated.

  SQL> select systimestamp from dual;

  SYSTIMESTAMP
  ---------------------------------------------------------------------------
  17-03-28 17:26:47.441250 +09:00


  SQL> truncate table dept;

  Table truncated.


  SQL> select systimestamp from dual;

  SYSTIMESTAMP
  ---------------------------------------------------------------------------
  17-03-28 17:43:42.216017 +09:00

  SQL> select * from emp;

  no rows selected

  SQL> select * from dept;

  no rows selected


ではemp,dept表をTRUNCATEしたのでフラッシュバックデータベースで過去のデータに戻してみましょう。


  SQL> shutdown immediate
  
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  
  SQL> startup mount
  
  ORACLE instance started.

  Total System Global Area  524288000 bytes
  Fixed Size                  2926320 bytes
  Variable Size             390072592 bytes
  Database Buffers          125829120 bytes
  Redo Buffers                5459968 bytes
  Database mounted.
  SQL> FLASHBACK DATABASE 
    2  TO TIMESTAMP(to_timestamp('17-03-28 17:40:00','yy-mm-dd hh24:mi:ss'));

  Flashback complete.

  SQL> alter database open read only;

  Database altered.

  SQL> select * from emp;

  no rows selected

  SQL> select * from dept;

     DEPT_ID DEPT_NAME
  ---------- ----------
          10 IT
          20 Consulting
          30 HR


dept表をTRUNCATEする前に戻しました。
一度RESETLOGSオプションを使用してデータベースを起動してみます。


  SQL> shutdown immediate
  
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  
  SQL> startup mount
  
  ORACLE instance started.

  Total System Global Area  524288000 bytes
  Fixed Size                  2926320 bytes
  Variable Size             390072592 bytes
  Database Buffers          125829120 bytes
  Redo Buffers                5459968 bytes
  Database mounted.

  SQL> alter database open resetlogs;

  Database altered.


では次にemp表もTRUNCATE前に戻してみましょう。
一度リセットログを行ってしまうと再度フラッシュバックデータベースで過去の状態に戻せませんでしたが、戻すことが可能となっています。

  SQL> shutdown immediate
  
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  
  SQL> startup mount
  
  ORACLE instance started.

  Total System Global Area  524288000 bytes
  Fixed Size                  2926320 bytes
  Variable Size             390072592 bytes
  Database Buffers          125829120 bytes
  Redo Buffers                5459968 bytes
  Database mounted.

  SQL> FLASHBACK DATABASE
    2  TO TIMESTAMP(to_timestamp('17-03-28 17:25:00','yy-mm-dd hh24:mi:ss'));
  Flashback complete.

  Elapsed: 00:00:00.72

  SQL> alter database open read only;

  Database altered.

  SQL> select * from emp;

      EMP_ID NAME          DEPT_ID
  ---------- ---------- ----------
           1 Tom                10
           2 Son                20
           3 Jon                30

  SQL> select * from dept;

     DEPT_ID DEPT_NAME
  ---------- ----------
          10 IT
          20 Consulting
          30 HR


emp,dept表ともにTRUNCATEを実施する前に戻すことができました。

今までTRUNCATEで消えてしまったデータを復旧する場合、不完全リカバリを実施していましたが、フラッシュバックデータベースを使用すれば、何時間もかかっていたリカバリ処理が数分で完了することが可能です。

以上がフラッシュバックデータベースについてのご紹介となります。