11gフラッシュバック(Flashback)新機能

1. フラッシュバック・データ・アーカイブ

フラッシュバック・データ・アーカイブ(Oracle Total Recall)により、その存続期間中、表に対するすべてのトランザクションによる変更を追跡および格納できる。
フラッシュバック・データ・アーカイブの詳細についてOracle 11gオンラインマニュアルを参照して下さい。

1.1 フラッシュバック・データ・アーカイブの作成

CREATE FLASHBACK ARCHIVE ...リファレンス
フラッシュバック・データ・アーカイブ表領域の作成

PROD(SYS)> create tablespace fda01 datafile '/u01/app/oracle/oradata/PROD/fda01_1.dbf' size 10M autoextend on next 10M maxsize 2G;

Tablespace created.

PROD(SYS)>  create tablespace fda02 datafile '/u01/app/oracle/oradata/PROD/fda02_1.dbf' size 10M autoextend on next 10M maxsize 2G;

Tablespace created.

PROD(SYS)> create tablespace fda03 datafile '/u01/app/oracle/oradata/PROD/fda03_1.dbf' size 10M autoextend on next 10M maxsize 2G;

Tablespace created.

PROD(SYS)>

フラッシュバック・データ・アーカイブの作成 
PROD(SYS)>  create flashback archive default fda tablespace fda01 quota 2G retention 1 MONTH; --# デフォルトフラッシュバック・データ・アーカイブ

Flashback archive created.

PROD(SYS)> create flashback archive fda1 tablespace fda02 quota 2G retention 1 YEAR;

Flashback archive created.
1.2 フラッシュバック・データ・アーカイブの変更

ALTER FLASHBACK ARCHIVE ...リファレンス
FDAの保有時間を3ヶ月に変更 

PROD(SYS)> alter flashback archive fda modify retention 3 month;

Flashback archive altered.

FDAに最大使用上限が2GBの表領域FDA03を追加してから削除する
PROD(SYS)> alter flashback archive fda add tablespace fda03 quota 2G;

Flashback archive altered.

PROD(SYS)> alter flashback archive fda remove tablespace fda03; --# FDA03表領域が削除されない

Flashback archive altered.

FDAから履歴データを削除
PROD(SYS)> alter flashback archive fda purge all; --# 全ての履歴を削除

Flashback archive altered.

PROD(SYS)> alter flashback archive fda purge before timestamp(systimestamp - 1);

Flashback archive altered.

PROD(SYS)> alter flashback archive fda purge before scn 730736;

Flashback archive altered.

PROD(SYS)>
1.3 フラッシュバック・データ・アーカイブの削除

DROP FLASHBACK ARCHIVE ... リファレンス

PROD(SYS)> drop flashback archive fda1;

Flashback archive dropped.
1.4 フラッシュバック・データ・アーカイブの有効化および無効化

フラッシュバック・データ・アーカイブの有効化

PROD(SYS)> grant flashback archive administer to jason;  --# SYSDBA以外のユーザーなら、権限を付与しなければならない

Grant succeeded.

PROD(SYS)> conn jason/oracle
Connected.
PROD(JASON)>  create table t_fda( id number,inst_date date default sysdate,
        upd_date date default sysdate) flashback archive fda; --# 表を作成の時

Table created.

PROD(JASON)> create table t_objects as select * from dba_objects;

Table created.

PROD(JASON)> alter table t_objects flashback archive; --# 既に存在している表に対する

Table altered.

PROD(JASON)>

フラッシュバック・データ・アーカイブの無効化
PROD(SYS)> alter table t_objects no flashback archive;

Table altered.

フラッシュバック・データ・アーカイブされた表に対して下記のDDLが許可されない。
  • ALTER TABLE文では、次のいずれか
    • 列の削除、名前変更、または変更。
    • ーティション操作またはサブパーティション操作。
    • LONG列のLOB列への変換。
    • INCLUDING DATA句ありまたはなしでのUPGRADE TABLE句の挿入。
  • DROP TABLE文
  • RENAME TABLE文
  • TRUNCATE TABLE文

1.5 フラッシュバック・データ・アーカイブの情報表示

ビュー 説明
DBA_FLASHBACK_ARCHIVE/*_FLASHBACK_ARCHIVE フラッシュバック・データ・アーカイブ・ファイルに関する情報を表示する。
DBA_FLASHBACK_ARCHIVE_TS/*_FLASHBACK_ARCHIVE_TS フラッシュバック・データ・アーカイブ・ファイルの表領域を表示する。
DBA_FLASHBACK_ARCHIVE_TABLES/*_FLASHBACK_ARCHIVE_TABLES データ・フラッシュバック・アーカイブ・ファイルが有効になっている表の情報。

1.6 フラッシュバック・データ・アーカイブの使用

検証用データ作成

PROD(JASON)> alter table t_objects flashback archive;

Table altered.

PROD(JASON)> insert into t_objects select * from dba_objects;     

11734 rows created.

PROD(JASON)> commit;

Commit complete.

PROD(JASON)> select count(*),to_char(sysdate,'YYYYMMDDHH24MISS') from t_objects;

  COUNT(*) TO_CHAR(SYSDAT
---------- --------------
     11734 20091205143648

上記で作成されたデータを削除 コミットの時、ORA-00600発生、1.7 問題点とバグを参照
PROD(JASON)> delete from t_objects;

11734 rows deleted.

PROD(JASON)> commit; --# COMMITが失敗した!!
commit
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
Process ID: 31289
Session ID: 54 Serial number: 405

PROD(JASON)> conn jason/oracle
Connected.
PROD(JASON)> select count(*),to_char(sysdate,'YYYYMMDDHH24MISS') from t_objects; --# 確認したら、データ削除がコミットされたようだ。

  COUNT(*) TO_CHAR(SYSDAT
---------- --------------
         0 20091205143927

PROD(JASON)>

Flashback Data Archiveで削除前の時点のデータを確認
PROD(JASON)>  select count(*),to_char(sysdate,'YYYYMMDDHH24MISS') from t_objects     --# フラッシュバックされた。
        as of timestamp (to_timestamp('20091205143648','YYYYMMDDHH24MISS'));

  COUNT(*) TO_CHAR(SYSDAT
---------- --------------
     11734 20091205144036

PROD(JASON)>

1.7 問題点とバグ情報

1.7.1 delete from t_objectsの後で COMMITをしたら ORA-600発生
PROD(JASON)> alter table t_objects flashback archive;

Table altered.

PROD(JASON)> insert into t_objects select * from dba_objects;     

11734 rows created.

PROD(JASON)> commit;

Commit complete.

PROD(JASON)> select count(*),to_char(sysdate,'YYYYMMDDHH24MISS') from t_objects;

  COUNT(*) TO_CHAR(SYSDAT
---------- --------------
     11734 20091205143648

PROD(JASON)> delete from t_objects;

11734 rows deleted.

PROD(JASON)> commit;
commit
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
Process ID: 31289
Session ID: 54 Serial number: 405

PROD(JASON)>

Alertログ情報
Sat Dec 05 14:37:13 2009
Errors in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_31289.trc  (incident=31425):
ORA-00600: internal error code, arguments: [ktfa_read_number - exception], [], [], [], [], [], [], [], [], [], [], []
Errors in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_31289.trc  (incident=31426):
ORA-00603: ORACLE server session terminated by fatal error
1.7.2 他のバグ情報

Bug No: 7028762 Bug:FLASHBACK DATA ARCHIVE COSUMES HIGH CPU version:11.2.0.1
Bug No: 6958073 Bug:DROP FLASHBACK ARCHIVE FAILS BY ORA-600[12811] version:11.2.0.1
インターネットで他の不具合も一杯報告されたらしい、この機能に対して自信が無くなった。

1.7.3 結論

この機能の安定版が出るまで、使わないほうが良いと強く勧めます!

2. フラッシュバック・トランザクション

この機能を利用してデータベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックすることが出来る。

2.1 フラッシュバック・トランザクションを利用するためのデータベース構成
  • アーカイブログを有効にする。
  • 1つ以上のアーカイブログを開く。
  • サプリメンタル・ロギングを有効にする。
PROD(SYS)> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/bak/PROD/arch
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3
PROD(SYS)> alter system archive log current;

System altered.

PROD(SYS)> alter database add supplemental log data;

Database altered.

PROD(SYS)> alter database add supplemental log data (primary key) columns;

Database altered.
2.2 手動でフラッシュバック・トランザクションを実行

検証環境の作成

PROD(JASON)> create table t_fbtran ( id number,inst_date date default sysdate, upd_date date default sysdate);

Table created.

PROD(JASON)> insert into t_fbtran values ( 1 , sysdate , sysdate );

1 row created.

PROD(JASON)> commit;

Commit complete.

PROD(JASON)> insert into t_fbtran values ( 2 , sysdate , sysdate );    

1 row created.

PROD(JASON)> commit;

Commit complete.

PROD(JASON)>

トランザクションID(XID)を確認
PROD(JASON)> select versions_xid , id from t_fbtran versions between scn minvalue and maxvalue;

VERSIONS_XID             ID
---------------- ----------
0200190056010000          1
09001C0056010000          2

PROD(JASON)>

DBMS_FLASHBACK.TRANSACTION_BACKOUTを実行して[XID=0200190056010000]をフラッシュバック。
PROD(SYS)> declare
        v_xid sys.xid_array;
begin
        v_xid := sys.xid_array('0200190056010000');
        dbms_flashback.transaction_backout(numtxns=>1,xids=>v_xid, options=>dbms_flashback.cascade);
end;
/  2    3    4    5    6    7  

PL/SQL procedure successfully completed.

PROD(SYS)> commit;

Commit complete.

PROD(SYS)> conn jason/oracle;
Connected.
PROD(JASON)> select * from t_fbtran;

        ID INST_DATE UPD_DATE
---------- --------- ---------
         2 05-DEC-09 05-DEC-09

PROD(JASON)>
2.3 OEMでフラッシュバック・トランザクションの実行##

T_OBJECTSのデータを削除するトランザクションを実行

PROD(JASON)> select count(*) from t_objects;

  COUNT(*)
----------
     11732

PROD(JASON)> delete from t_objects;

11732 rows deleted.

PROD(JASON)> commit;

Commit complete.

PROD(JASON)> select count(*) from t_objects;

  COUNT(*)
----------
         0

PROD(JASON)>
OEM → DBインスタンスホーム → Availabilityタブ →  ManageのView and Manage Transactionsdでフラッシュバック対象のトランザクションを検索
flashback_trans_01.JPG
フラッシュバック対象トランザクションを選択
flashback_trans_02.JPG
フラッシュバックトランザクションを実行
flashback_trans_03.JPG
実行結果の表示
flashback_trans_04.JPG
PROD(JASON)> select count(*) from t_objects;

  COUNT(*)
----------
     11732

PROD(JASON)>
2.4 フラッシュバック・トランザクションのレポート
ビュー 説明
DBA_FLASHBACK_TXN_STATE/*_FLASHBACK_TXN_STATE *_FLASHBACK_TXN_STATEでは、トランザクションがアクティブであるか、またはバックアウトされているかが示される。
DBA_FLASHBACK_TXN_REPORT/*_FLASHBACK_TXN_REPORT 各バックアウト・トランザクションの詳細レポートを生成する
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License