The Dragon Scroll

Be just and fear not.

10gがもたらす福音(9)〜フラッシュバックの新機能(2)。

フラッシュバックテーブル

外部参照制約など、変更に伴うデータ整合が問題となる場合
フラッシュバックテーブルを使用する。

フラッシュバックテーブルの実行。
1行管理を有効化する
 alter table 表名 enable row movement


2フラッシュバックテーブルの実行
参照整合性制約がある、関連する表を表名リストに指定することで、
制約違反を防ぎながら、過去の時点に戻すことができる。


 flashback table 表名リスト to scn システム変更番号 [enable triggers]
 flashback table 表名リスト to timestamp 時刻 [enable triggers]


表に作成されているトリガーは自動的に無効にされて、フラッシュバックされる。
トリガーを有効にしておくには、明示的にオプションを付けておく必要が
ある。


注意点。

  1. 対象表は、排他的ロックがかけられる
  2. 統計情報はフラッシュバックされない
  3. システム表や内部表(X$で始まる)に対しては実行できない
  4. 表定義の変更が行われるDDL文以前にはフラッシュバックできない
  5. 整合性制約がある場合は、親表・子表ともに指定すること
  6. truncateによる切捨てには、対応できない。フラッシュバックデータベースを使う
  7. 表のdropには対応できない。フラッシュバックドロップを使う

フラッシュバックドロップ

表の削除を元に戻す機能。表は削除されても即時に消失するのではなく
一旦、ごみ箱と呼ばれる領域に格納される。
元のオブジェクト名をシステムが生成した名前にリネームにし、
表領域の空きがある限り保存される。
表を復活させる時は、自動的に索引や制約、トリガーも復活する。


ごみ箱内のオブジェクトの確認。
DBA_RECYCLEBIN


フラッシュバックドロップの実行。
flashback table 表名 to before drop [rename to 新表名]
表名には、元の名前と、システムが生成したごみ箱内での名前が
指定できる。


注意点。
1.リストアするオブジェクトは、後入れ先出し(LIFO)形式で決定される。
(古いものをリストアしたい場合は、ごみ箱内での名前を指定する)
2.リストア時に同じ名前のオブジェクトが既に存在しているとエラーとなる。
3.依存オブジェクトも復活するがリネームは手動で行う。
(なんでやねん!)


ごみ箱の領域確保に関するメモ。
Oracleは、次の順番で領域を使用する。

  1. 空き領域
  2. ごみ箱の領域
  3. 自動拡張が設定されていれば、ここまで来て初めて拡張。

よって、自動拡張が成されていても、ごみ箱領域を使用されてしまう。


ごみ箱領域の手動解放。
1.全表領域のごみ箱領域解放
purge dba_recyclebin
2.指定した表領域のごみ箱領域解放
purge tablespace 表領域名 [user スキーマ名]
3.自スキーマのオブジェクト解放
purge user_recyclebin
4.指定オブジェクトの解放
purge table 表名
purge index インデックス名


ごみ箱を使わずに削除する
drop table 表名 purge

フラッシュバックデータベース

通常のリカバリでは、ある時点のデータファイルをリストアして
それに対してアーカイブREDOログを適用していくことになる。
一方、フラッシュバックデータベースは、現時点から、フラッシュバックログ
使用して、巻き戻しを行うイメージとなる。


フラッシュバックデータベースの有効化。

  1. フラッシュリカバリ領域の有効化
    1. db_recovery_file_destの設定。
    2. db_recovery_file_dest_sizeの設定。
    3. archivelogモードにする。
  2. フラッシュバックデータベースの有効化
    1. mountモードとする
    2. alter database flashback on

このコマンドにより、フラッシュバックログが、フラッシュリカバリ領域に
作成される。


フラッシュバックログにどのくらいの期間の情報を残すか。
db_flashback_retention_targetの設定
(デフォルトは1440分)


フラッシュバックデータベースを有効化することにより、
フラッシュバックバッファと呼ばれるメモリがSGA内に確保され、
変更情報が格納される。
RVWR(RecoveryWriter)プロセスがこのバッファの情報を、
フラッシュバックログに記録する。


フラッシュバックデータベースの実行。
RMANを使用する場合
1.SCNを指定する
flashback database to scn システム変更番号
2.時刻を指定する
flashback database to time 時刻
3.ログ順序番号を指定する
flashback database to sequence ログ順序番号 thread スレッド番号


SQL*Plusを使用する場合
1.SCNを指定する
flashback database to scn システム変更番号
2.時刻を指定する
flashback database to timestamp 時刻


フラッシュバックデータベース実行後の処置。
1.読み取り専用で開く
alter database open read only
(resetlogsでopenするまでは巻き戻しが可能)
2.読み書き可能で開く
alter database open resetlogs


フラッシュバックログに格納されている情報の確認。
V$FLASHBACK_DATABASE_LOG


フラッシュバックデータベース機能が使えないケース

  1. 前回のRESETLOGSが行われた時点以前へのフラッシュバック
  2. データファイルが縮小されている
  3. 制御ファイルが再作成されている
  4. 表領域が削除されている
  5. alter tablespace 表領域名 flashback offがされている

(変更情報が格納されていないため)