その他
    ホーム 技術発信 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したり、再作成してしまった場合は、過去データを参照できないのでご注意ください。