フラッシュバッククエリーに関する検証 その1

~フラッシュバッククエリーに関する検証 その1 ~
ペンネーム ちゃむ

久々にメルマガを書く。Oracle9iに関する検証をやっていくぞー。
かんばるぞー。

これから行なう環境はすべて OS solaris7 Oracle 9.0.1.0.0で行なう。

今回から、フラッシュバッククエリーという機能に着目して検証する。フラッ
シュバッククエリーとは、その名の通り、過去のある時点に戻って検索を行な
う機能である。これを聞くと、Redoログの情報(Redo)かロールバックセグメ
ントの情報(Undo)どちらかを使用すると直感的に感じると思うが、Undo情報
で実現している機能である。

その機能を使用するために、Oracle9iから登場するUndo表領域という新しい表
領域を使用するが、その説明はまたの機会に譲って、今回は、フラッシュバッ
ククエリーを行なうための前準備を行なう。

<フラッシュバッククエリーを行なうための前準備>

1.SYSユーザでCONNECT

DBMS_FLASHBACKパッケージの実行権限をSYSユーザから実行したいユーザー与
える。Oracle9iをはじめて使用する方は、おそらくここでいきなり戸惑うは
ずだ。

ここの環境では、sysのパスワードはmanagerなので、 sys/managerで接続して
みよう。

$ sqlplus sys/manager

ORA-28009: connection to sys should be as sysdba or sysoper

あれ!!エラーが発生したぞ。そうなのだ。Oracle9iからsysユーザーはsysdba
かsysoperを指定しないと接続できないのだ。

じゃあ、今度は以下のように接続しよう!!

$ sqlplus sys/manager as sysdba
Usage: SQLPLUS [ [] [] [] ]
where  ::= -H | -V | [ [-M ] [-R ] [-S] ]
        ::= [/][@] | / | /NOLOG
        ::= @[.] [ ...]
        "-H" displays the SQL*Plus version banner and usage syntax
        "-V" displays the SQL*Plus version banner
        "-M " uses HTML markup options 
        "-R " uses restricted mode 
        "-S" uses silent mode

おいおい。今度は受け付けてくれないよ。じゃあ、これでどうだ。

$ sqlplus "sys/manager as sysdba"

Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL>

やっとつながったよ。空白を含むと構文エラーになってしまうので、ダブルコ
ーテーションで括ろう。以下のようにシングルコーテーションでも大丈夫だ。

$ sqlplus 'sys/manager as sysdba'

ちなみにSQL*PLUSに入った状態であれば事態は逆になるので注意!!

シングルコーテーショなしの場合
<接続可>

SQL> connect sys/manager as sysdba
Connected.

シングルコーテーショありの場合
<接続不可>

SQL>  connect 'sys/manager as sysdba'
Enter password:

2.SYSユーザでdbms_flashbackの実行権限をscottに与える。

SQL> GRANT EXECUTE ON dbms_flashback TO scott;
権限付与が成功しました。

3.実際に、過去の戻りたい時間を指定してパッケージを実行する。

ここで、dbms_flashbackパッケージのenable_at_timeプロシージャでの時間
指定をどのような形式で書けば良いか迷う人がいるだろう。
ここの設定は、NLS_TIMESTAMP_FORMATに依存する。

SQL> SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';

で設定は確認できるが、今回は手取り早くALTER SESSIONでNLS_TIMESTAMP_FORMAT
を変更してしまおう。

SQL>  CONNECT SCOTT/TIGER
Connected.
SQL> alter session set NLS_TIMESTAMP_FORMAT = 'yyyy/mm/dd hh24:mi:ss';
Session altered.

次に戻りたい時間を指定する。

SQL>  execute dbms_flashback.enable_at_time('2001/12/05 15:00:00');

PL/SQL procedure successfully completed.

最後に、フラッシュバッククエリーを無効にする方法を記述する。

SQL> execute dbms_flashback.disable;
PL/SQL procedure successfully completed.

フラッシュバッククエリーを無効にしないとDDLやDML(更新系)で以下の
ORA-08182が発生する。

SQL> create table a as select * from emp;

ORA-08182: operation not supported while in Flashback mode

次回以降に、実際に使用していくが、その前に関連する初期化パラメータの
設定などを把握しよう!!

以上 心の窓を開いてごらん。 茅ケ崎にて