UNDO管理

※ポイント※
     UNDOデータの管理に関するUNDO表領域、UNDOセグメントの構成と各種初期化パラメータが対象。
     UNDOアドバイザによってどのようなアドバイスを取得することができるかという情報も重要。

UNDOデータ

UNDOデータとは変更前のデータのコピーであり、以下の操作のために保持されるもの。
・読み取り一貫性問い合わせ
他トランザクションがデータを変更中の場合、UNDOデータを使用することで、未確定データを見せないようにする。


・ロールバック
1つの値を戻すためのPL/SQLブロック。
ROLLBACKコマンドにてトランザクションを取り消すと、UNDOデータを使用して元のデータに戻す。


・トランザクションリカバリ(インスタンス障害時のリカバリも含む)
トランザクションに障害が発生したり、インスタンス障害時のリカバリが行われたりすると、コミットしていない処理は、UNDOデータを使用してロールバックされる。


・フラッシュバック問い合わせ、フラッシュバックテーブル
フラッシュバック問い合わせでは、現在のテーブルとUNDOデータがマージされ、過去の一時点の一貫したデータが戻される。
フラッシュバックテーブルの場合も、UNDOデータを使用した一貫データが現在のテーブルに戻され、過去の一時点にリカバリすることができる。

データを変更するトランザクションではUNDOデータが生成され、トランザクションが完了するまでOracleサーバによって維持される。
自動UNDO 管理においては、UNDOデータはUNDOセグメントに格納され、UNDOセグメントはUNDO表領域に格納される。

UNDOセグメントは、UNDO表領域が作成されると自動的に作成される。
UNDO表領域がインスタンスに設定されると、必要な数だけ自動的にオンラインとなり、使用可能になる。
各トランザクションには、1つのUNDOセグメントが割り当てられ、トランザクションが完了するまでは同じUNDOセグメントを使用する。
1つのUNDOセグメントは、複数のトランザクションを処理することができるが、1つのUNDOブロックは1つのトランザクションのために使用される。

UNDOセグメント内のエクステントは、循環して使用される。
最後のエクステントに到達すると、最初のエクステントが使用されていなければそれが上書きされ、使用されていれば新しいエクステントが獲得される。
このような循環処理のため、UNDOセグメントは最低でも2つ以上のエクステントで構成される。

自動UNDO管理の構成

UNDO表領域の作成には2つの方法がある。
Enterprise Managerでは、表領域タイプを「UNDO」として作成する。
CREATE TABLESPACE文では、次のようにUNDOキーワードを使用して表領域を作成する。

SQL> CREATE UNDO TABLESPACE undo01
2 DATAFILE '/…/undo01.dbf' SIZE 100M;

UNDO表領域を使用する際は、UNDOデータの管理を自動にし、UNDO表領域をインスタンスにセットするために、次の初期化パラメータを調整する。

UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE=undo01

さらに、UNDO保存期間(UNDO_RETENTION)を調整する。UNDOデータには、次の3つの状態がある。
--
・コミットされていないUNDO情報
トランザクションが継続している状態。トランザクションが終了するまでは上書きされることはない。


・コミットされたUNDO情報
UNDO保存期間中の状態。
コミット後は上書き可能になるのが通常だが、UNDO保存期間を使用することで、保存期間中は、UNDO表領域が空き不足にならない限り上書きされずに保持される。


・期限切れのUNDO情報
UNDO保存期間が経過した状態。
UNDOセグメント内で上書き可能な状態になっているので、ほかのトランザクションのために使用されることがある。
自動拡張が無効なUNDO表領域であれば、別のUNDOセグメントのためにエクステントを解放できる。

Oracle Database 10gでは、UNDO保存期間は、最長の問い合わせ時間に合わせて自動的に期間が増加されるようになっている。
しかしフラッシュバック問い合わせを使用する環境では、手動で調整しておく必要がある。

またUNDO保存期間中でも、UNDO表領域の領域不足が発生すれば上書きされてしまう可能性がある。
トランザクションをエラーにしてでもUNDO保存期間中のデータを維持する必要がある場合は、UNDO保存の保証を検討する。

 エラー発生内容   エラーを回避するために調整できる設定   解説 
 ORA-01555: スナップショットが古すぎます。  UNDO保存期間
UNDO表領域のサイズ
UNDO保存の保証
ORA-01555エラーは、UNDOデータに問題がある場合のエラーである。
UNDOデータを使用した読み取り一貫性が必要な処理(ほかのトランザクションで更新中の表に対する問い合わせなど)において、
見るべきUNDOデータが上書きされていたりすると発生する。

このエラーを回避するには、必要なUNDOデータが上書きされることのないようにする必要がある。

・UNDO保存期間
トランザクション完了後、UNDOデータを保持しておきたい期間を設定する。UNDO_RETENTION初期化パラメータで設定できる。

・UNDO表領域サイズ
UNDO保存期間中でも、表領域の空き領域(期限切れを含む)が不足しているとUNDOセグメントのUNDOエクステントは上書きされてしまう。
そのため、UNDO保存期間を維持できるだけの表領域を準備する。

・UNDO保存の保証
UNDO保存期間中のエクステントの上書きを禁止することができる。上書きが必要になると該当するトランザクションをエラーにする。

 設問   回答   解説 
 初期化パラメータUNDO_RETENTIONの値を
「1800」に設定している場合のUNDOデータに関する説明 
UNDO表領域の空き領域が十分にある場合に、
COMMIT後1800秒は保持される
UNDO_RETENTION初期化パラメータは、自動UNDO管理において、コミット完了後のUNDO保存期間を設定するパラメータである。
指定した期間中、UNDOデータは、UNDO表領域の領域不足にならない限り上書きされずに保持される。
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License