Oracle Databaseでは、トランザクションのロールバックや一貫性読み取りを実現するためにUNDO領域が利用されています。自動UNDO管理を使用している環境では、過去のデータ状態をどの程度保持するかを設定するパラメータが重要になります。
その代表的なパラメータがUNDO_RETENTIONです。この記事では、UNDO_RETENTIONが何を制御しているのか、自動UNDO管理との関係、設定時の注意点について詳しく解説します。
OracleのUNDO管理とは何か
UNDOとは、データ変更前の状態を保存しておくための領域です。例えば、UPDATEやDELETEなどでデータを変更した場合、Oracleは変更前の情報をUNDO領域へ保存します。
UNDO情報は主に以下のような目的で利用されます。
- ROLLBACKによるトランザクション取り消し
- 一貫性読み取りのための過去データ参照
- 障害発生時のリカバリ処理
Oracleでは以前は手動UNDO管理が利用されていましたが、現在では自動UNDO管理が一般的に使用されています。
UNDO_RETENTIONはUNDOデータの保持時間を指定するパラメータ
UNDO_RETENTIONは、自動UNDO管理においてUNDO情報を保持しようとする時間(秒)を指定する初期化パラメータです。
例えば、以下のように設定します。
ALTER SYSTEM SET UNDO_RETENTION=1800;
この場合、OracleはUNDO情報を約1800秒(30分)保持することを目標に動作します。
つまり、UNDO_RETENTIONの値を大きくすると、長時間実行されるSELECT処理などで必要になる過去データを参照できる可能性が高くなります。
UNDO_RETENTIONとUNDO表領域の関係
UNDO_RETENTIONを設定しただけで、必ず指定時間分のUNDO情報が保存されるわけではありません。実際の保持期間はUNDO表領域のサイズやトランザクション量にも影響されます。
例えば、UNDO_RETENTIONを3600秒(1時間)に設定していても、UNDO表領域の空き容量が不足した場合、Oracleは必要に応じて古いUNDO情報を上書きすることがあります。
十分な保持時間を確保したい場合は、UNDO_RETENTIONの設定だけでなく、UNDO表領域のサイズ設計も合わせて検討する必要があります。
UNDO_RETENTIONを設定する目的と利用例
UNDO_RETENTIONが特に重要になるのは、大量データを扱う処理や長時間実行される検索処理が存在する環境です。
例えば、数時間かかる集計SQLを実行している途中で、別のユーザーが同じテーブルを更新すると、Oracleは過去の状態をUNDO情報から取得して整合性を保ちます。
このような環境ではUNDO_RETENTIONを適切に設定することで、「ORA-01555: スナップショットが古すぎます」といったエラーの発生リスクを低減できます。
UNDO_RETENTIONの現在値を確認する方法
現在設定されているUNDO_RETENTIONの値は、データディクショナリや初期化パラメータ情報から確認できます。
以下のSQLで確認できます。
SHOW PARAMETER UNDO_RETENTION;
また、以下のようにV$PARAMETERビューから確認することも可能です。
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='undo_retention';
運用環境では、設定値だけではなく実際のUNDO使用状況も確認しながら調整することが重要です。
AUTOモードのUNDO管理ではどのように動作するのか
自動UNDO管理では、OracleがUNDO領域の使用状況を監視しながらUNDOデータの管理を行います。
UNDO_RETENTIONは「最低限保持したい目標時間」として扱われ、Oracleは可能な範囲でその時間を維持します。
そのため、UNDO_RETENTIONは強制的にUNDOデータを保存し続ける期限ではなく、UNDO保持期間の目標値である点に注意が必要です。
UNDO_RETENTION設定時の注意点
UNDO_RETENTIONを大きく設定すると、長時間の問い合わせに対応しやすくなりますが、その分UNDO表領域には十分な容量が必要になります。
例えば、大量更新処理が頻繁に発生するシステムでUNDO_RETENTIONだけを増加させても、UNDO領域が不足すれば期待した保持期間を維持できない場合があります。
適切な設定を行うには、データベースの利用状況、トランザクション量、長時間SQLの実行時間などを考慮することが大切です。
まとめ:UNDO_RETENTIONはOracle自動UNDO管理で保持時間を指定するパラメータ
Oracleの自動UNDO管理では、UNDO_RETENTIONがUNDOデータを保持する目標時間を指定する重要なパラメータです。
設定値を調整することで、一貫性読み取りの安定化やORA-01555エラーの防止につながります。
ただし、UNDO_RETENTIONの値だけでは十分ではなく、UNDO表領域のサイズやシステム負荷も合わせて確認しながら設定することが、安定したOracle運用につながります。


コメント