#topicpath

* 参考文献 [#efc2fdd4]

- [[Oracle Databaseアドバンスト・アプリケーション開発者ガイド 11gリリース1(11.1):http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/appdev.111/E05687-02/toc.htm]]
- [[Flashback Data Archiveの使用:http://www.oracle.com/technology/global/jp/obe/11gr1_db/security/flada/flada.htm]] … Oracle By Example

マニュアルの例はあまり面白くないので、
OBE (Oracle By Example) に沿って練習してみました。

* Flashback Data Archiveの作成と使用 [#jc819081]

表領域を作ります。

#pre{{
SQL> CREATE SMALLFILE TABLESPACE fla_tbs1
  2  DATAFILE '/u02/oradata/orcl/fla_tbs01.dbf'
  3  SIZE 10M REUSE AUTOEXTEND ON                         
  4  NOLOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
  5  /

表領域が作成されました。
}}

hrユーザのロックを解除します。
DBCA から DB を作ったときにサンプルスキーマを入れるというようにしていない場合は、
別途インストールするかDBを作り直しましょう。

パスワードは簡単なものは蹴られてしまうように設定してしまったので、
ちょっと長くなっています。

#pre{{
SQL> ALTER USER hr identified by hrhrhrhr0 ACCOUNT UNLOCK 
  2  /

ユーザーが変更されました。
}}

hr にフラッシュバック・アーカイブの権限を付与します。

#pre{{
SQL> GRANT FLASHBACK ARCHIVE ADMINISTER TO hr 
  2  /

権限付与が成功しました。
}}

hrユーザでつなぎます。

#pre{{
SQL> conn hr/hrhrhrhr0@orcl
接続されました。
}}

フラッシュバック・アーカイブを作成します。

#pre{{
SQL> CREATE FLASHBACK ARCHIVE fla1
  2  TABLESPACE fla_tbs1
  3  QUOTA 10M
  4  RETENTION 1 YEAR
  5  /

フラッシュバック・アーカイブが作成されました。
}}

hr.employees 表にフラッシュバック・アーカイブを設定します。
この表の変更履歴が追えるようになる、ということですね。

#pre{{
SQL> ALTER TABLE hr.employees FLASHBACK ARCHIVE fla1
  2  /

表が変更されました。
}}

Foxさんの給与を表示してみます。

#pre{{
SQL> col employee_id format 999999999
SQL> col last_name format a20
SQL> col salary format 9999999999
SQL> SELECT employee_id, last_name, salary
  2  FROM   hr.employees
  3  WHERE  last_name = 'Fox'
  4  /

EMPLOYEE_ID LAST_NAME                 SALARY
----------- -------------------- -----------
        170 Fox                         9600

}}

給与を1000ドルずつ3回増やしてみるそうです。

#pre{{
SQL> UPDATE hr.employees
  2  SET salary = salary + 1000
  3  WHERE last_name = 'Fox'
  4  /

1行が更新されました。

SQL> COMMIT
  2  /

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

SQL> UPDATE hr.employees
  2  SET salary = salary + 1000
  3  WHERE last_name = 'Fox'
  4  /

1行が更新されました。

SQL> COMMIT
  2  /

コミットが完了しました。
SQL> UPDATE hr.employees
  2  SET salary = salary + 1000
  3  WHERE last_name = 'Fox'
  4  /

1行が更新されました。

SQL> COMMIT
  2  /

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

}}

3000ドル増えてます。

#pre{{
SQL> SELECT employee_id, last_name, salary
  2  FROM hr.employees
  3  WHERE last_name = 'Fox'
  4  /

EMPLOYEE_ID LAST_NAME                 SALARY
----------- -------------------- -----------
        170 Fox                        12600

}}

フラッシュバック・データ・アーカイブのおかげで、
ちょっと前の状態を取得できたりします。

#pre{{
SQL> SELECT employee_id, last_name, salary
  2  FROM hr.employees
  3  AS OF TIMESTAMP
  4  (SYSTIMESTAMP - INTERVAL '2' MINUTE)
  5  WHERE last_name = 'Fox'
  6  /

EMPLOYEE_ID LAST_NAME                 SALARY
----------- -------------------- -----------
        170 Fox                        11600

SQL> 
SQL> l4
  4* (SYSTIMESTAMP - INTERVAL '2' MINUTE)
SQL> c /'2'/'4'/
  4* (SYSTIMESTAMP - INTERVAL '4' MINUTE)
SQL> l
  1  SELECT employee_id, last_name, salary
  2  FROM hr.employees
  3  AS OF TIMESTAMP
  4  (SYSTIMESTAMP - INTERVAL '4' MINUTE)
  5* WHERE last_name = 'Fox'
SQL> r
  1  SELECT employee_id, last_name, salary
  2  FROM hr.employees
  3  AS OF TIMESTAMP
  4  (SYSTIMESTAMP - INTERVAL '4' MINUTE)
  5* WHERE last_name = 'Fox'

EMPLOYEE_ID LAST_NAME                 SALARY
----------- -------------------- -----------
        170 Fox                         9600

SQL> 
}}

このあたりを実行計画から調べることもできます。

#pre{{
SQL> explain plan for
  2  SELECT employee_id, last_name, salary
  3  FROM hr.employees
  4  AS OF TIMESTAMP
  5  (SYSTIMESTAMP - INTERVAL '5' MINUTE)
  6  WHERE last_name = 'Fox'
  7  /

解析されました。

SQL> @?/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----------------------------------------
Plan hash value: 1836971204

----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                    |     2 |    80 |    9  (12)| 00:00:01 |        |       |
|   1 |  VIEW                           |                    |     2 |    80 |    9  (12)| 00:00:01 |        |       |
|   2 |   UNION-ALL                     |                    |       |       |   |           |       |       |
|*  3 |    FILTER                       |                    |       |       |   |           |       |       |
|   4 |     PARTITION RANGE SINGLE      |                    |     1 |    66 |    3   (0)| 00:00:01 |    KEY |     1 |
|*  5 |      TABLE ACCESS FULL          | SYS_FBA_HIST_73953 |     1 |    66 |    3   (0)| 00:00:01 |    KEY |     1 |
|*  6 |    FILTER                       |                    |       |       |   |           |       |       |
|*  7 |     HASH JOIN OUTER             |                    |     1 |  2056 |    6  (17)| 00:00:01 |        |       |
|*  8 |      TABLE ACCESS BY INDEX ROWID| EMPLOYEES          |     1 |    28 |    2   (0)| 00:00:01 |        |       |
|*  9 |       INDEX RANGE SCAN          | EMP_NAME_IX        |     1 |       |    1   (0)| 00:00:01 |        |       |
|* 10 |      TABLE ACCESS FULL          | SYS_FBA_TCRV_73953 |     1 |  2028 |    3   (0)| 00:00:01 |        |       |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("TIMESTAMP_TO_SCN"(SYSTIMESTAMP(6)-INTERVAL'+00 00:05:00' DAY(2) TO SECOND(0))<1572805)
   5 - filter("LAST_NAME"='Fox' AND "ENDSCN"<=1572805 AND
              "ENDSCN">"TIMESTAMP_TO_SCN"(SYSTIMESTAMP(6)-INTERVAL'+00 00:05:00' DAY(2) TO SECOND(0)) AND ("STARTSCN" IS
              NULL OR "STARTSCN"<="TIMESTAMP_TO_SCN"(SYSTIMESTAMP(6)-INTERVAL'+00 00:05:00' DAY(2) TO SECOND(0))))
   6 - filter("STARTSCN"<="TIMESTAMP_TO_SCN"(SYSTIMESTAMP(6)-INTERVAL'+00 00:05:00' DAY(2) TO SECOND(0)) OR
              "STARTSCN" IS NULL)
   7 - access("T".ROWID=CHARTOROWID("RID"(+)))
   8 - filter("T"."VERSIONS_STARTSCN" IS NULL)
   9 - access("T"."LAST_NAME"='Fox')
  10 - filter(("ENDSCN"(+) IS NULL OR "ENDSCN"(+)>1572805) AND ("STARTSCN"(+) IS NULL OR
              "STARTSCN"(+)<1572805))

Note 
-----
   - dynamic sampling used for this statement (level=2)

36行が選択されました。
}}

最後の例は、前の値に戻せますよというものでした。

#pre{{
SQL> UPDATE hr.employees
  2  SET salary =
  3  (SELECT salary FROM hr.employees
  4  AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
  5  WHERE last_name = 'Fox')
  6  WHERE last_name = 'Fox'
  7  /

1行が更新されました。

SQL> COMMIT
  2  /

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

SQL> SELECT salary FROM hr.employees
  2  WHERE last_name = 'Fox'
  3  /

     SALARY
-----------
      10600
}}

* Flashback Data Archiveに関するデータ・ディクショナリ情報の表示 [#te5067a3]

どのへんを見ればいいかというところです。

まずはどの表を見ればいいのかを調べてみます。

#pre{{
SQL> SELECT table_name FROM dict
  2  WHERE table_name LIKE '%FLASHBACK_ARCHIVE%'
  3  /

TABLE_NAME
--------------------------------------------------------------------------------
DBA_FLASHBACK_ARCHIVE
DBA_FLASHBACK_ARCHIVE_TABLES
DBA_FLASHBACK_ARCHIVE_TS
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES

}}

dba_flashback_archive表です。いつ作ったかですね。

#pre{{
SQL> SELECT flashback_archive_name, create_time, status
  2  FROM dba_flashback_archive
  3  /

FLASHBACK_ARCHIVE_NAME
--------------------------------------------------------------------------------
CREATE_TIME
---------------------------------------------------------------------------
STATUS
---------------------
FLA1
09-09-20 17:31:36.000000000

}}

dba_flashback_archive_ts表では表領域がわかります。

#pre{{
SQL> SELECT * FROM dba_flashback_archive_ts
  2  /

FLASHBACK_ARCHIVE_NAME
--------------------------------------------------------------------------------
FLASHBACK_ARCHIVE#
------------------
TABLESPACE_NAME
--------------------------------------------------------------------------------
QUOTA_IN_MB
--------------------------------------------------------------------------------
FLA1
                 1
FLA_TBS1
10


SQL> 
}}

dba_flashback_archive_table表では表の情報が取れます。

#pre{{
SQL> col table_name format a10
SQL> col owner_name format a10
SQL> col flashback_archive_name format a10
SQL> col archive_table_name format a20
SQL> SELECT * FROM dba_flashback_archive_tables
  2  /

TABLE_NAME OWNER_NAME FLASHBACK_ ARCHIVE_TABLE_NAME   STATUS
---------- ---------- ---------- -------------------- ------------------------
EMPLOYEES  HR         FLA1       SYS_FBA_HIST_73953   ENABLED

}}

* Flashback Data Archiveの変更 [#e62bc247]

放っておけば設定した期間で消えますが、
明示的に古い履歴を消すということもできます。

#pre{{
[oracle@ora1 flada]$ sqlplus hr/hrhrhrhr0@orcl
...
SQL> ALTER FLASHBACK ARCHIVE fla1
  2  PURGE BEFORE TIMESTAMP
  3  (SYSTIMESTAMP - INTERVAL '10' MINUTE)
  4  /

フラッシュバック・アーカイブが変更されました。

SQL> 
}}

このアーカイブ領域を増やすこともできます。

追加で表領域を作ります。

#pre{{
SQL> conn sys/oracle@orcl as sysdba
接続されました。
SQL> CREATE SMALLFILE TABLESPACE fla_tbs2
  2  DATAFILE '/u02/oradata/orcl/fla_tbs2.dbf'
  3  SIZE 10M REUSE AUTOEXTEND ON
  4  NOLOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
  5  /

表領域が作成されました。
}}

hr ユーザで増やしてみます。

#pre{{
SQL> connect hr/hrhrhrhr0
接続されました。
SQL> ALTER FLASHBACK ARCHIVE fla1
  2  ADD TABLESPACE fla_tbs2
  3  QUOTA 5M  
  4  /

フラッシュバック・アーカイブが変更されました。
}}

SQL> ALTER FLASHBACK ARCHIVE fla1
  2  MODIFY RETENTION 2 YEAR
  3  /

フラッシュバック・アーカイブが変更されました。
}}

保持期間を変えることもできます。

#pre{{
SQL> ALTER FLASHBACK ARCHIVE fla1
  2  MODIFY RETENTION 2 YEAR
  3  /

フラッシュバック・アーカイブが変更されました。
}}

フラッシュバック・アーカイブを無効にもできます。

#pre{{
SQL> ALTER TABLE hr.employees NO FLASHBACK ARCHIVE
  2  /

表が変更されました。
}}

削除は DROP です。

#pre{{
SQL> DROP FLASHBACK ARCHIVE fla1
  2  /

フラッシュバック・アーカイブが削除されました。
}}

* 後始末 [#j4f2754d]

練習のために使った表領域などは消しておきます。

#pre{{
SQL> conn sys/oracle@orcl as sysdba
接続されました。
SQL> DROP TABLESPACE fla_tbs1 INCLUDING CONTENTS
  2  /

表領域が削除されました。

SQL> DROP TABLESPACE fla_tbs2 INCLUDING CONTENTS
  2  /

表領域が削除されました。

SQL> !ls /u02/oradata/orcl/
control01.ctl  fla_tbs01.dbf  redo03.log     sbyredo04.log  undotbs01.dbf
control02.ctl  fla_tbs2.dbf   sbyredo01.log  sysaux01.dbf   users01.dbf
encrypt01.dbf  redo01.log     sbyredo02.log  system01.dbf
example01.dbf  redo02.log     sbyredo03.log  temp01.dbf

SQL> !rm /u02/oradata/orcl/fla_*.dbf   
}}

----
#comment

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS