SSJ Tech Lab - Oracle Database テクニカルラボ

UNDO概要

対応バージョン

Oracle Database 10.1 - 12.1

2016-06-27記事公開

ここではUNDOの概要について記載します。

UNDO概要

UNDOの役割

UNDOとはロールバック(巻き戻し)又は処理の取り消しを行う情報を管理したレコード(行)のことを指します。これらのレコードは表領域に保存され、以下に示す内容に使用されます。


役割 概要
ROLLBACK文を発行したときのトランザクションのロールバック 処理を開始して、データがコミット(決定)されるまでの巻き戻しを行います。主にはアップデート文やインサート文によりデータの更新を行い、COMMIT文を実行するまでの間で、ROLLBACK文を実行することでCOMMIT実行前の巻き戻し処理を行います。
データベースのリカバリ データベースのリカバリ時には、REDOログに記録されたデータベースの変更点を適用していきますが、常にデータベースは更新されているため、コミットされなかったデータが存在することがあります。そのデータの取り消し処理を行うためにUNDOレコードが使用されます。プロセスのリカバリ時に完了しなかったトランザクションについても同様です。
読込み一貫性の提供 UNDOを使用し、検索時に時間断面の一貫性のあるデータを提供します。UNDOから過去データを参照し、検索中に変更されたデータではなく、検索開始時のデータの結果を提供します。
Oracle Flashback Queryを使用した過去のある時点のデータの分析 UNDOから過去データを参照し、指定した時間のデータ内容を確認することが出来ます。
Oracle Flashback機能を使用した論理的な破損のリカバリ UNDOから過去データを参照することで、論理的な破損のリカバリにも使用できます。指定した時間のデータ内容の確認だけでなく、変更操作の追跡や指定したデータ内容へ戻すためのSQLを提供します。

自動UNDO管理と手動UNDO管理

UNDOの管理方法として、自動UNDO管理と手動UNDO管理の管理方法が選択できます。
手動UNDO管理では、ロールバック・セグメントと呼ばれるUNDO情報管理用のセグメントを表領域内に作成し、管理をします。手動UNDO管理は、Oracle Database 9iより追加された自動UNDO管理よりも管理方法が複雑で、ORA-01555(UNDO領域の不足やUNDOレコード保存時間を超過した参照で発生するエラー)が発生しやすいなどの問題から、Oracleとしても現在では自動UNDO管理を推奨しており、11gからは自動UNDO管理がデフォルトとなっています。
また、マニュアルの管理者ガイドでも、UNDO管理の説明は自動UNDO管理についてされています。
ここでは自動UNDO管理を前提とした概要を説明します。

参考資料
https://docs.oracle.com/cd/E49329_01/server.121/b71301/undo.htm
Oracle Database管理者ガイド
12cリリース1 (12.1)
B71301-04
16 UNDOの管理

UNDO表領域

データベースでは、UNDOレコードを保存するためにUNDO表領域を使用します。UNDO表領域にはUNDOセグメントが作成されます。UNDOセグメント内にUNDOレコードが保存されます。
データベース起動時にUNDO_TABLESPACE初期化パラメータに指定された名前のUNDO表領域が使用されます。UNDO_TABLESPACEが指定されていない場合、他で使用していない、使用可能なUNDO表領域を使用します。使用可能なUNDO表領域が存在しない場合はSYSTEM表領域が使用されます。
SYSTEM表領域の使用はOracleに推奨されていません。

UNDOの保存期間

UNDO期間には保存期間の概念があります。保存期間はUNDO_RETENTION初期化パラメータを使用します。AUTOEXTEND(自動拡張)UNDO表領域の場合、UNDOはこのパラメータに指定した時間以上に保存されます。UNDO表領域の保存保証(表領域に対してRETENTION GUARANTEE句の指定)がある場合は、UNDO_RETENTIONの値を保証します。保存保証なしの固定サイズのUNDO表領域の場合は、UNDO_RETENTIONの値は無視されます。

一時UNDO

Oracle Database 12cより、一時UNDOの管理が可能となっています。
TEMP_UNDO_ENABLED初期化パラメータの設定により、永続表領域と一時表領域(Temporary Tablespace)に対するUNDOが区別され、一時表領域のUNDOが一時表領域自体へ格納されます。
一時表領域のUNDOレコードがREDOログに生成がされなくなる分、パフォーマンスの改善が期待できます。また、REDOログの転送機能によるデータ同期などを行っていた場合は、転送量の減少及び転送処理のパフォーマンス向上が期待できます。
他に、Oracle Active Data Guardオプションを使用したスタンバイ・データベースに対して、一時表(TEMPORARY TABLE)へのアップデートなどのデータ操作言語(DML)操作が可能となります。

これら一時表領域へのUNDO生成や一時表の操作については、ALTER SESSIONによるTEMP_UNDO_ENABLEDの変更で、セッション単位でも制御が可能です。