1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Oracleでコミットしてしまう前のデータを参照したい

Last updated at Posted at 2022-06-18

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した場合はできないのか?

できません。あきらめましょう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?