OracleDBで少し前のデータを参照する

 

皆様、OracleDBを使った開発、テストを行う中で

「あっ、しまった、このデータのバックアップ取っておけばよかった」

「(開発中に)予想に反してエラーにならずに処理が正常終了してしまった。」

「うーん、この処理での更新前のデータが見たいなぁ」

等々、思う事はありませんか?

私は割とよくあります。

 

そんな時に少し便利な機能を紹介します。

 

・特定の日時のデータを参照する

SELECT * FROM hoge
as of timestamp timestamp ‘2022-07-15 13:00:00’

 

このような書き方でSELECTすることで、2022年7月15日、13時時点の「hoge」テーブルを参照できます。

たとえば13時10分に何らかのデータ更新を行い、COMMITまで完了していたとしても、

COMMIT前のデータが参照できます。

 

・どういうことなのか

OracleのUNDO領域に保存されている情報を参照し、過去データをさかのぼって確認できます。

フラッシュバッククエリと呼ばれるものです。

 

・どのぐらい古いデータまで見れるのか

パラメータ「undo_retention」に保持期間が設定されています。

ただし、実際に保存されているかどうかは保障されません。

大量のデータ更新を伴う場合、UNDO領域に保存しきれず、データが消失する可能性があります。

また、DELETE文の場合は参照可能ですが、TRUNCATE文の場合はUNDO情報自体が作成されないため

過去データの参照はできません。

それ以外にも、データ更新以降にテーブル構成の変更(ALTER TABLE)が行われた場合も

UNDO領域の内容と現在のテーブル構成が一致しないため、参照できなくなります。

 

・まとめ

いつでも見れるとは限らない、もしかしたら見れるかも、ぐらいのデータになります。

それでもふとした時に、「やっぱりこのデータも更新前が見たい!」というのは発生するものです。

こんな機能があることを覚えておけば、いつかどこかで役に立つかもしれません。