OracleにはフラッシュバッククエリというUNDOの領域があります。
それがあるおかげで、Oracleでは間違ってINSERT、DELETE、UPDATEをしたときに更新前の情報をさかのぼることができます。
その機能について今回は記載していこうと思います。
ただ、この機能自体は「使えたらラッキー」程度に考えておいた方がいいと思います(経験談)。
どんな機能か?
トランザクションを利用したSQLを発行する場合、UNDO領域にその情報を保存します。
それを利用して、過去のデータをさかのぼってみることができる機能です。
イメージとしては、Oracleで行っている一時バックアップのような感覚です。
どんな時に利用するのか?
・バッチで更新されたDBの更新前の状況をみたい…など。
・DELETEしてCOMMITしたが、消すデータを間違えていた、など。
本当ならこんな機能を使うことになる前に…
フラッシュバッククエリも保存期間があるため、ログ情報やCOMMITする前にデータのバックアップをとるなど
使わなくてもいいような運用にしておくことが大事です。
どんな構文で使うのか
以下のようなSQLで使用できます。
-- 30分前を見たい場合
select * from hoge
as of timestamp (systimestamp - interval '30' minute ) 列別名;
WHERE 列別名.検索条件
intervalの指定は下記のとおりです。
指定する単語 | 意味 |
---|---|
minute | 分 |
hour | 時間 |
day | 日 |
また、日付を指定して実行することも可能です。
-- 2022/06/18 21:00時点のデータを見たい場合
select * from hoge
as of timestamp to_timestamp('2022-06-18 21:00:00', 'yyyy-mm-dd hh:mi:ss') 列別名;
WHERE 列別名.検索条件
どこまでの期間をさかのぼることができるか?
テーブル内にあるデータ量によります。
また、他のSQL処理でトランザクションを利用した場合、UNDOの情報が上書きされてしまうこともあります。
したがって、確実にこの期間までさかのぼれる…というのは言えないかと思われます。
個人的には1日経ったらほぼ不可能、半日経っていても厳しめのイメージです。
もしさかのぼれない時はどんなエラーが出るのか?
以下のようなエラーが出ます。
ORA-01555: スナップショットが古すぎます: ロールバック・セグメント番号 xxx、名前"yyy"が小さすぎます
TRUNCATEした場合はできないのか?
できません。あきらめましょう。