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領域の内容と現在のテーブル構成が一致しないため、参照できなくなります。
・まとめ
いつでも見れるとは限らない、もしかしたら見れるかも、ぐらいのデータになります。
それでもふとした時に、「やっぱりこのデータも更新前が見たい!」というのは発生するものです。
こんな機能があることを覚えておけば、いつかどこかで役に立つかもしれません。