2013/09/07

Oracleでデータを消してしまったあなたへ。"フラッシュバッククエリ"

■データを誤って消してしまった・・・

Oracleでそんな経験あると思います。背筋が凍ります。
実はDML(INSERT、UPDATE、DELETE)のSQLを誤って実行し、さらにCOMMITしてしまった場合でも、
UNDOデータを参照して復活させることができます。

これをフラッシュバッククエリ(Flashback Query)といいます。

・3分前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '3' minute );

・1時間前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '1' hour );

・1日前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '1' day );

・指定した日付、時間のデータを参照
select * from hoge
as of timestamp to_timestamp('2013-09-07 09:30:00', 'yyyy-mm-dd hh:mi:ss');

・SCNからデータを参照
select * from hoge
as of scn (18416710);

またWhere句で指定したデータを参照することも可能です。

リカバリする際は、INSERTすればいいのですが、
複数のテーブルをリカバリする際には、CTAS(Create Table As Select)でリカバリテーブルを作ることをオススメします。
create table hoge_recovery as
select * from hoge
as of timestamp (systimestamp - interval '3' minute );

INSERTだともちろんUNDO表領域を使いますので、
一つ目のテーブルをリカバリしている間に二つ目のテーブルのUNDOデータが無くなってしまう可能性があります。
CTASならUNDO表領域を使わないので、まずはリカバリデータの確保をして、
そのあとゆっくりINSERTしましょう。


0 件のコメント:

コメントを投稿