Oracleマスター Silver 12ｃ UNDOデータの管理

※用語はなるべく、Oracle® Databaseリファレンス　12c リリース1 (12.1) より抜粋しております。
【太字】：試験最重要ポイント
【青色】：試験問題を解くために必要な理解
【赤字】：最低限押さえておきたい知識
出題例：正解のみ掲載しています

###■公式チェックリストより出題範囲
UNDOデータの管理
・DMLおよびUNDOデータの生成について説明する
・UNDOデータを監視および管理する
・UNDOデータとREDOデータの違いについて説明する
・UNDO保存を設定する

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

要点
UNDOデータの管理については、まずはUNDOの仕組みや用語をしっかり確認した上で、UNDO関連の初期化パラメーターやコマンドを押さえておくとよいでしょう。

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

####UNDOデータ
　トランザクションによりデータが変更される場合、変更前に元のデータがコピーされます。変更済データのオリジナル・コピーは**UNDOデータ**と呼ばれます。
変更前の値は、コミット前のトランザクションのロールバック処理などに使用されます、さらにトランザクションのコミット後もフラッシュバック問合せなどに使用されます。

UNDOデータは次の操作を実現するために使用されます

　●**トランザクションのロールバック操作**
　　－データベースに作成された未コミットの変更を元に戻す場合。

　●**読取り一貫性**
　　－問合わせ開始時点でのデータと一貫性が保持された結果を戻す。問い合わせ実行中にほかのトランザクションによりデータが変更されたとしても問合せ開始時点でのデータを戻す。

　●**インスタンスリカバリ**
　　－トランザクションが終了する前に、ユーザーセッションが異常終了した場合やSHUTDOWN ABORTコマンドを実行した場合でも、ユーザーが最後にコミットした状態に戻す。

　●**フラッシュバック（トランザクション）問合せ、フラッシュバック表
　　－フラッシュバック問合せ：過去のある時点でのデータを意図的に問合せする。
　　－フラッシュバックトランザクション問合せ：行われたトランザクションを取り消すためのトランザクションを作成する。
　　－フラッシュバック表：表を特定の時点に戻す。
___
####UNDOデータとREDOデータの違い
UNDOデータ：**変更を元に戻すための情報**主に**ロールバック**目的で使用される。格納先はUNDOセグメント
REDOデータ：**変更を再実行するための情報。データ損失時のリカバリ（**ロールフォワード**）のために使用される。格納先はREDOログファイル
___
####DMLに対するUNDOデータ
　INSERT：データブロック内の空き領域に挿入されたレコードに割り当てられたROWID情報がUNDOデータになる。ロールバック処理時はROWID情報が取り消される
　UPDATE：UPDATE文のSET句で変更する前の値がUNDOデータになる
　DELETE：削除対象となるレコードがUNDOデータとなる

####UNDOセグメント
　DML文によってデータの変更が行われるとき、変更前の値をUNDOデータとしてUNDOセグメントに格納します。
UNDOセグメントを格納する表領域がUNDO表領域です。
デフォルトではSMAALFILE表領域ですが、BIGFILE表領域を作成することもできます。ただし、短時間に多くのトランザクションが同時に発生する大規模なOLTPではUNDO表領域はSMAALFILE表領域が望ましいでしょう。

●**1つのトランザクションには、1つのUNDOセグメントが割り当てられる。**
●**1つのUNDOセグメントは同時に複数のトランザクションを処理することができる。**
<font color="Blue">→1つのトランザクションが複数のUNDOセグメントを利用することはできません。</font>
●UNDOセグメントはエクステント単位で領域を割り当てる
●エクステントは**循環式に使用される。上書きされるまで、データは保持される。**
<font color="Blue">→エクステントは自動的に取得され、自動的に解放されます。</font>
●トランザクションが終了していない状態など、上書きできない場合は追加のエクステントがUNDOセグメントに割り当てられる。
●複数のUNDO表領域が存在する場合でも、インスタンスが一度に使用できるUNDO表領域は1つのみ

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###UNDOの管理
　UNDOセグメントはOracleサーバーが自動で作成します。（自動UNDO管理）
自動UNDO管理では、UNDO表領域を用意するだけで、UNDOセグメントの数、サイズおよびオンライン／オフラインの管理をすべて、Oracleデータベースが自動的に行ってくれます。

####UNDO表領域
構文：UNDO表領域を作成する場合

CREATE UNDO TABLESPACE 表領域名
　DATAFILE 'ファイル名' SIZE サイズ
　[AUTOEXTEND ON [NEXT 増加サイズ] ]
　[MAXSIZE UNLIMITED | 最大サイズ] ]

UNDO表領域には次の特徴があります。
　●ローカル管理表領域
　●自動セグメント領域管理
　●UNDOセグメント専用

自動UNDO管理では、UNDOデータが可能な限り最適に保存されるように自動チューニングされます。
例えば、自動拡張可能（AUTOEXTENDO ON)な表領域では**最も長く実行されるアクティブな問合せより少し長くなるようにUNDO保存期間をチューニングします**
<font color="SlateGray">UNDO表領域に通常の表を作成することはできません。</font>

####自動UNDO管理の設定
■自動UNDO管理に関する初期化パラメータ
UNDO_MANAGEMENT：デフォルトの「AUTO」の場合、自動UNDO管理となる。手動「MANUEL」にも設定できる。
UNDO_TABLESPACE：現在のOracleインスタンスでアクティブにするUNDO表領域を指定
UNDO_RETENTION ：UNDO保存期間の低しきい値（デフォルトは900秒）を指定

<FONT COLOR=red>1つのデータベースに複数のUNDO表領域を作成できますが、1つのOracleインスタンスで**アクティブにできるUNDO表領域は1つのみです。**</FONT>

自動チューニングの仕組み
　●自動拡張可能な表領域
　　－システムでアクティブな最長実行問合せよりも**若干長くなるように**自動的にチューニングされる**
<FONT COLOR=red>※若干長くなるように。ちょうどではない点に注意</FONT>

　●固定サイズの表領域
　　－表領域のサイズと現行のシステムの負荷に対して最適な保存期間を確保するように、自動的にチューニングされる。通常この最適な保存期間は、アクティブな**最長実行問合せのの期間より長くなる**
<FONT COLOR=red>最長実行問合せの期間より長くなる。自動拡張可能との違いを必ず覚えること。</FONT>

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

###UNDO保存
■UNDO保存の構成
　UNDO保存期間を設定するには**UNDO_RETENTION**初期化パラメータを使用します。デフォルトは900秒です。
注意：UNDO表領域に空き領域が十分にあるならば、UNDO保存期間は保証されますが、追加のエクステントを割り当てるだけの十分な領域がない場合は、UNDOデータが上書きされる可能性があります。
上書きされるUNDOとは期限切れでないUNDO、または期限切れのUNDOのことであり、アクティブなUNDOが上書きされることはありません。

<font color="Blue">UNDOの状態変化について理解しておくこと。</font>
・**アクティブなUNDO**
未コミットのトランザクションによるUNDO。これは決して上書きされることはない。
・**期限切れでないUNDO**
コミットされたトランザクションによるUNDOのうち、UNDO_RETENTIONパラメーターで設定した保存期間内のUNDOのこと。UNDO保存保証が設定されていない場合、上書きされる可能性がある
・期限切れのUNDO
コミットされたトランザクションによるUNDOのうち、保存期間が過ぎたUNDOのこと。これは上書き可能
___
■UNDO保存の保証
フラッシュバック操作を実行可能にするためにUNDO保存期間を手動で設定する必要があります。

構文：ALTER TABLESPACE 表領域名 RETENTION GUARANTEE；

UNDO保存期間中の上書きを防止するために、上書きしようしたトランザクションを一時停止させることができます。
取り消す場合は**NOGUARANTEE**句を指定します。
【理解】NOGUARANTEEを指定した場合は、トランザクションを停止しないためUNDOデータが上書きされる可能性があることに注意

■UNDOデータに関するエラー
　●ORA-01555：スナップショットが古すぎます。
　　これはUNDOデータを参照した際に、必要としていたUNDOデータが上書きされているために発生します。

スナップショットが古すぎますエラーを回避するための方法
●UNDO保存期間の延長：Oracle Flashback操作の予想最長時間と<font color="Blue">同じ長さ</font>にする。
●UNDO表領域のサイズの拡大：推奨は固定サイズ。
→自動拡張の場合は、UNDO保存期間が常にアクティブな最長実行問合せよりわずかに長くなるように自動チューニングされますが、これはフラッシュバック操作には不十分な場合があるためです。
●UNDO保存の保証を設定：UNDO_RETENTION初期化パラメータを設定する。

■ORA-30036：xxxx（UNDO 表領域'xxxx' 内）でセグメントを拡張できません。
　UNDO表領域のサイズが十分でない場合に、エクステントを拡張しようとして、UNDO表領域の空き領域が不足している場合に発生します。

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

####一時UNDO
　一時表に対するDML操作は、直接REDOエントリが生成されません。**データに関するREDOは生成しませんが、操作に関するREDOは生成されます。**
→これは一時UNDOを使用しない場合です。
ただし、トランザクションのロールバックなどのために一時表（および索引）に対するUNDOは生成されます。

12ｃ以降では、一時表のトランザクションに生成されるUNDOを、**UNDO表領域ではなく、一時表領域内に生成**するようになりました。
一時UNDOを使用することで、トランザクションに関するREDOが完全になくなり操作のREDO記録を不要とし、**REDO生成量を減らす**ことができます。

利点
　●現実的なUNDO保存期間要件を設定可能
　　－UNDO表領域に格納されるUNDOの量が削減されるため、UNDOレコードに対する、より現実的なUNDO保存期間要件を設定できる。
　●パフォーマンスの向上
　　－REDOログに書き込まれるデータが減るためパフォーマンスが向上する
　●フィジカルスタンバイデータベースで使用可能
　　－Oracle Active Data Guardオプションが指定されたフィジカルスタンバイデータベースでの**一時表**におけるDML操作が可能になります。

■一時UNDOの有効化
　●セッションに対して一時UNDOを有効化
　　ALTER SESSION SET <FONT COLOR=red>TEMP_UNDO_ENABLED = TRUE；</FONT>
　●システムに対して一時UNDOを有効化
　　ALTER SYSTEM SET <FONT COLOR=red>TEMP_UNDO_ENABLED ＝FALSE；</FONT>

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###UNDOアドバイザ
読取り一貫性を保証するために、UNDO表領域の容量を見積もるのに役立ちます。

　UNDOアドバイザを使用して確認できる内容は次のとおりです。
　　●UNDOデータの保存に必要な表領域サイズ
　　●拡張可能なUNDO表領域の最大サイズ
　　●現在のUNDO表領域にて可能な保持期間

■固定サイズへのUNDO表領域の変更
　次の理由でUNDO表領域を自動拡張可能ではなく、固定サイズにする場合があります。
**　●フラッシュバック操作をサポートするため**
　●表領域が大きくなりすぎるのを防止するため

※ただし、次のエラーが発生しやすくなるため、適切なサイズを指定する必要があります。
　●読取り一貫性エラー
　●進行中のDMLに対して、十分な領域が割り当てられない

UNDO表領域の自動拡張が有効な場合、最長の問合せ時にUNDO_RETENTION初期化パラメータが自動調整されます。
自動調整されたパラメータによる保存期間を満たすために必要なUNDO表領域サイズを計算します。

###出題例

**出題例**：UNDOデータは次のうちどれを実現するために必要ですか？
→ロールバック、読取り一貫性、フラッシュバック操作、インスタンスリカバリ

**出題例**：UNDOセグメントについて正しい説明を選択しなさい。
→エクステントは循環式に使用される。
→現在利用中のUNDOエクステント上書きされるまで、データは保持される。

**出題例**：UNDOセグメントの割当てについて正しい説明を選択しなさい。
→1つのトランザクションには、1つのUNDOセグメントが割り当てられる。
→1つのUNDOセグメントは同時に複数のトランザクションを処理することができる。

**出題例**：UNDOの保存期間を保証したい。上書きされないようにしたいと考えています。どのような操作を実行しますか。
→UNDO_RETENTION初期化パラメーターに保存期間を設定し、ALTER TABLE UNDO表領域名 RETENTION_GUARANTEE句で有効化する。

**出題例**：トランザクションが完了しているかどうかに関係なく、過去30分間の読取り一貫性を保証したい。ただし、トランザクションをエラーにしないこと。
→UNDO_RETENTIONパラメータを1800に設定する
→RETENTION NOGUARANTEEを設定する

**出題例**：「ORA-01555　スナップショットが古すぎます」というエラーが発生しました。考えられる原因を選択してください。
→UNDO表領域のサイズが不足している。
→UNDO保存保証期間の設定が短い。

**出題例**：一時UNDOを有効化するための構文を選択してください。
→●セッションに対して一時UNDOを有効化
　　ALTER SESSION SET <FONT COLOR=red>TEMP_UNDO_ENABLED = TRUE；</FONT>
→●システムに対して一時UNDOを有効化
　　ALTER SYSTEM SET <FONT COLOR=red>TEMP_UNDO_ENABLED = FALSE；</FONT>

**出題例**：一時UNDOの利点を選択してください。
→UNDOログ、REDOログの生成量を全体的に削減することが出来る。