トップ > DBA入門 > 15章
15章 フラッシュバック機能
本章ではフラッシュバック機能について学んでいきます。

フラッシュバックとは10gからの新機能でデータの復旧を行う機能です。
フラッシュバック機能は以下の種類があります。

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

今回はフラッシュバッククエリ、テーブル、ドロップをご紹介していきます。

フラッシュバッククエリ


今回はフラッシュバッククエリ、テーブル、ドロップをご紹介していきます。
フラッシュバッククエリとは過去の時点のテーブルにSELECTする機能です。
通常はCOMMIT後のデータをSELECTするのが通常動作ですが、フラッシュバック
クエリを使用するとCOMMIT後でもCOMMIT前のデータや、10分前のデータなどを
SELECTすることができます。

この機能はUNDOデータを使用している為、UNDOが削除されてしまった場合は
実行できません。デフォルトではUNDO_RETENTIONは900秒なので、UNDO表領域に十分な領域があれば 15分前までのデータを参照できます。
DB負荷状況によってはもっと前までの情報も取得できます。

ではフラッシュバッククエリの構文です。

[構文] フラッシュバッククエリ
 SQL> SELECT 列名 FROM 表名 as of timestamp
 to_timestamp('2016-11-7 10:30:00','YYYY-MM-DD HH24:MI:SS');

では実行例です。

  SQL> select emp_id,first_name,salary from employees where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY
  ---------- ------------------------------ ----------
          10 Akagi                             6400000

  SQL> select systimestamp from dual;

  SYSTIMESTAMP
  ---------------------------------------------------------------------------
  16-09-06 12:55:00.333646 +09:00

  SQL> update employees set salary = 2400000 where emp_id = 10;

  1 row updated.

  SQL> commit;

  Commit complete.

  SQL> select emp_id,first_name,salary from employees where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY
  ---------- ------------------------------ ----------
          10 Akagi                             2400000

  SQL> rollback;

  Rollback complete.

  SQL> select emp_id,first_name,salary from employees where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY
  ---------- ------------------------------ ----------
          10 Akagi                             2400000


  SQL> select emp_id,first_name,salary from employees
    2  as of timestamp to_timestamp('16-09-06 12:55:00','YY-MM-DD HH24:MI:SS')
    3  where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY
  ---------- ------------------------------ ----------
          10 Akagi                             6400000


構文さえ押さえてしまえば、簡単ですね。
上記例ではCOMMIT後のデータを参照するためにフラッシュバッククエリを
使用してます。

フラッシュバックテーブル


では次にフラッシュバックテーブルについてご紹介していきます。
この機能はテーブルを過去の時点に戻すことが出来る機能です。
先ほどのフラッシュバッククエリは過去のデータを参照するだけでしたが、
この機能は過去のデータに復旧することができます。

[構文] フラッシュバックテーブル
 SQL> FLASHBACK TABLE 表名 TO TIMESTAMP
 to_timestamp('2016-11-7 10:30:00','YYYY-MM-DD HH24:MI:SS');

では先ほどの実行例をCOMMIT前に戻してみましょう。

  SQL> select emp_id,first_name,salary from employees where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY
  ---------- ------------------------------ ----------
          10 Akagi                             2400000

  SQL> FLASHBACK TABLE employees TO TIMESTAMP
    2  to_timestamp('16-09-06 12:55:00','YY-MM-DD HH24:MI:SS');
    
  FLASHBACK TABLE employees TO TIMESTAMP
                  *
  ERROR at line 1:
  ORA-08189: cannot flashback the table because row movement is not enabled


フラッシュバックテーブルを実行しようとしたところエラーとなってしまいました。
原因は行移動が有効になっていない為です。
行移動が可能になることでフラッシュバックテーブルを使用し、過去のデータに戻す
ことができます。しかし行移動を行った場合、ROWIDが変更されます。

それでは行移動の有効化を行いましょう。

[構文] 行移動の有効化
 SQL> ALTER TABLE 表名 ENABLE ROW MOVEMENT;

[補足] ROWID
 ROWIDとはOracleが内部で使用している列であり、疑似列
 と呼ばれます。ROWIDは行を特定する為の一意なID情報が
 格納されます。索引もROWIDを使用し行を特定しています。

では行移動を有効にし、フラッシュバックテーブルを再度実行してみましょう。
今回はROWID疑似列も取得してみます。

  SQL> ALTER TABLE employees enable row movement;

  Table altered.

  SQL> select emp_id,first_name,salary,rowid from employees where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY ROWID
  ---------- ------------------------------ ---------- ------------------
          10 Akagi                             2400000 AAAWafAAKAAAADzAAJ
          

  SQL> FLASHBACK TABLE employees TO TIMESTAMP
    2  to_timestamp('16-09-06 12:55:00','YY-MM-DD HH24:MI:SS');

  Flashback complete.

  SQL> select emp_id,first_name,salary,rowid from employees where emp_id=10;

      EMP_ID FIRST_NAME                         SALARY ROWID
  ---------- ------------------------------ ---------- ------------------
          10 Akagi                             6400000 AAAWafAAKAAAADzAAd


疑似列はSELECT句に明示指定すれば表示することができます。
フラッシュバックテーブルによりSALARY列のデータが元に戻り
ROWIDの値も変更されていることが確認できます。

フラッシュバックテーブルはUNDOを使用している為、必要なUNDOが存在しない
場合、エラーとなります。

フラッシュバックドロップ


最後にフラッシュバックドロップについてご紹介していきます。
フラッシュバックドロップは誤って削除してしまった表をリカバリする機能です。

DROP TABLE文はフラッシュバックテーブルは元に戻せません。
フラッシュバックテーブルはDML文をUNDOデータにより元に戻せますが、
DROP TABLE文はDDL文であり、UNDOデータが生成されない為、UNDOデータでは元に戻せません。
その為、表の削除はフラッシュバックドロップを使用してリカバリします。
またフラッシュバックドロップはUNDOは使用しません。

まずフラッシュバックドロップ機能を使用するにはrecyclebinパラメータが有効となっている必要があります。

  SQL> show parameter recyclebin

  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- -----------------------
  recyclebin                           string      on


それでは構文を確認していきましょう。

[構文] フラッシュバックドロップ
 SQL> FLASHBACK TABLE 表名 TO BEFORE DROP;

では実行例です。

  SQL> show recyclebin

  SQL> drop table employees;

  Table dropped.

  SQL> select table_name from user_tables where table_name = 'EMPLOYEES';

  no rows selected

  SQL> show recyclebin

  ORIGINAL NAME    RECYCLEBIN NAME           OBJECT TYPE  DROP TIME
  ---------------- ------------------------- ------------ -------------------
  EMPLOYEES        BIN$H3HQ0G/UybC1QqpSw==$0 TABLE        2016-XX-XX:XX:XX:XX

  SQL> FLASHBACK TABLE employees TO BEFORE DROP;

  Flashback complete.

  SQL> select table_name from user_tables where table_name = 'EMPLOYEES';

  TABLE_NAME
  ------------------------------------------------
  EMPLOYEES
  

show recyclebinは削除された表の一覧を表示します。DROP TABLE文実行後は、
show recyclebinにより削除されたEMPLOYEES表が表示されています。
Windowsのごみ箱と似た機能ですね。

いかがでしたでしょうか。10gからの新機能であるフラッシュバックの機能の一部を
ご紹介しました。この機能を使用することで今までのリカバリがずっと楽になりました。