10gがもたらす福音(9)〜フラッシュバックの新機能(2)。
フラッシュバックテーブル
外部参照制約など、変更に伴うデータ整合が問題となる場合
フラッシュバックテーブルを使用する。
フラッシュバックテーブルの実行。
1行管理を有効化する
alter table 表名 enable row movement
2フラッシュバックテーブルの実行
参照整合性制約がある、関連する表を表名リストに指定することで、
制約違反を防ぎながら、過去の時点に戻すことができる。
flashback table 表名リスト to scn システム変更番号 [enable triggers]
flashback table 表名リスト to timestamp 時刻 [enable triggers]
表に作成されているトリガーは自動的に無効にされて、フラッシュバックされる。
トリガーを有効にしておくには、明示的にオプションを付けておく必要が
ある。
注意点。
フラッシュバックドロップ
表の削除を元に戻す機能。表は削除されても即時に消失するのではなく
一旦、ごみ箱と呼ばれる領域に格納される。
元のオブジェクト名をシステムが生成した名前にリネームにし、
表領域の空きがある限り保存される。
表を復活させる時は、自動的に索引や制約、トリガーも復活する。
ごみ箱内のオブジェクトの確認。
DBA_RECYCLEBIN
フラッシュバックドロップの実行。
flashback table 表名 to before drop [rename to 新表名]
表名には、元の名前と、システムが生成したごみ箱内での名前が
指定できる。
注意点。
1.リストアするオブジェクトは、後入れ先出し(LIFO)形式で決定される。
(古いものをリストアしたい場合は、ごみ箱内での名前を指定する)
2.リストア時に同じ名前のオブジェクトが既に存在しているとエラーとなる。
3.依存オブジェクトも復活するがリネームは手動で行う。
(なんでやねん!)
ごみ箱の領域確保に関するメモ。
Oracleは、次の順番で領域を使用する。
- 空き領域
- ごみ箱の領域
- 自動拡張が設定されていれば、ここまで来て初めて拡張。
よって、自動拡張が成されていても、ごみ箱領域を使用されてしまう。
ごみ箱領域の手動解放。
1.全表領域のごみ箱領域解放
purge dba_recyclebin
2.指定した表領域のごみ箱領域解放
purge tablespace 表領域名 [user スキーマ名]
3.自スキーマのオブジェクト解放
purge user_recyclebin
4.指定オブジェクトの解放
purge table 表名
purge index インデックス名
ごみ箱を使わずに削除する
drop table 表名 purge
フラッシュバックデータベース
通常のリカバリでは、ある時点のデータファイルをリストアして
それに対してアーカイブREDOログを適用していくことになる。
一方、フラッシュバックデータベースは、現時点から、フラッシュバックログを
使用して、巻き戻しを行うイメージとなる。
フラッシュバックデータベースの有効化。
- フラッシュリカバリ領域の有効化
- db_recovery_file_destの設定。
- db_recovery_file_dest_sizeの設定。
- archivelogモードにする。
- フラッシュバックデータベースの有効化
- mountモードとする
- 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
フラッシュバックデータベース機能が使えないケース
- 前回のRESETLOGSが行われた時点以前へのフラッシュバック
- データファイルが縮小されている
- 制御ファイルが再作成されている
- 表領域が削除されている
- alter tablespace 表領域名 flashback offがされている
(変更情報が格納されていないため)