Oracle 11g検証 フラッシュバック・データ・アーカイブ その3

投稿日: 2008年11月26日

<Oracle 11g検証 フラッシュバック・データ・アーカイブ その3>
ペンネーム: オレンジみかん

今週も引き続きフラッシュバック・データ・アーカイブ(以下、FDA)の検証
を行います。

■前回のおさらい
・FDAの実行環境を構築
FDAを利用するには、以下の(1)~(4)の流れでFDAの利用環境を構築します。
(1)フラッシュバック・データ・アーカイブ領域の作成
※SYSユーザーで操作

SQL> --表領域の作成
SQL> CREATE TABLESPACE FDA1_TS1 DATAFILE '/u01/app/oracle/oradata
/insight/fda1_ts1.dbf' SIZE 1G;

(2)FDAの作成

SQL> CREATE FLASHBACK ARCHIVE FDA1 TABLESPACE FDA1_TS1 QUOTA 500M
 2   RETENTION 1YEAR;

(3)FDAの実行権限の設定

SQL> --権限の付与
SQL> GRANT FLASHBACK ARCHIVE ON FDA1 TO SCOTT;

(4)テーブルをFDAの履歴管理対象として設定
履歴データを取得できるようにFDAを設定します。
※前回検証用に作成したEMP_MGR表に対して履歴データを設定する場合

SQL> ALTER TABLE EMP_MGR FLASHBACK ARCHIVE FDA1;

・FDAでの過去レコードの参照
FDAは今までのフラッシュバック機能(フラッシュバッククエリ)と同様に
SELECT文にAS OF [時間]を付けて実行することで過去レコードを参照します。

SELECT [カラム名] FROM [テーブル名] AS OF [時間]

・今までのフラッシュバック機能とFDAとの過去レコード参照の違い
履歴情報はFDAではUNDOデータとは別の場所に保存されるため、今までの
フラッシュバック機能のようにUNDO管理を意識する必要が無くなりました。
そのため、FDAはUNDOデータの制約を意識すること無く保存期間を長く設定
出来るようになりました。

実際にFDAの履歴表の中身を確認してみましょう。

▼レコードの履歴管理
FDAに格納される履歴表名を確認するには、FDAの表に関する情報を管理する
テーブル(USER_FLASHBACK_ARCHIVE_TABLES)を参照することで確認することが
出来ます。

□USER_FLASHBACK_ARCHIVE_TABLESの内容
USER_FLASHBACK_ARCHIVE_TABLESは、現行ユーザが所有する、FDAが有効な
表に関する情報が表示されます。

    TABLE_NAME:
      フラッシュバック・アーカイブが有効な表の名前 
    OWNER_NAME:
      フラッシュバック・アーカイブが有効な表の所有者の名前
    FLASHBACK_ARCHIVE_NAME:
      フラッシュバック・アーカイブの名前 
    ARCHIVE_TABLE_NAME:
      ユーザー表の履歴データを含むアーカイブ表の名前

それでは、EMP_MGR表はどのような履歴表名で管理されているのでしょうか?
USER_FLASHBACK_ARCHIVE_TABLESのFLASHBACK_ARCHIVE_NAME列に注目して
EMP_MGR表の履歴表名を確認してみましょう。

SQL> SELECT * FROM  USER_FLASHBACK_ARCHIVE_TABLES;

TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME
---------- ---------- ---------------------- --------------------
EMP_MGR    SCOTT      FLA1                   SYS_FBA_HIST_72242

USER_FLASHBACK_ARCHIVE_TABLESの内容から、EMP_MGR表に対する履歴表が
SYS_FBA_HIST_72242という名前で作成されていることがわかります。

EMP_MGRの履歴表であるSYS_FBA_HIST_72242表の中身を確認してみましょう。

□履歴表の内容確認
SYS_FBA_HIST_72242という履歴表の定義を確認するとEMP_MGR表に5つの
擬似カラムが追加された表になっています。

SQL> DESC SYS_FBA_HIST_72242
  名前
  ---------------------------
  RID                             ←履歴表の擬似カラム
  STARTSCN                        ←履歴表の擬似カラム
  ENDSCN                          ←履歴表の擬似カラム
  XID                             ←履歴表の擬似カラム
  OPERATION                       ←履歴表の擬似カラム
  EMPNO                           ←EMP_MGR表のカラム
  ENAME                           ←EMP_MGR表のカラム
  JOB                             ←EMP_MGR表のカラム
  MGR                             ←EMP_MGR表のカラム
  HIREDATE                        ←EMP_MGR表のカラム
  SAL                             ←EMP_MGR表のカラム
  COMM                            ←EMP_MGR表のカラム
  DEPTNO                          ←EMP_MGR表のカラム
※EMP_MGR表に追加された擬似カラム
 RID         :ROW ID
 STARTSCN    :履歴レコードが作成されたときの開始システム変更番号(SCN)
 ENDSCN      :履歴レコードが発生する操作(DELETE,UPDATE,INSERT)が終了
              したときの終了システム変更番号(SCN)
 XID         :レコードが作成されたときのトランザクション識別子
 OPERATION   :トランザクションにより実行された操作
              (I:挿入、D:削除、U:更新)

履歴表の擬似カラムの中で、注目はRID、STARTSCN、ENDSCNです。
擬似カラムを見たところ、FDAはSCNでレコードの有効範囲を決めて
動作しているのでしょうか?

それでは実際にDELETE文を発行し、履歴レコードの状態の移り変わりを確認
して見ましょう。
(1)DELETE前の確認
履歴管理されたEMP_MGR表をSELECTした時のSCNとの関係

SQL> --DELETE前のEMP_MGR表の状態
SQL> SELECT ROWID,EMPNO,ENAME,DEPTNO,SAL FROM EMP_MGR;

ROWID                   EMPNO ENAME          DEPTNO        SAL
------------------ ---------- ---------- ---------- ----------
AAARoyAAEAAAAGcAAD       7566 JONES              20       2975
AAARoyAAEAAAAGcAAE       7698 BLAKE              30       2850
AAARoyAAEAAAAGcAAF       7782 CLARK              10       2450

SQL> --履歴テーブルの状態
SQL> SELECT STARTSCN,ENDSCN,RID,DEPTNO,OPERATION
  2   FROM SYS_FBA_HIST_72242;

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

現在のSCNは?

SQL>--[SYSユーザー]
SQL> SELECT CURRENT_SCN,TO_CHAR(systimestamp,'yyyy/mm/dd hh24:
  2   mi:ss') datetime FROM V$DATABASE;

CURRENT_SCN DATETIME
----------- --------------------
    2223403 2008/11/22 17:00:15

SELECT時の履歴レコードのSTARTSCN、ENDSCN、CURRENT_SCNの関係は

 STARTSCN   ENDSCN   DEPTNO           CURRENT_SCN
 -------- --------  -------          ------------
                                          2223403

(2)DELETE後のEMP_MGR表の状態

SQL> --EMP_MGR表の履歴レコードの状態
SQL> DELETE FROM EMP_MGR WHERE DEPTNO=20;

1行が削除されました。

SQL> COMMIT;

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

SQL> SELECT ROWID,EMPNO,ENAME,DEPTNO,SAL FROM EMP_MGR;

ROWID                   EMPNO ENAME          DEPTNO        SAL
------------------ ---------- ---------- ---------- ----------
AAARoyAAEAAAAGcAAE       7698 BLAKE              30       2850
AAARoyAAEAAAAGcAAF       7782 CLARK              10       2450

履歴レコードの状態を確認すると・・・

SQL> SELECT STARTSCN,ENDSCN,RID,DEPTNO,OPERATION
FROM SYS_FBA_HIST_72242;

  STARTSCN     ENDSCN RID                      DEPTNO OPERATION
---------- ---------- -------------------- ---------- ----------
   2223305    2223515 AAARoyAAEAAAAGcAAD           20 I
                      ↑↑
            DELETE操作した時の履歴レコード

削除されたROWID=AAARoyAAEAAAAGcAADのレコードがSTARTSCN=2223305、
ENDSCN=2223515として履歴表に追加されました。

現在のSCNは?

SQL>--[SYSユーザー]
SQL>  SELECT CURRENT_SCN,TO_CHAR(systimestamp,'yyyy/mm/dd hh24:
  2    mi:ss') datetime FROM V$DATABASE;

CURRENT_SCN DATETIME
----------- --------------------
    2223742 2008/11/22 17:10:49

DELETEした履歴レコードのSTARTSCN、ENDSCN、CURRENT_SCNの関係は

 STARTSCN   ENDSCN      CURRENT_SCN
 -------- --------     ------------
  2223305   2223515  <      2223742

以上のように、FDAではDELETE操作を行うと履歴表に行を追加し、操作の
タイミングをSCNの範囲として記録しているようです。

今回はここまで

ドル安くなりましたね。でも海外に遊びに行く予定がなーい! 恵比寿にて