Oracle10g フラッシュバック アゲインの巻き その1

<Oracle10g フラッシュバック アゲイン の巻き その1>
ペンネーム:びー・うぃりー

今回よりフラッシュバックに関する動作確認をしてまいります。皆様ご存知
の通りOracle 9iから追加された機能ですが、10gではさらにパワーアップさ
れました。おら!オラ!でも過去数回にわたり検証してきたこの機能。今回
は、「フラッシュバック アゲインの巻」と題して、 9i~10gまでを一気に
確認したいと思います。

普段の業務ではなかなか使用する機会がなく、どうもピンとこないという方
、まずはおさらいから・・・・。

■概要
過去の特定の時点におけるデータベースに対して問合せを実行する必要があ
る場合、フラッシュバック問合せ機能によって時間またはシステム変更番号
(SCN) を指定して、対応する時間のコミット済データを使用する問合せを
実行できる!簡単に言うと、「ちょっと待った~!いまの操作は無しにして
~!お願い~!」といったDB担当者の身勝手だがかなり切ない願いをかなえ
るもの・・と言えるかもしれません。

■種類
参照系機能
(1)フラッシュバッククエリー :ご存知「フラッシュバック問い合わせ」
時間やSCNでその時点のデータが参照
(2)行履歴フラッシュバック :変更内容を行単位で参照
(3)トランザクション履歴
フラッシュバック :変更内容をトランザクション単位で参照

更新系機能
(1)フラッシュバックデータベース:データベース全体をある時点に戻す
(2)フラッシュバックテーブル :特定表をある時点に戻す
(3)フラッシュバックドロップ :Drop table しちゃった!を戻す

ではここからはテスト環境にてどんどん消し、そしてフラッシュバックして
みます。ここではDBMS_FLASHBACK パッケージではなく、Flashback Queryを
使用します。

■環境
Microsoft Windows XP Pro
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – Production
With the Partitioning, OLAP and Data Mining options

■はじめ!!!

まずは参照機能(1)から順に確認しましょう。

SQL> select ora_rowscn,col1,col2 from flashback_test;

ORA_ROWSCN COL1  COL2
---------- ----- -----
   2514278 1     111
   2514278 2     222
   2514278 3     333
   2514278 4     444
   2514278 5     555

SQL> update flashback_test set col2='000' where col1=3;

1行が更新されました。

SQL> commit;

コミットが完了しました。

SQL> select col1,col2 from flashback_test;

COL1  COL2
----- -----
1     111
2     222
3     000
4     444
5     555

すかさず時間確認!!

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
05-01-25 21:54:26.974000 +09:00

上記時間のほんのちょっと前は?どうか??

SQL> select * from flashback_test 
     as of timestamp to_timestamp('05-01-25 21:53:00','YY-MM-DD HH24:MI:SS');

COL1  COL2
----- -----
1     111
2     222
3     333
4     444
5     555

いました!でました。当然です。。。

SQL> select * from flashback_test 
     as of timestamp systimestamp - interval '10' minute;

レコードが選択されませんでした。

ちょっとこれは戻りすぎ・・。

では今度はSCN番号指定してはどうでしょう。。。

SQL> select ora_rowscn,col1,col2 from flashback_test 
     as of scn  2514278

ORA_ROWSCN COL1  COL2
---------- ----- -----
   2514278 1     111
   2514278 2     222
   2514278 3     333
   2514278 4     444
   2514278 5     555

また、以下のようにある時点でのデータのCopy表を作ることもできました。

SQL> create table flashback_test_bk as select * from flashback_test where col1=0;

表が作成されました。

SQL> insert into flashback_test_bk select col1,col2 from flashback_test 
     as of scn  2514278;

5行が作成されました。

SQL> select * from flashback_test_bk;

COL1  COL2
----- -----
1     111
2     222
3     333
4     444
5     555

SQL> commit;

コミットが完了しました。

でも、表構造に変更がされた場合はデータ参照できなくなってしまいましたね。

SQL> truncate table flashback_test;

表が切り捨てられました。

SQL> select col1,col2 from flashback_test as of scn  2514278;
select col1,col2 from flashback_test as of scn  2514278
                      *
行1でエラーが発生しました。:
ORA-01466: unable to read data - table definition has changed

今週はここまで。

転ばぬ先の杖!なんて商品があったら爆発的に売れるのでは・・・?! 茅ヶ崎にて