検索
連載

UNDO管理でOracleのデータを守るORACLE MASTER Silver DBA講座(17)

ORACLE MASTER資格の中級に位置付けられ、取得すればOracle技術者としてグローバルに認定される「ORACLE MASTER Silver Oracle Database 10g」。例題を利用してポイントを押さえ、確実な合格を目指そう!

PC用表示 関連情報
Share
Tweet
LINE
Hatena

 前回「Oracle共有サーバ接続を利用する」で、共有サーバ構成と共有サーバ接続の特徴について紹介しました。今回は、UNDO管理について学びましょう。

UNDO管理

ポイント

 UNDOデータの管理に関するUNDO表領域、UNDOセグメントの構成と各種初期化パラメータが対象です。また、UNDOアドバイザによってどのようなアドバイスを取得することができるかという情報も重要です。

UNDOデータ

 UNDOデータとは変更前のデータのコピーであり、以下の操作のために保持されるものです。

  • 読み取り一貫性問い合わせ

他トランザクションがデータを変更中の場合、UNDOデータを使用することで、未確定データを見せないようにします。

  • ロールバック

ROLLBACKコマンドにてトランザクションを取り消すと、UNDOデータを使用して元のデータに戻します。

  • トランザクションリカバリ(インスタンス障害時のリカバリも含む)

トランザクションに障害が発生したり、インスタンス障害時のリカバリが行われたりすると、コミットしていない処理は、UNDOデータを使用してロールバックされます。

  • フラッシュバック問い合わせ、フラッシュバックテーブル

フラッシュバック問い合わせでは、現在のテーブルとUNDOデータがマージされ、過去の一時点の一貫したデータが戻されます。フラッシュバックテーブルの場合も、UNDOデータを使用した一貫データが現在のテーブルに戻され、過去の一時点にリカバリすることができます。

 データを変更するトランザクションではUNDOデータが生成され、トランザクションが完了するまでOracleサーバによって維持されます。自動UNDO管理においては、UNDOデータはUNDOセグメントに格納され、UNDOセグメントはUNDO表領域に格納されます。

 UNDOセグメントは、UNDO表領域が作成されると自動的に作成されます。UNDO表領域がインスタンスに設定されると、必要な数だけ自動的にオンラインとなり、使用可能になります。

図1 UNDO表領域とUNDOセグメント
図1 UNDO表領域とUNDOセグメント

 各トランザクションには、1つのUNDOセグメントが割り当てられ、トランザクションが完了するまでは同じUNDOセグメントを使用します。1つのUNDOセグメントは、複数のトランザクションを処理することができますが、1つのUNDOブロックは1つのトランザクションのために使用されます。

 UNDOセグメント内のエクステントは、循環して使用されます。最後のエクステントに到達すると、最初のエクステントが使用されていなければそれが上書きされ、使用されていれば新しいエクステントが獲得されます。このような循環処理のため、UNDOセグメントは最低でも2つ以上のエクステントで構成されます。

自動UNDO管理の構成

 UNDO表領域の作成には2つの方法があります。Enterprise Managerでは、表領域タイプを「UNDO」として作成します。CREATE TABLESPACE文では、次のようにUNDOキーワードを使用して表領域を作成します。

SQL> CREATE UNDO TABLESPACE undo01
  2  DATAFILE '/.../undo01.dbf' SIZE 100M;

 UNDO表領域を使用する際は、UNDOデータの管理を自動にし、UNDO表領域をインスタンスにセットするために、次の初期化パラメータを調整します。

UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE=undo01

 さらに、UNDO保存期間(UNDO_RETENTION)を調整します。UNDOデータには、次の3つの状態があります。

  • コミットされていないUNDO情報

トランザクションが継続している状態です。トランザクションが終了するまでは上書きされることはありません。

  • コミットされたUNDO情報

UNDO保存期間中の状態です。コミット後は上書き可能になるのが通常ですが、UNDO保存期間を使用することで、保存期間中は、UNDO表領域が空き不足にならない限り上書きされずに保持されます。

  • 期限切れのUNDO情報

UNDO保存期間が経過した状態です。UNDOセグメント内で上書き可能な状態になっていますので、ほかのトランザクションのために使用されることがあります。自動拡張が無効なUNDO表領域であれば、別のUNDOセグメントのためにエクステントを解放できます。

 Oracle Database 10gでは、UNDO保存期間は、最長の問い合わせ時間に合わせて自動的に期間が増加されるようになっています。しかしフラッシュバック問い合わせを使用する環境では、手動で調整しておく必要があります。

 またUNDO保存期間中でも、UNDO表領域の領域不足が発生すれば上書きされてしまう可能性があります。トランザクションをエラーにしてでもUNDO保存期間中のデータを維持する必要がある場合は、UNDO保存の保証を検討します。

SQL> ALTER TABLESPACE undo01 RETENTION GUARANTEE;
SQL> SELECT tablespace_name, contents, retention
  2  FROM   dba_tablespaces;
TABLESPACE_NAME                CONTENTS  RETENTION
------------------------------ --------- -----------
SYSTEM                         PERMANENT NOT APPLY
UNDOTBS1                       UNDO      NOGUARANTEE
SYSAUX                         PERMANENT NOT APPLY
TEMP                           TEMPORARY NOT APPLY
USERS                          PERMANENT NOT APPLY
EXAMPLE                        PERMANENT NOT APPLY
UNDO01                         UNDO      GUARANTEE

 CONTENTS列がUNDOではない表領域では、RETENTION GUARANTEE句は使用できないので注意しましょう。また、十分なUNDO表領域サイズがない場合、上書きしようとしているトランザクションがエラーになるため、UNDOアドバイザなどを使用して十分なUNDO表領域サイズを用意しておくことも重要といえます。

問題

問題1

データに対する問い合わせ中に次のエラーが発生しました。

ORA-01555: スナップショットが古すぎます。

このエラーを回避するために調整できる設定を3つ選択しなさい。

a.SYSTEM表領域のサイズ
b.UNDO保存期間
c.UNDO表領域のサイズ
d.UNDO保存の保証
e.UNDO表領域の配置場所

正解:b、c、d

解説

 前回、宿題とした問題です。

 ORA-01555エラーは、UNDOデータに問題がある場合のエラーです。UNDOデータを使用した読み取り一貫性が必要な処理(ほかのトランザクションで更新中の表に対する問い合わせなど)において、見るべきUNDOデータが上書きされていたりすると発生します。

 このエラーを回避するには、必要なUNDOデータが上書きされることのないようにする必要があります。

  • UNDO保存期間正解b

トランザクション完了後、UNDOデータを保持しておきたい期間を設定します。UNDO_RETENTION初期化パラメータで設定できます。

  • UNDO表領域サイズ正解c

UNDO保存期間中でも、表領域の空き領域(期限切れを含む)が不足しているとUNDOセグメントのUNDOエクステントは上書きされてしまいます。そのため、UNDO保存期間を維持できるだけの表領域を準備します。

  • UNDO保存の保証正解d

UNDO保存期間中のエクステントの上書きを禁止することができます。上書きが必要になると該当するトランザクションをエラーにします。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢a:SYSTEM表領域にはSYSTEMロールバックセグメントが格納されていますが、このロールバックセグメントはユーザーのトランザクションには使用されません。そのため、ORA-01555エラーの回避にSYSTEM表領域のサイズは関係ないといえます。

選択肢e:UNDO表領域に属するデータファイルは、できるだけ高速のデバイスに配置されている方がパフォーマンスは良いですが、たとえI/O速度が遅くてもORA-01555エラーには関係がありません。

問題2

次の資料を確認してください。

(クリックで拡大します)
(クリックで拡大します)

最もUNDOデータの生成量が多い文を選択しなさい。

a.SELECT * FROM emp;
b.DELETE FROM emp WHERE empno=7934;
c.UPDATE emp SET comm=1000 WHERE empno=7844;
d.INSERT INTO emp VALUES
(7000,'MILLER','SALESMAN',7900,SYSDATE,5000,NULL,20);

正解:b

解説

 UNDOデータは、変更前のデータです。データを変更するDML、定義を変更するDDL(ディクショナリ更新のためのUNDOデータ)で生成されます。

 DMLに該当する文の中で、UNDOデータとして保持されるのは次の情報です。

  • INSERT文

INSERTされるROWID情報(INSERT INTO ... SELECT文の場合は、SELECT結果行数だけが該当する)。

  • UPDATE文

変更される前の列値(変更される列数に依存)。

  • DELETE文

削除されるレコード全体の情報(列値を含む)。

 UPDATE文ですべての列を変更しているのであれば、最も多くの情報を残す可能性があるでしょう。しかし今回の選択肢の中では、DELETE文が最も多くのUNDOデータを生成するといえます(正解b)。

 SELECT文は読み取り一貫性のためにUNDOデータを使用しますが、UNDOデータ自体を生成することはありません。

問題3

初期化パラメータUNDO_RETENTIONの値を「1800」に設定している場合のUNDOデータに関する説明として正しいものを選択しなさい。

a.トランザクション開始から1800秒は保持される
b.ほかのトランザクションからの参照が行われてから1800秒は保持される
c.UNDO表領域の空き領域が十分にある場合に、COMMIT後1800秒は保持される
d.COMMIT後も必ず、1800秒間保持される

正解:c

解説

 UNDO_RETENTION初期化パラメータは、自動UNDO管理において、コミット完了後のUNDO保存期間を設定するパラメータです(正解c)。指定した期間中、UNDOデータは、UNDO表領域の領域不足にならない限り上書きされずに保持されます。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢a:UNDO_RETENTION初期化パラメータの値は、トランザクション開始後からではなく、コミット完了後から計算されます。

選択肢b:UNDO_RETENTION初期化パラメータは、ほかのセッションから参照された場合も保持データを提供することを目的としますが、参照開始から値が計算されるわけではありません。

選択肢d:データの保持を「必ず」保証するためには、UNDO表領域に対してUNDO保存の保証(RETENTION GARANTEE属性)を設定する必要があります。UNDO_RETENTION初期化パラメータのみの設定の場合は、「できる限り上書きされないようにする」という性質を提供します。

宿題

 次回は、「ロックの競合の監視と解決」を確認します。次の宿題を解いておいてください。

問題

DMLが発行されたときに表に対して取得されるロックを2つ選択しなさい。

a.更新される行の共有行ロック
b.更新される行の排他行ロック
c.更新される表の共有表ロック
d.更新される表の排他表ロック

IT資格試験の模擬問題をWebベースで学習できる@IT自分戦略研究所の新サービス「@IT資格攻略」では、「Silver DBA(Oracle10g)」をはじめOracle関連の資格をテーマとして取り上げています。「無料お試し版」もありますので、記事と併せてご覧ください。



Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る