この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Oracleで誤ってデータを消してコミットしてしまっても、まだ諦めてはいけません。
OracleにはフラッシュバッククエリというUNDO表領域を参照して過去データを取り出す機能があります。
■ うっかりWhere句を忘れて・・・
先日、とあるレコードを変更しようとして、うっかりWhere句による絞り込みを忘れ全レコードが更新されてしまうという失態を犯してしまいました・・・。
トランザクション貼っとけ!という意見はごもっともでありますが、ついうっかりは誰しもあるもの。
■ フラッシュバッククエリで復旧
しかし調べて見ると、Oracleにはフラッシュバッククエリなる過去データを参照する機能があるとのこと!
早速以下のようにUpdateして事なきを得ました。
update users u set u.name =
(select name from users as of timestamp (systimestamp - interval '1' hour)
where u.id = users.id)
上記は1時間前のデータを参照しています。
ちなみに、3分前は
as of timestamp (systimestamp - interval '3' minute )
1日前は
as of timestamp (systimestamp - interval '1' day )
指定した日付、時間
as of timestamp to_timestamp('2015-07-24 00:00:00', 'yyyy-mm-dd hh:mi:ss')
と指定できるようです。
■ 最後に
UNDO表領域はロールバックデータとしても使われ、インサートなどすると古いUNDO表領域が無くなる恐れがありますので、速やかに復旧することをおすすめします。
また、表をTruncateしたり、再作成してしまった場合は、過去データを参照できないのでご注意ください。