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

投稿日: 2005年3月16日

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

先週に引き続きフラッシュバックに関する動作確認をしてまいります。
またまた「フラッシュバック・データベース」です。
先週は前準備をしました。今週はテストシナリオに沿って確認していきます。

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

■はじめ!!!

テストデータを確認します。

SQL> select count(*) from flashback_test;
  COUNT(*)
----------
         0

■テストシナリオ
1.ここから無理やりヒューマンエラーを起こします。
2.まず、1000件のデータを作成します。
3.続けて誤ってまた10000件を作成します。
4.慌てて対応したため全件削除してしまいます。

SQL> declare
  2  cnt number;
  3  begin
  4  cnt := 1;
  5  loop
  6  insert into flashback_test values(cnt,'INSERTED',sysdate);
  7  commit;
  8  update flashback_test set col2='UPDATED',col3=sysdate where col1=cnt;
  9  commit;
 10  cnt := cnt + 1;
 11  if cnt >= 10001 then
 12     exit;
 13  end if;
 14  end loop;
 15  end;
 16  /

PL/SQL procedure successfully completed.

SQL> select systimestamp from dual;

SYSTIMESTAMP
----------------------------------------------------------------------
05-02-13 22:35:26.879000 +09:00

SQL> select count(*) from  flashback_test;

  COUNT(*)
----------
     10000

SCNを確認しておきます。

SQL> select current_scn from v$database

CURRENT_SCN
-----------
     596077

SQL> declare
  2  cnt number;
  3  begin
  4  cnt := 1;
  5  loop
  6  insert into flashback_test values(cnt,'INSERTED',sysdate);
  7  commit;
  8  update flashback_test set col2='UPDATED',col3=sysdate where col1=cnt;
  9  commit;
 10  cnt := cnt + 1;
 11  if cnt >= 10001 then
 12     exit;
 13  end if;
 14  end loop;
 15  end;
 16  /

PL/SQL procedure successfully completed.

SQL> select count(*) from flashback_test;

  COUNT(*)
----------
     20000

SQL> delete from flashback_test;

20000 rows deleted.

SQL> commit;

Commit complete.

さぁ、ここからです。フラッシュバック・データベース機能をしようしてリカ
バリーします。まずは、データベースシャットダウン。

SQL> conn / as sysdba
Connected.
SQL>
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
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.

ひかえていたSCNへフラッシュバックします。

SQL> flashback database to scn 596077;

Flashback complete.

確認しましょう、Readonlyで。わざわざReadonlyで実施している理由はいうま
でもありません。狙い通りのデータにも戻っている事を確認するためです。

SQL> alter database open read only;

Database altered.

SQL> select count(*) from oraora.flashback_test;

  COUNT(*)
----------
     10000

大丈夫な模様です。本来であれば件数だけでなくデータの整合性などを確認し
て、本当に過去のある時点に戻してよいかの判断は慎重に行うべきですね。が
しかし、今回は・・・・・・件数のみの確認で・・・・・続けます。。

再度データベースシャットダウンし、マウント起動します。

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.

ここで、選択肢が2つ。
1:狙い通りデータになったので、このまま適用する。
2:フラッシュバック・データベースやり直し!!

~選択肢1の場合~
余計なフラッシュデータベースログを削除するために一旦フラッシュバック・
データベースを無効にして、再度有効にします。

SQL> alter database flashback off;

Database altered.

SQL> alter database flashback on;

Database altered.

SQL> alter database open resetlogs

Database altered.

~選択肢2の場合~
マウント状態からフラッシュバック・データベース実行前の状態に戻します。。
RESETLOGSを行うまでは何度もフラッシュバック・データベース実行可能です。

SQL> recover automatic database;
Media recovery complete.

以上のように今までのリカバリ作業と比べずいぶんと楽になったと思いません
か?ただ、データファイルのサイズ変更、制御ファイルの修復。表領域のDrop
などには対応できません。SQLを使用したブロック単位の変更をリカバリする
機能です。データベースを過去の一時点へ戻す事による影響を十分に認識して
作業する必要があります。

今週はここまで

雪の茅ヶ崎にて