6.3 データの整合性保持のための構造管理

■UNDOデータとは

UNDOデータとは、トランザクションによって、データの変更が行われる前に、データベースによって取得されるデータのコピーのことです。

■UNDOデータの目的

UNDOデータは、次の目的のために使用される。

・ロールバック操作

・読取り一貫性

・フラッシュバック機能

・データベースのリカバリ

○ロールバック操作

ロールバック操作は、データベースに対して行われたコミットされていない変更をもとに戻す操作のこと。ロールバック操作は、ユーザのトランザクションによって、rollback文が実行された場合に、実行される。また、障害が起こった際にリカバリ操作時にOracleデータベースによって、自動的に実行される。

Oracleデータベースは、UNDOデータを使用して、ロールバック操作を行います。アクティブトランザクション(まだ、コミットされていないトランザクション)で仕様されているUNDOデータは、そのトランザクションがコミットされるまで上書きされません。

○読取り一貫性

読取り一貫性は、ユーザがデータを問い合わせ中にそのデータに対して、別の変更が行われても、問合せているユーザは一貫したデータを見ることができるという機能です。

○フラッシュバック機能

フラッシュバック機能とは、コミット済のデータを過去のある時点のデータの表示やリカバリを行う機能です。フラッシュバック機能には、フラッシュバック問合せ、うラッシュバック・トランザクション、フラッシュバック表など、いくつか種類がある。

一部のフラッシュバック機能は、UNDOデータを使用している。

○データベースのリカバリ

障害が起こった後のリカバリ操作では、UNDOデータを使用して、障害発生時にコミットされていなかったトランザクションをロールバックする。

■UNDO保存期間

現在実行中のトランザクションが使用しているUNDOデータは、そのトランザクションがコミットされるまで上書きされない。

また、基本的には、トランザクションをコミットするとそのUNDOデータが専有している領域は、再利用可能になるが、UNDO保存期間中は、トランザクションのコミット後も一定期間は再利用されず、UNDOデータは保持される。

UNDO保存期間は、自動UNDO管理が行われているデータベースでは、自動的にチューニングされる。

トランザクションがコミット済であっても、経過時間がUNDO保存期間に達していないUNDOデータについては、フラッシュバック機能や読取り一貫性で使用できるように、できる限りホゾされる。

自動拡張するUNDO表領域を使用している場合、UNDO保存期間の下限値(秒)をUNDO_RETENTION初期化パラメータで指定できる。

■UNDO保存期間の保証オプション

UNDOデータは、UNDO保存期間内であっても、UNDO表領域が不足した場合は上書きされることがあります。

UNDOデータをUNDO保存期間中、必ず保持したい場合は、UNDO保存期間の保証オプションを有効にする。この場合は、指定したUNDO保存期間が保証されるため、UNDO表領域が不足しても、UNDO保存期間に達していないUNDOデータは上書きされません。ただし、このオプションを有効にすると、UNDO表領域の領域不足が原因で、トランザクション(DML操作)が失敗する可能性があるため注意が必要です。

このオプションは、デフォルトでは、無効です。

UNDO保存期間の保証を有効にするには、UNDO表領域の作成時または変更時にRETENTION GUARANTEE句を指定する。また、UNDO保存期間の保証を無効にする際には、RETENTION NOGUARANTEE句を使用します。

■UNDOデータの管理

Oracle Database 12cでは、自動UNDO管理がデフォルトのモードです。

■UNDOセグメントとUNDO表領域

自動UNDO管理では、UNDOデータは、UNDOセグメントに格納され、UNDOセグメントは、UNDO表領域という特別な表領域に格納される。

UNDO表領域は、UNDOデータ専用の表領域です。この表領域に表セグメントなどの他の種類のセグメントを作成することはできません。1つのインスタンスに対して、1つのUNDO表領域が必要です。

データベース管理者は、UNDO表領域を複数作成できますが、現行データベースのUNDO表領域として、アクティブにできるのは、1つだけです。

UNDO表領域のUNDOセグメントは自動的に作成され、自動的にエクステントが割り当てられます。UNDOセグメントの所有者はSYSユーザです。

■自動UNDO管理

UNDOデータは不要になれば、上書きされ、使用したセグメントの領域は循環方式で再利用される。

UNDOデータは、基本的にはデータベースによって、自動管理されるが、前述のフラッシュバック機能を使用する場合は、データベース管理者がUNDOデータの保存に関する設定を行って、長期間UNDOデータが保持されるように設定することで、フラッシュバック機能を正常に実行できるように運用・管理します。

自動UNDO管理では、データベースの自己チューニング機能によって、UNDOデータの保存期間が決定される。この時、UNDO表領域のデータファイルのサイズが自動拡張可能か否かによって、下記のチューニングが実行される。

▼UNDO表領域のデータファイルのサイズに関するチューニング

自動拡張の可否説明
自動拡張可能
(AUTOEXTEND ON)
自動拡張するUNDO表領域。UNDO保存期間は、最も時間のかかる問合せよりもわずかに長くなるようにチューニングされる。
自動拡張不可
(AUTOEXTEND OFF)
固定サイズのUNDO表領域。UNDO保存期間は、表領域のサイズと現行の負荷に対して、最適な保存期間になるようにチューニングされる。
一般的には、上記の自動拡張するUNDO表領域よりも長期間UNDOデータが保持されるため、フラッシュバックの機能を強化できる。

■UNDO表領域が小さい場合

UNDO表領域が小さい場合、エラーが発生する可能性がある。

この場合は、UNDO表領域を拡張する必要がある。

・新しいトランザクションに対応するUNDOデータを格納するための領域が足りないことによるDML文の失敗

・UNDOデータの不足によって、読取り一貫性が維持できないことによる、スナップショットが古すぎますエラーの発生

UNDOデータは、トランザクションをロールバックする際だけでなく、フラッシュバック機能にも使用する。フラッシュバック機能を成功させるためには、UNDO表領域を十分な大きさに設定した上で、下記の点で管理を行う。

・UNDO保存期間を構成する

・AUTOEXTEND ONの場合は、使用領域が過多にならないように注意する。

・UNDO表領域を固定サイズにする

・UNDOデータの不足によるスナップショットが古すぎますエラーを回避する

■UNDOアドバイザ

UNDO表領域を固定シアズにする際には、そのシステムにとって最適なサイズを決定するのが最善です。

トランザクションの長さ、Accessするデータ量、問合せの実行時間などは、システムごとに異なるため、必要なUNDO領域のサイズもさまざまです。

UNDO表領域を固定サイズにする場合は、十分に時間をかけてデータベースの負荷状況を確認する。業務のワークロードを処理するために必要なUNDO表領域のサイズを判断できる。

■UNDO表領域の最小サイズの算出

将来の長時間実行問合せやフラッシュバック操作に対応できるUNDO表領域の最小サイズは、EM Express のUNDOアドバイザを使用して確認できる。

あわせて読みたい