■データを誤って消してしまった・・・
Oracleでそんな経験あると思います。背筋が凍ります。
実はDML(INSERT、UPDATE、DELETE)のSQLを誤って実行し、さらにCOMMITしてしまった場合でも、
UNDOデータを参照して復活させることができます。
これをフラッシュバッククエリ(Flashback Query)といいます。
・3分前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '3' minute );
as of timestamp (systimestamp - interval '3' minute );
・1時間前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '1' hour );
as of timestamp (systimestamp - interval '1' hour );
・1日前のデータを参照
select * from hoge
as of timestamp (systimestamp - interval '1' day );
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');
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 );
select * from hoge
as of timestamp (systimestamp - interval '3' minute );
INSERTだともちろんUNDO表領域を使いますので、
一つ目のテーブルをリカバリしている間に二つ目のテーブルのUNDOデータが無くなってしまう可能性があります。
CTASならUNDO表領域を使わないので、まずはリカバリデータの確保をして、
そのあとゆっくりINSERTしましょう。
0 件のコメント:
コメントを投稿