🐕

ORACLE MASTER Silver DBA 取得に必要な知識のまとめ~UNDOの管理編~

2024/06/16に公開

はじめに

本記事はORACLE MASTER Silver DBA取得に必要な知識の個人的まとめになります。

ORACLE MASTERとは

Oracle Databaseの管理スキルを証明するOracle社の資格です。

Bronze, Silver, Gold, Platinumの4ランクあります。

UNDO表領域とUNDOセグメント

変更前の過去データを格納するための表領域としてUNDO表領域があります。

UNDO表領域にはUNDOセグメントと呼ばれている過去のデータを保持する特殊なセグメントが格納されます。永続表領域と異なり、UNDO表領域には表や索引などのオブジェクトを格納することはできません。

変更処理を実行すると、変更前の過去データであるUNDOデータが生成され、UNDOセグメントに格納されます。

UNDOデータの用途

以下の処理を実行するためにUNDOデータを使用します。

  • トランザクションのロールバック
    • 実行中のトランザクションを中断したときにデータを変更前の状態に戻します
  • 読み取り一貫性
    • 問い合わせ処理と変更処理が並行して実行されたときに、問い合わせ処理に対して一貫性があるデータを戻します
    • 問い合わせ処理開始後に他のセッションによって変更されたデータは、問い合わせ処理に返されるデータに含まれません
  • インスタンスリカバリでのロールバック処理
    • トランザクション実行中にインスタンスが異常終了した場合、データをトランザクション開始前の状態に戻します
  • 多くのフラッシュバック機能
    • フラッシュバックはデータを過去の状態に戻したり、過去の変更処理の内容を確認したりする様々な機能の総称です
    • UNDOデータを使用するフラッシュバック機能には、フラッシュバック問い合わせ、フラッシュバック表、フラッシュバックトランザクション問い合わせなどがあります

UNDOセグメントとトランザクションの関係

UNDOセグメントとトランザクションの関係は以下の通りです。

  • 1つのトランザクションには、ある特定のUNDOセグメントが対応します
    • 1つのトランザクションにより生成されたUNDデータが、複数のUNDセグメントにまたがる形で格納されることはありません
  • 1つのUNDOセグメントに、複数のトランザクションが割り当てられることがあります
  • 大量のデータを変更するトランザクションを実行した場合には、大量のUNDOデータが出力されます

UNDOセグメントを構成するエクステントの使用

表や索引などと同様にUNDOセグメントも複数のエクステントから構成されます。

また、表の行や索引のエントリと同様に、UNDOデータはUNDOセグメントを構成するエクステントに格納されます。

UNDOセグメントは、エクステントを循環的につなげた論理的構造になっています。

トランザクションにより生成されたUNDOデータはトランザクションに対応するUNDOセグメントのエクステントのうち、カレントエクステントと呼ばれるエクステントに出力されます。

カレントエクステントがトランザクションから出力されたUNDOデータで満杯になると、次のエクステントにアクティブなトランザクション(未コミットの実行中トランザクション)が存在しない場合は、次のエクステントがカレントエクステントになります。その後、生成されたUNDOデータは新しいカレントエクステントに出力され、既存のエクステントが再利用される形になります。

カレントエクステントが満杯になり、次のエクステントにアクティブなトランザクションが存在する場合は、次のエクステントはカレントエクステントになりません。

新しいエクステントが割り当てられて、循環構造に追加されます。その新しいエクステントがカレントエクステントになります。

UNDOデータの保存と上書き

UNDOデータのステータスに応じて、UNDOデータが保存されるか、他のUNDOデータで上書きされるかが決まります。

UNDOデータのステータスは、そのUNDOデータを生成したトランザクションが実行中かどうか、トランザクションが終了してからUNDO保存期間を過ぎているかどうかによって決定されます。

UNDOデータのステータスとそのUNDOデータの保存及び上書きの動作の関係は以下の通りです。

ステータス 状況 保存及び上書きの動作
アクティブ そのUNDOデータに関連付けられたトランザクションが実行中(未コミット) 決して上書きされない
有効期限内 ・そのUNDOデータに関連付けられたトランザクションはすでに終了している(コミット済み)
・UNDO保存期間内
原理的に上書きされない
有効期限切れ ・そのUNDOデータに関連付けられたトランザクションはすでに終了している(コミット済み)
・UNDO保存期間を過ぎている
上書きされる可能性がある

読み取り一貫性エラー ORA-01555

Oracle Databaseは読み取り処理と変更処理が並列して実行された場合(正確には読み取り処理が開始した後に、並行して変更処理が実行された場合)、読み取り処理に対して読み取り開始時点の一貫性があるデータを返します。これを読み取り一貫性と呼びます。読み取り一貫性を実現するためには、変更処理により変更される前のデータが必要で、このためにUNDOデータを必要とします。

ここで読み取り一貫性に必要なUNDOデータが上書きされて失われていた場合、 ORA-01555: スナップショットが古すぎます エラーが発生し、その読み取り処理は失敗します。

ORA-01555が発生した場合の簡単な処理策は読み取り処理を実行することです。
もし、ORA-01555が頻発する場合は以下の対処が有効な場合があります。

  • 同一の表に対して実行時間が長い問い合わせと変更を同時に実行しない
  • UNDO表領域のサイズを拡張して、UNDOデータが上書きされにくくする
  • UNDO保存期間を大きい値に設定して、UNDOデータが上書きされにくくする
  • UNDO保存期間を大きい値に設定し、かつ、UNDO保存期間の保証を有効化して、UNDOデータの上書きを防止する

UNDO表領域

UNDO表領域はUNDOセグメントを格納するための特殊な表領域です。UNDO表領域に票や索引などの通常のオブジェクトは格納できません。

UNDO表領域はOracle Databaseの動作に必要不可欠です。もし、使用中のUNDO表領域に障害が発生すると、インスタンスは異常終了します。

Oracle Databaseには最低1つのUNDO表領域が存在します。DBCAでデータベースを作成すると、デフォルトでは UNDOTBS1 という名前のUNDO表領域が作成されます。

原則的にデータベース作成時点でUNDO表領域が構成済みですから、ゼロからUNDO表領域を構成する必要は多くありませんが、もし必要な場合は以下の作業を行います。

  1. UNDO_MANAGEMENT初期化パラメータにAUTOを設定する(自動UNDO管理の設定)
  2. CREATE UNDO TABLESPACE分を実行してUNDO表領域を作成する
  3. UNDO表領域の名前をUNDO_TABLESPACE初期化パラメータに設定する

なお、1つのデータベースに複数のUNDO表領域を構成できます。ただし、使用できるUNDO表領域は1つだけです。すなわち、UNDO_TABLESPACE初期化パラメータに設定できるUNDO表領域は1つだけです。

何らかの理由で使用するUNDO表領域を切り替えたい場合は上の2および3の手順を実行します。

UNDOの保存期間

UNDOデータはトランザクションが実行されるたびに生成されますが、UNDO表領域のサイズには限りがあるため、UNDOデータはいずれ上書きされてなくなります。

UNDO_RETENTION初期化パラメータにUNDO保存期間を設定すると、トランザクションが終了してからUNDO保存期間を経過していないUNDOデータを上書きしないように動作します。

UNDO_RETENTIONを適切に設定すると、ORA-01555の発生を抑制できます。ただし、完全に抑止することはできません。

ORA-01555を完全に抑止するには、後述するUNDO保存期間の保証を有効化します。

UNDO保存期間の保証

UNDO保存期間だけ、必ずUNDOデータが保持されるようにしたい場合はUNDO表領域に対してUNDO保存期間の保証を有効にできます。

UNDO保存期間の保証は、 ALTER TABLESPACE...RETENTION GUARANTEE で有効化できます。 RETENTION NOGUARANTEE を指定すると、保証の設定が無効化されます。

UNDO保存期間の保証を有効化すると、トランザクションの実行によるUNDOデータの生成よりも、過去のUNDOデータの保管を優先します。このため、UNDO保存期間の保証を有効化して、UNDO保存期間に長い期間を設定すると、トランザクションの実行に失敗することがあります。

一時UNDO機能

一時表を使うとデータ変更時のREDO生成量を削減できますが、完全になくすことはできません。

これは一時表のデータ変更時に、UNDOデータがUNDO表領域に出力され、この変更に対応するREDOデータが生成されるためです。

一時UNDO機能を使用すると、一時表に核の下データを変更したときのUNDOデータの出力先を一時表領域に変更できるため、REDO気の生成を完全に抑止することが出来ます。

一時UNDO機能を使用しない場合、使用する場合の動作の比較を以下の表に示します。

一時UNDOの使用 一時セグメントが作成される場所 一時セグメントを変更した結果生じるUNDOデータの格納先 UNDOセグメント変更によるREDOデータが生成されるかどうか
使用しない 一時表領域 UNDO表領域のUNDOセグメント 生成される
使用する 一時表領域 一時表領域のUNDOセグメント 生成されない

一時UNDOの利点は以下の通りです。

  • REDOの生成を抑止できるため、I/O量を削減できる
  • UNDO表領域へUNDOデータを生成しないため、他の変更が生成したUNDOデータより長期間保管できる可能性が高くなる
  • 読み取り専用でOPENされているデータベースで一時表を使用できる
    • 読み取り専用でOPENされているデータベースでは一般にREDOを生成する処理は実行できない

一時UNDOを有効化するには、TEMP_UNDO_ENABLED初期化パラメータをTRUEに設定します。

TEMP_UNDO_ENABLEDはセッションレベルまたはデータベースレベルで設定できます。

おわり

UNDOの管理編はここまで。

次はデータの移動について説明していきます。

Discussion