忘れかけのIT備忘録

今まで学んできた知識や小技、なるほど!と思ったことをメモするブログです。

UNDOデータの管理(11g)

UNDOデータとは変更前のデータ(コミット前のデータ)を指す

主に
・読み取り一貫性
ロールバック
・フラッシュバック機能(一部)
インスタンスリカバリ
の目的で使用する

UNDOデータは自動UNDO管理と手動UNDO管理に分けられるがここでは自動UNDO管理(9iから推奨になった)について記載する

自動UNDO管理は必要なUNDOセグメント数やサイズを自動的に管理してくれる
下記の初期化パラメータ設定が必要
・UNDO_MANAGEMENT(自動UNDO管理の場合、AUTOにする)
・UNDO_TABLESPACE(UNDO表領域名)
・UNDO_RETENTION(UNDOデータの保存期間)

UNDO表領域にはUNDOデータ以外は格納できない
1つのトランザクションのUNDOデータは1つのUNDOセグメントで管理されるが、1つのUNDOセグメントで複数のトランザクションのUNDOデータを管理できる(トランザクション 1..*:UNDOセグメント 1)
UNDOセグメントはエクステントを循環的に使用し、自動的にエクステントの取得・解放を行う

自動UNDO管理の場合、UNDO_RETENTIONに指定された期間(デフォルト900秒)はUNDOデータが保存される
ただし、UNDO_RETENTIONは努力値であり、UNDO保存の保証(デフォルト無効)が無効の場合、UNDO_RETENTIONで指定された期間内でも表領域サイズ不足等でUNDOデータが上書きされる可能性がある
※アクティブなUNDO(未コミットのトランザクションのUNDOデータ)は絶対に上書きされないが、期限切れではないUNDO(UNDO_RETENTION期間内だがコミット済みトランザクションのUNDOデータ)は上書きされる可能性がある
尚、期限切れのUNDO(UNDO_RETENTION期間内かつコミット済みトランザクションのUNDOデータ)は上書き可能なのでこれから優先的に上書きされていく

例えば、
長時間掛かるSELECT開始後、UNDO_RETENTION経過またはSELECT中に別トランザクションで該当データをDML・コミットした場合、UNDOデータが上書きされる
→長時間掛かるSELECTセッションはUNDOデータが参照できないため、「ORA-01555」が発生する

上記の対策として、
・UNDO_RETENTION値を増やす
・UNDO保存の保証を有効にする(alter tablespace UNDO表領域 retention guarantee;)
がよくある手段だが、物理的にUNDO表領域がサイズ不足になると今度は「ORA-30036」エラーが発生する。諸刃の剣である。

尚、UNDOアドバイザを活用すると良い
UNDOアドバイザを使用する前に考慮しておくこととして
・最も長くかかるSELECTの実行時間
・フラッシュバック機能をサポートするためのUNDO保存期間
の考慮が必要となる

ちなみに自動UNDO管理であっても下記ケースはUNDO_RETENTIONが無視されるので注意
・UNDO表領域が固定サイズ(UNDO表領域の自動拡張が無効)
・UNDO保存の保証が無効

一時UNDOを使うとUNDO表領域の使用量は減るが、一時表領域の使用量が増えるので注意