トップ > DBA中級 > 13章
13章 UNDO管理
本章ではUNDOについて学んでいきます。UNDOは読み取り一貫性や、リカバリなど重要な機能を提供する為に必要なデータです。 しっかりと理解して行きましょう。

UNDOとは


UNDOとは更新される前のデータです。DML文が実行され、データが更新されるときに、UNDOデータは生成され、更新前のデータはUNDOブロックに保持されます。

このUNDOはROLLBACK実行時、更新前のデータに戻す時に使用されます。

UNDOデータ

UNDOデータは主にロールバック時のデータ取り消しの際に使用される為、コミットしてしまえばUNDOは不要になります。 不要になったUNDOデータは新規UNDOによって上書きできる状態となります。

またUNDOはロールバックに使用されるだけではなく以下の機能で使用されます。

・ロールバック
・読み取り一貫性
・フラッシュバック機能

読み取り一貫性とは変更中のデータ(COMMITしていないデータ)をSELECTした場合は、変更前のデータを参照する機能です。
詳細は「26_読み取り一貫性」を参照してください。

読取り一貫性機能で使用するUNDOがない場合、以下のメッセージが出力され、SQLはエラーになります。

  ORA-01555: スナップショットが古すぎます: 
  ロールバック・セグメント番号 xxx、名前xxxが小さすぎます
「ORA-01555」が発生しないようコミット後もUNDOデータは読取り一貫性で使用される可能性がある為、すぐに上書きさせないようにする必要があります。

UNDO_RETENTIONパラメータはコミット後のUNDOの保持期間を設定する初期化パラメータです。このパラメータを適切な値に設定し、読取り一貫性やフラッシュバック機能の「ORA-1555」を回避することが出来ます。

UNDO_RETENTION:900(秒)

UNDO_RETENTIONパラメータのデフォルトは900秒です。 どのくらいの設定値が最適かは難しいところですが、読み取り一貫性の機能で長時間かかるSELECT文が存在した場合、 SELECT文の終了時間までは保持する方が良いと考えます。システムでもっとも長いSELECTが30分だとすれば、UNDO_RETENTIONは1800秒にすることが望ましいです。

UNDOの自動管理


UNDOを管理する為に以前はUNDOセグメント作成したりと、色々なタスクが存在しましたが、Oracle 9i以降はUNDOの自動管理の機能が追加された為、現在のバージョンでは管理者によるUNDO管理は必要ありません。 UNDOの自動管理を有効にするには以下のパラメータを設定します。

UNDO_MANAGEMENT:AUTO(デフォルト)
UNDO_TABLESPACE:DB内の最初に使用可能なUNDO表領域(デフォルト)

UNDO_MANAGEMENTがAUTOまたはNULLの場合は、自動UNDO管理を使用可能にします。MANUALの場合は、手動UNDO管理モードを設定します。
UNDO_TABLESPACEはUNDO表領域の名前を指定します。

上記パラメータを設定するだけで管理者のUNDO管理はOracleが自動で行ってくれます。 その他管理者が行う作業としては、UNDO表領域のサイズ不足時のデータファイルの拡張くらいです。

UNDOの保存期間の自動チューニング


UNDOの自動管理を有効にするとUNDO_RETENTIONの値も自動チューニングします。自動UNDO管理ではUNDO表領域サイズとシステム・アクティビティに基づいて、UNDO保存期間を自動的にチューニングします。

UNDO_RETENTIONは最小保持期間として手動で設定が可能ですが、もしOracleが設定した値より長い時間の保持が必要だと判断すると、設定した値より長い時間を保持します。

Oracleは以下のUNDO表領域の構成に基づいてUNDO_RETENTIONを自動的に
チューニングします。

UNDOデータ

UNDO表領域のデータファイルの自動拡張が有効の場合は、UNDOの保存期間を
システムでアクティブな最長実行問合せより若干長くなるように動的にチューニングします。ただし、この保存期間は、Oracle Flashback操作に対応するには不十分な場合があります。

UNDO表領域のデータファイルの自動拡張が無効の場合は、表領域のサイズと
現行のシステムの負荷に対して最適な保存期間を確保するように、UNDO保存期間を動的にチューニングします。通常、この最適な保存期間は、アクティブな最長実行問合せの期間よりもかなり長くなります。

UNDOの保存保証


UNDO_RETENTIONパラメータの値はUNDO表領域に余裕があった場合、必ず保持されますが、領域不足の場合は、指定した時間を超えていなくても、上書きされます。
領域不足の場合、新規DML文のUNDOが作成出来ないとDML文が失敗してしまうため、UNDO_RETENTIONの保持時間内であってもそのUNDOは上書きされます。

ただどうしても、UNDO_RETENTIONの時間までかならずUNDOデータを保持しておきたいという場合は、UNDO_RETENTIONの時間まで上書きさせない方法があります。 こちらがUNDOの保存保証という機能です。
デフォルトはUNDOの保存保証は無効となっていますが、有効にすればUNDO_RETENTIONのパラメータまで必ずUNDOを保持します。

以下が構文です。

[構文] UNDOの保存保証を有効
ALTER TABLESPACE UNDO 表領域名 RETENTION GUARANTEE;

[構文] UNDOの保存保証を無効(デフォルト)
ALTER TABLESPACE UNDO 表領域名 RETENTION NOGUARANTEE;

UNDOの保存保証を有効にした場合、UNDO表領域が一杯になってしまうと、
UNDO_RETENTIONの時間まで上書きできなくなり、DML文が失敗してしまうのでご注意ください。


以上がUNDOの管理となります。