ホーム DoRuby Oracleで誤ってデータを消してしまった際のリカバリ

Oracleで誤ってデータを消してしまった際のリカバリ

この記事はアピリッツの技術ブログ「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したり、再作成してしまった場合は、過去データを参照できないのでご注意ください。

記事を共有

最近人気な記事