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

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

先週に引き続きフラッシュバックに関する動作確認をしてまいります。
これまで3回にわたり参照系機能を確認しました。
簡単にまとめると以下になります。

(1)フラッシュバック:過去のデータが参照できる
(2)行履歴フラッシュバック:データの変更履歴を確認できる
(3)トランザクションフラッシュバック:トランザクションのUNDOを行うSQLを
取得できる

実際どのような使い方があるでしょうか?

例題《あるテーブルにおいて直近でINSERTされたデータを見つけるには》

一般的に、業務データではテーブルの項目にtimestamp型等がありそのMAX値を
とる。または、トリガーなどを仕掛けることで簡単に取得可能、と思います。
ここではその考慮なく運用作業にてワーク的にテーブル作成した場合を想定し
ます。

VERSIONS BETWEEN句を使用することで同等の結果が求められます。

------------
テストデータ
      COL1 COL2       TIME_STMP
---------- ---------- -------------------------
         1 QWERTY     05-03-04 14:57:08.000000
         2 ASDFGH     05-03-04 14:57:16.000000
         3 ZXCVBN     05-03-04 14:57:23.000000
         4 POIUYT     05-03-04 14:57:30.000000
         5 LKJHGF     05-03-04 14:57:38.000000
         6 MNBVCX     05-03-04 14:57:47.000000
         7 123456     05-03-04 14:57:54.000000
         8 098767     05-03-04 14:58:02.000000
         9 QPWOEI     05-03-04 14:58:09.000000
        10 ALSKDJ     05-03-04 14:58:16.000000

方法1:MAX関数を使用

SQL> SELECT * FROM FLASHBACK_TEST
     WHERE TIME_STMP=(SELECT MAX(TIME_STMP) FROM FLASHBACK_TEST);

      COL1 COL2       TIME_STMP
---------- ---------- ------------------------
        10 ALSKDJ     05-03-04 14:58:16.000000

方法2:フラッシュバックを利用

SQL> SELECT * FROM (SELECT * FROM FLASHBACK_TEST VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
     WHERE VERSIONS_OPERATION='I' ORDER BY VERSIONS_ENDTIME DESC) WHERE ROWNUM=1;

      COL1 COL2       TIME_STMP
---------- ---------- ------------------------
        10 ALSKDJ     05-03-04 14:58:16.000000

と、少し無理やりの感が否めないですが・・・・。

気を取り直し、ここから更新系機能を確認していきます。では、まず更新系
機能の1つ目「フラッシュバック・データベース」です。

「フラッシュバック・データベース」機能は、データベース全体のデータを
過去の一時点へ戻します。Undo情報は使用せず、バックグランドプロセスの
リカバリライター(RVWR)が書き出すフラッシュバック・データベースログを
使用します。従来のリカバリー方法では、バックアップ取得時点にリストア
した後Redoを適用していく方法がありました。

まずは準備から・・・・。

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

■はじめ!!!

まずパラメータを確認します。

・db_recovery_file_dest         :フラッシュバックデータベースログ格納場所
・db_recovery_file_dest_size    Flash Recovery Area領域のサイズ
・db_flashback_retention_target :フラッシュバックデータベースログ保有期間
NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------------------------------------
db_recovery_file_dest                string      C:oracleproduct10.1.0flash_recovery_area
db_recovery_file_dest_size           big integer 2G
db_flashback_retention_target        integer     1440

一旦データベースシャットダウンします。

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

マウントモードで起動します。

SQL> startup mount
ORACLE instance started.

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
Database mounted.

アーカイブを有効にします

SQL> alter database archivelog;

Database altered.

フラッシュバックデータベースを有効にし
データベースオープンします。

SQL> alter database flashback on;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     48
Next log sequence to archive   50
Current log sequence           50

これで準備が整いました。さぁ戻します!!といきたいところですが今週はここまで。

前髪が短くなった茅ヶ崎にて