ヘッダーをスキップ
Oracle® Database管理者ガイド
11gリリース2 (11.2)
B56301-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

16 UNDOの管理

リリース11g からは、デフォルトのインストールで、Oracle DatabaseによってUNDOが自動的に管理されます。通常、DBAによる操作は不要です。ただし、インストールでOracle Flashback操作を使用する場合は、それらの操作が正常に終了するように、UNDO管理タスクをいくつか実行することが必要な場合があります。

この章の内容は、次のとおりです。


関連項目:

Oracle Databaseによってデータファイルが作成および管理されるUNDO表領域の作成方法は、第17章「Oracle Managed Filesの使用」を参照してください。

UNDOの概要

Oracle Databaseでは、データベースの変更をロールバックまたは取り消すために使用する情報を作成して管理します。これらの情報は、主にコミットされる前のトランザクションの処理レコードから構成されます。これらのレコードを総称してUNDOと呼びます。

UNDOレコードは次の処理に使用されます。

  • ROLLBACK文を発行したときのトランザクションのロールバック

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

  • 読込み一貫性の提供

  • Oracle Flashback Queryを使用した過去のある時点のデータの分析

  • Oracle Flashback機能を使用した論理的な破損のリカバリ

ROLLBACK文を発行すると、コミットされていないトランザクションによってデータベースに加えられた変更が、UNDOレコードを使用して取り消されます。データベース・リカバリ時は、REDOログからデータファイルに適用されたコミットされていない変更が、UNDOレコードを使用してすべて取り消されます。UNDOレコードは、あるユーザーがデータを変更しているときに同じデータに同時にアクセスしようとしている別のユーザーのために、そのデータの変更前のイメージを維持することによって読込み一貫性を提供します。

自動UNDO管理の概念

この項では、自動UNDO管理の概念について説明します。この項の内容は、次のとおりです。

自動UNDO管理の概要

Oracleには、ロールバック情報と領域を管理するための、自動UNDO管理と呼ばれる完全に自動化されたメカニズムが用意されています。自動UNDO管理では、データベースによってUNDOセグメントがUNDO表領域で管理されます。リリース11g からは、新しくインストールされたデータベースに対して自動UNDO管理がデフォルト・モードになります。Database Configuration Assistant(DBCA)を使用してデータベースを作成すると、UNDOTBS1という自動拡張可能なUNDO表領域が自動的に作成されます。

UNDO表領域は明示的に作成することもできます。UNDO表領域の作成方法については、「UNDO表領域の作成」を参照してください。

インスタンスが起動すると、データベースは最初に使用可能になったUNDO表領域を自動的に選択します。使用可能なUNDO表領域がない場合、インスタンスはUNDO表領域なしで起動され、UNDOレコードはSYSTEM表領域に格納されます。これは推奨される状態ではなく、アラート・ログ・ファイルには、システムがUNDO表領域のない状態で稼働していることを伝える警告メッセージが書き込まれます。

データベースに複数のUNDO表領域があるときは、必要に応じて、起動時に特定のUNDO表領域を使用するように指定することもできます。これには、次の例のように、UNDO_TABLESPACE初期化パラメータを設定します。

UNDO_TABLESPACE = undotbs_01

初期化パラメータで指定された表領域が存在しない場合、STARTUPコマンドは失敗します。Oracle Real Application Clusters環境でUNDO_TABLESPACEパラメータを使用すると、インスタンスに特定のUNDO表領域を割り当てることができます。

データベースは手動UNDO管理モードでも稼働できます。このモードでは、UNDO領域がロールバック・セグメントを介して管理され、UNDO表領域は使用されません。


注意:

ロールバック・セグメントの領域管理は複雑です。データベースを自動UNDO管理モードのままにすることをお薦めします。

次に、UNDO管理用の初期化パラメータの概要を示します。

初期化パラメータ 説明
UNDO_MANAGEMENT AUTOまたはNULLの場合は、自動UNDO管理を使用可能にします。MANUALの場合は、手動UNDO管理モードを設定します。デフォルトはAUTOです。
UNDO_TABLESPACE 自動UNDO管理モードの場合のみ有効です(オプション)。UNDO表領域の名前を指定します。データベースに複数のUNDO表領域があり、データベース・インスタンスで特定のUNDO表領域を使用するように指定する場合にのみ使用します。

自動UNDO管理が使用可能な場合は、初期化パラメータ・ファイルに手動UNDO管理に関するパラメータが含まれていても、それらは無視されます。


注意:

Oracle Databaseの以前のリリースでは、手動UNDO管理モードがデフォルトです。自動UNDO管理モードに変更するには、UNDO表領域を作成してからUNDO_MANAGEMENT初期化パラメータをAUTOに変更する必要があります。Oracle Databaseがリリース9i以上で、自動UNDO管理に変更する場合、手順については『Oracle Databaseアップグレード・ガイド』を参照してください。

UNDO_MANAGEMENT初期化パラメータがNULLの場合、リリース11g 以上では自動UNDO管理モードにデフォルト設定されますが、以前のリリースでは手動UNDO管理モードにデフォルト設定されます。したがって、以前のリリースをリリース11gにアップグレードする場合は注意が必要です。UNDO表領域のサイズの設定方法に関する情報など、自動UNDO管理モードに移行するための適切な方法については、『Oracle Databaseアップグレード・ガイド』を参照してください。



関連項目:

UNDO管理で使用する初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。

UNDOの保存期間

トランザクションがコミットされると、ロールバックまたはトランザクション・リカバリの実行にUNDOデータは不要になります。しかし、長時間実行の問合せ中にデータ・ブロックの変更前のイメージを生成する場合は、読込み一貫性を保証するために古いロールバック情報が必要になることがあります。また、いくつかのOracle Flashback機能を正常に終了させるには、古いロールバック情報が必要になる場合があります。このため、古いロールバック情報をできるかぎり長い期間保存することをお薦めします。

自動UNDO管理が使用可能な場合は、常に現在のUNDO保存期間が存在します。これは、Oracle Databaseが古いロールバック情報を上書きするまでの最小保存期間です。現在のUNDO保存期間よりも古い(コミット済の)UNDO情報は期限切れと呼ばれ、この領域は新しいトランザクションによって上書きできるようになります。現在のUNDO保存期間内の古いUNDO情報は期限切れでないUNDO情報と呼ばれ、読取り一貫性およびOracle Flashback操作のために保存されます。

Oracle Databaseでは、UNDO表領域サイズとシステム・アクティビティに基づいて、UNDO保存期間を自動的にチューニングします。必要に応じてUNDO_RETENTION初期化パラメータを設定することで、最小UNDO保存期間(秒単位)を指定できます。次に、UNDO保存期間にこのパラメータが具体的にどのような影響を与えるかを説明します。

  • 固定サイズのUNDO表領域の場合、UNDO_RETENTIONパラメータは無視されます。データベースでは、システム・アクティビティとUNDO表領域サイズに基づいて、常に最適な保存期間を確保するようにUNDO保存期間をチューニングします。詳細は、「UNDOの保存期間の自動チューニング」を参照してください。

  • AUTOEXTENDオプションが有効なUNDO表領域の場合、データベースでは、UNDO_RETENTIONで指定された最小保存期間を維持しようとします。空き領域が少なくなると、期限切れでないロールバック情報を上書きするかわりに、表領域が自動的に拡張されます。自動拡張可能なUNDO表領域に対してMAXSIZE句が指定されている場合は、最大サイズに到達すると、データベースは期限切れでないロールバック情報の上書きを開始する場合があります。DBCAで自動的に作成されたUNDOTBS1表領域は、自動的に拡張します。

UNDOの保存期間の自動チューニング

Oracle Databaseでは、UNDO表領域の構成方法に基づいて、UNDO保存期間を自動的にチューニングします。

  • UNDO表領域がAUTOEXTENDオプションで構成されている場合、データベースでは、UNDOの保存期間を、システムでアクティブな最長実行問合せより若干長くなるように動的にチューニングします。ただし、この保存期間は、Oracle Flashback操作に対応するには不十分な場合があります。Oracle Flashback操作で「スナップショットが古すぎます」エラーが発生する場合は、これらの操作をサポートするのに十分なUNDOデータが保存されるように、ユーザーが介入する必要があることを示しています。Oracle Flashback機能にさらに対応するには、UNDO_RETENTIONパラメータを予想される最長のOracle Flashback操作時間と同じ値に設定したり、UNDO表領域を固定サイズに変更することもできます。

  • UNDO表領域が固定サイズの場合、データベースでは、表領域のサイズと現行のシステムの負荷に対して最適な保存期間を確保するように、UNDO保存期間を動的にチューニングします。通常、この最適な保存期間は、アクティブな最長実行問合せの期間よりもかなり長くなります。

    UNDO表領域を固定サイズに変更する場合は、十分な大きさの表領域サイズを選択する必要があります。小さすぎるUNDO表領域サイズを選択すると、次の2つのエラーが発生する可能性があります。

    • DMLが失敗する可能性。これは、新しいトランザクションに対するUNDOを格納するための十分な領域がないためです。

    • 「スナップショットが古すぎます」というエラーが発生し、長時間実行問合せが失敗します。これは、UNDOデータが不足しているために読取り一貫性を維持できないことを意味します

    詳細は、「固定サイズのUNDO表領域のサイズ変更」を参照してください。


注意:

UNDO保存の自動チューニングは、LOBに対してサポートされていません。これは、LOBのロールバック情報がUNDO表領域ではなく、セグメント自体に格納されるためです。LOBの場合、データベースでは、UNDO_RETENTIONで指定された最小保存期間を維持しようとします。ただし、空き領域が少なくなると、期限切れでないLOBのロールバック情報が上書きされる場合があります。

保存期間の保証

長時間実行される問合せやOracle Flashback操作を正常に行うために、保存期間の保証を有効化できます。保存期間の保証を有効にすると、指定したUNDOの最小保存期間が保証され、UNDO表領域の領域不足によってトランザクションが失敗した場合でも、期限切れでないUNDOデータは上書きされません。保存期間の保証を有効にしないと、領域が十分でない場合、期限切れでないUNDOが上書きされる場合があるため、システムのUNDO保存期間が短くなります。このオプションはデフォルトでは無効です。


警告:

保存期間の保証を有効にすると、複数のDML操作が失敗する可能性があります。この機能は注意して使用してください。


保存期間の保証を有効にするには、CREATE DATABASE文またはCREATE UNDO TABLESPACE文を使用してUNDO表領域を作成するときに、そのUNDO表領域に対してRETENTION GUARANTEE句を指定します。または、後でこの句をALTER TABLESPACE文で指定することもできます。保存期間の保証を無効にするには、RETENTION NOGUARANTEE句を使用します。

DBA_TABLESPACESビューを使用して、UNDO表領域の保存期間の保証の設定を確認できます。RETENTION列には、GUARANTEENOGUARANTEEまたはNOT APPLY(NOT APPLYはUNDO表領域以外の表領域で使用)の値が表示されます。

UNDOの保存期間のチューニングとアラートしきい値

固定サイズのUNDO表領域を使用する場合、データベースでは、データベース統計とUNDO表領域のサイズに基づいて最適な保存期間を計算します。最適なUNDO管理を実現するために、データベースでは、UNDOの保存期間を、表領域サイズの100%ではなく、85%を基にチューニングするか、または使用済領域に対する警告アラートしきい値の率でチューニングするか、いずれか低い方に基づいてチューニングします。(警告アラートしきい値のデフォルトは85%ですが、変更が可能です。)したがって、UNDO表領域の警告アラートしきい値を85%未満に設定すると、チューニングされるUNDO保存期間の長さが短くなることがあります。表領域のアラートしきい値の詳細は、「表領域のアラートの管理」を参照してください。

チューニング済UNDO保存期間の追跡

現行の保存期間を判別するには、V$UNDOSTATビューのTUNED_UNDORETENTION列を問い合せます。このビューには、過去4日間における10分単位の統計収集間隔ごとに1行が表示されます。(4日以前のデータは、DBA_HIST_UNDOSTATビューに表示されます。)TUNED_UNDORETENTIONは秒数で表示されます。

select to_char(begin_time, 'DD-MON-RR HH24:MI') begin_time,
to_char(end_time, 'DD-MON-RR HH24:MI') end_time, tuned_undoretention
from v$undostat order by end_time;

BEGIN_TIME      END_TIME        TUNED_UNDORETENTION
--------------- --------------- -------------------
04-FEB-05 00:01 04-FEB-05 00:11               12100
      ...                                          
07-FEB-05 23:21 07-FEB-05 23:31               86700
07-FEB-05 23:31 07-FEB-05 23:41               86700
07-FEB-05 23:41 07-FEB-05 23:51               86700
07-FEB-05 23:51 07-FEB-05 23:52               86700

576 rows selected.

V$UNDOSTATの詳細は、『Oracle Databaseリファレンス』を参照してください。

最小UNDO保存期間の設定

最小UNDO保存期間(秒単位)を指定するには、UNDO_RETENTION初期化パラメータを設定します。「UNDOの保存期間」で説明されているように、現行のUNDO保存期間はUNDO_RETENTIONよりも大きくなるように、または保存期間の保証が有効な場合を除き、空き領域が少ない場合はUNDO_RETENTIONよりも少なくなるように自動的にチューニングされます。

最小UNDO保存期間の設定方法

  • 次のいずれかを実行します。

    • 初期化パラメータ・ファイルでUNDO_RETENTIONを設定します。

      UNDO_RETENTION = 1800
      
    • UNDO_RETENTIONは、ALTER SYSTEM文を使用していつでも変更できます。

      ALTER SYSTEM SET UNDO_RETENTION = 2400;
      

UNDO_RETENTIONパラメータの変更は即時に反映されますが、その効果は、現行のUNDO表領域に十分な領域がある場合のみ表れます。

固定サイズのUNDO表領域のサイズ変更

UNDO保存期間の動的チューニングは、通常、固定サイズのUNDO表領域に有効です。固定サイズの表領域を使用する場合は、UNDOアドバイザを使用すると、必要な容量を見積るのに役立ちます。UNDOアドバイザには、Enterprise ManagerまたはDBMS_ADVISOR PL/SQLパッケージを介してアクセスできます。このアドバイザには、Enterprise Managerを介してアクセスすることをお薦めします。Enterprise Managerを介してUNDOアドバイザを使用する方法の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。

UNDOアドバイザは、自動ワークロード・リポジトリ(AWR)に収集されたデータに基づいて分析します。したがって、AWRで適切なワークロード統計を使用可能にし、UNDOアドバイザが正確な推奨事項を作成できるようにすることが重要です。新規作成したデータベースでは、適切な統計がすぐに使用できない場合があります。このような場合は、少なくとも1つのワークロード・サイクルが完了するまで、デフォルトの自動拡張可能なUNDO表領域を引き続き使用してください。

AWR統計の収集間隔と保存期間の調整は、アドバイザが作成する推奨事項の精度とタイプに影響します。詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

UNDOアドバイザを使用する場合は、最初に次の2つの値を見積ります。

  • 最長実行問合せの予想される長さ

    データベースによるワークロード・サイクルが完了すると、「自動UNDO管理」ページの「システム・アクティビティ」サブページにある「最長実行問合せ」フィールドを表示できます。

  • Oracle Flashback操作に必要な最長間隔

    たとえば、過去に最大48時間のOracle Flashback問合せを実行したと予想される場合、Oracle Flashback要件は48時間です。

次に、これら2つの値のうち最大値を選択し、その値をUNDOアドバイザへの入力として使用します。

UNDOアドバイザの実行によって、UNDO表領域のサイズは変更されません。アドバイザは推奨事項を単に返します。表領域のデータファイルを固定サイズに変更するには、ALTER DATABASE文を使用する必要があります。

次の例では、UNDO表領域にundotbs.dbfという自動拡張可能なデータファイルあると仮定します。この例では、表領域を300MBの固定サイズに変更します。

ALTER DATABASE DATAFILE '/oracle/dbs/undotbs.dbf' RESIZE 300M;
ALTER DATABASE DATAFILE '/oracle/dbs/undotbs.dbf' AUTOEXTEND OFF;

注意:

UNDO表領域を固定サイズにする場合は、まずデータベース作成後に十分な時間をかけて完全なワークロードを実行することをお薦めします。これにより、UNDO表領域がワークロードを処理するための必要最小限のサイズになります。その後、必要に応じてUNDOアドバイザを使用して、長時間実行される問合せやOracle Flashback操作に対応するために、UNDO表領域をどの程度拡大するかを決定します。


関連項目:

UNDOアドバイザを使用してUNDO表領域の最小サイズを計算する手順は、『Oracle Database 2日でデータベース管理者』を参照してください。

UNDOアドバイザのPL/SQLインタフェース

UNDOアドバイザをアクティブにするには、アドバイザ・フレームワークを使用してUNDOアドバイザ・タスクを作成します。次の例では、UNDO表領域を評価するためのUNDOアドバイザ・タスクを作成します。アドバイザの名前は'Undo Advisor'です。分析は自動ワークロード・リポジトリのスナップショットに基づいて実行され、このスナップショットは、START_SNAPSHOTパラメータとEND_SNAPSHOTパラメータを設定して指定する必要があります。次の例では、START_SNAPSHOTが1で、END_SNAPSHOTは2です。

DECLARE
   tid    NUMBER;
   tname  VARCHAR2(30);
   oid    NUMBER;
BEGIN
   DBMS_ADVISOR.CREATE_TASK('Undo Advisor', tid, tname, 'Undo Advisor Task');
   DBMS_ADVISOR.CREATE_OBJECT(tname, 'UNDO_TBS', null, null, null, 'null', oid);
   DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'TARGET_OBJECTS', oid);
   DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'START_SNAPSHOT', 1);
   DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'END_SNAPSHOT', 2);
   DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'INSTANCE', 1);
   DBMS_ADVISOR.execute_task(tname);
END;
/

アドバイザ・タスクを作成した後は、Enterprise Managerの自動データベース診断モニターに出力および推奨事項を表示できます。この情報は、DBA_ADVISOR_*データ・ディクショナリ・ビュー(DBA_ADVISOR_TASKSDBA_ADVISOR_OBJECTSDBA_ADVISOR_FINDINGSDBA_ADVISOR_RECOMMENDATIONSなど)にも表示されます。


関連項目:

  • 様々なアドバイザにアドバイザ・タスクを作成する例は、「セグメント・アドバイザの使用」を参照してください。

  • DBA_ADVISOR_*データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。


UNDO表領域の管理

この項では、UNDO表領域を管理する際に必要な手順について説明します。この項の内容は、次のとおりです。

UNDO表領域の作成

Oracle Databaseリリース11g の新規インストールでは、Database Configuration Assistant(DBCA)によってUNDO表領域が自動的に作成されますが、UNDO表領域を手動で作成することが必要な場合があります。

UNDO表領域の作成には2つの方法があります。1つは、CREATE DATABASE文の発行時にUNDO表領域を作成する方法です。これは、データベースを新規作成中にインスタンスが自動UNDO管理モードで起動したとき(UNDO_MANAGEMENT = AUTO)に実行されます。もう1つは、既存のデータベースで使用する方法です。この場合はCREATE UNDO TABLESPACE文を使用します。

UNDO表領域にはデータベース・オブジェクトは作成できません。システム管理のUNDOデータ用に確保されています。

Oracle Databaseでは、単一ファイルUNDO表領域を作成できます。単一ファイル(bigfile)表領域については、「bigfile表領域」を参照してください。

CREATE DATABASEを使用したUNDO表領域の作成

CREATE DATABASE文でUNDO TABLESPACE句を使用すると、特定のUNDO表領域を作成できます。

次の文は、CREATE DATABASE文でのUNDO TABLESPACE句の使用例を示しています。ここでは、UNDO表領域にundotbs_01という名前を付け、/u01/oracle/rbdb1/undo0101.dbfという1つのデータファイルを割り当てています。

CREATE DATABASE rbdb1
     CONTROLFILE REUSE
     .
     .
     .
     UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';

CREATE DATABASEの実行中にUNDO表領域を正常に作成できない場合は、CREATE DATABASE操作全体が失敗します。データベース・ファイルをクリーン・アップし、エラーを訂正して、再度CREATE DATABASE操作を実行する必要があります。

また、データベース作成時に、CREATE DATABASE文を使用して単一ファイルUNDO表領域を作成できます。この動作については、「データベース作成時のbigfile表領域のサポート」を参照してください。


関連項目:

CREATE DATABASE文を使用してUNDO表領域を作成する構文については、『Oracle Database SQL言語リファレンス』を参照してください。

CREATE UNDO TABLESPACE文の使用

CREATE UNDO TABLESPACE文はCREATE TABLESPACE文とほぼ同じですが、UNDOキーワードを指定します。UNDO表領域の属性のほとんどはデータベースが決定しますが、データベース管理者はDATAFILE句を指定できます。

この例では、AUTOEXTENDオプションを使用してundotbs_02 UNDO表領域を作成しています。

CREATE UNDO TABLESPACE undotbs_02
     DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;

複数のUNDO表領域を作成できますが、UNDO表領域は1つのみアクティブにできます。


関連項目:

CREATE UNDO TABLESPACE文を使用してUNDO表領域を作成する構文については、『Oracle Database SQL言語リファレンス』を参照してください。

UNDO表領域の変更

UNDO表領域を変更するには、ALTER TABLESPACE文を使用します。ただし、UNDO表領域のほとんどはシステムが管理しているため、考慮が必要になるのは次の操作のみです。

  • データファイルの追加

  • データファイル名の変更

  • データファイルのオンライン化またはオフライン化

  • データファイルのオープン状態のバックアップの開始または終了

  • UNDOの保存期間の保証の有効化または無効化

DBAが変更可能な属性もこれらの属性のみです。

UNDO表領域が領域不足の場合、または領域不足の発生を防止する場合は、さらにファイルを追加したり、既存のデータファイルのサイズを変更できます。

次の例では、UNDO表領域undotbs_01にデータファイルを1つ追加しています。

ALTER TABLESPACE undotbs_01
     ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M 
         MAXSIZE UNLIMITED;

ALTER DATABASE...DATAFILE文を使用すると、データファイルのサイズを変更または拡張できます。


関連項目:


UNDO表領域の削除

UNDO表領域を削除するには、DROP TABLESPACE文を使用します。次の例では、UNDO表領域undotbs_01を削除しています。

DROP TABLESPACE undotbs_01;

UNDO表領域は、現在どのインスタンスでも使用されていない場合にのみ削除できます。UNDO表領域に処理中のトランザクションが含まれている場合(トランザクションが失敗してまだリカバリされていない場合など)、DROP TABLESPACE文は失敗します。しかし、DROP TABLESPACEは、UNDO表領域に期限切れでない(保存期間内である)ロールバック情報が含まれている場合でもUNDO表領域を削除するため、既存の問合せでロールバック情報を必要とする場合は、UNDO表領域を削除しないように注意する必要があります。

UNDO表領域に対するDROP TABLESPACEは、DROP TABLESPACE...INCLUDING CONTENTSと同じように動作します。つまり、UNDO表領域の内容はすべて削除されます。


関連項目:

DROP TABLESPACE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

UNDO表領域の切替え

あるUNDO表領域から別のUNDO表領域に切り替えることができます。UNDO_TABLESPACE初期化パラメータは動的パラメータであるため、ALTER SYSTEM SET文を使用して新しいUNDO表領域を割り当てることができます。

次の文は、新しいUNDO表領域に切り替えます。

ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_02;

undotbs_01が現行のUNDO表領域であるとすると、このコマンドが正常に実行された後、インスタンスはundotbs_01のかわりにundotbs_02をUNDO表領域として使用します。

切替え先の表領域が次のいずれかの条件を満たす場合はエラーがレポートされ、切替えは行われません。

  • 表領域が存在しない場合

  • 表領域がUNDO表領域ではない場合

  • 表領域が別のインスタンスによってすでに使用されている場合(Oracle RAC環境のみ)

切替え操作が実行されている間、データベースはオンラインであり、このコマンドの実行中でもユーザー・トランザクションを実行できます。切替え操作が正常に完了すると、切替え操作開始後に開始されたすべてのトランザクションが新しいUNDO表領域内のトランザクション表に割り当てられます。

切替え操作は、古いUNDO表領域内のトランザクションがコミットされるまで待機しません。古いUNDO表領域内に未処理のトランザクションがある場合、古いUNDO表領域はPENDING OFFLINEモード(状態)になります。このモードでは、既存のトランザクションは引き続き実行できますが、新しいユーザー・トランザクションのUNDOレコードをこのUNDO表領域に格納することはできません。

UNDO表領域は、切替え操作が正常に完了した後も、このPENDING OFFLINEモードのまま存在できます。PENDING OFFLINEUNDO表領域は、別のインスタンスが使用することも、削除することもできません。最終的に、すべてのアクティブなトランザクションがコミットされた後、UNDO表領域は自動的にPENDING OFFLINEモードからOFFLINEモードに移行します。それ以降は、他のインスタンスが(Oracle Real Application Clusters環境で)そのUNDO表領域を使用できます。

UNDO TABLESPACEのパラメータ値を「''」(2つの一重引用符)に設定した場合は、現行のUNDO表領域が次の使用可能なUNDO表領域に切り替えられます。使用可能なUNDO表領域がない場合もあるため、この文の使用には注意が必要です。

次の例では、現行のUNDO表領域の割当てを解除しています。

ALTER SYSTEM SET UNDO_TABLESPACE = '';

UNDO領域に対するユーザー割当ての確立

Oracle Database Resource Managerを使用すると、UNDO領域に対するユーザー割当てを確立できます。DBAは、データベース・リソース・マネージャのディレクティブUNDO_POOLを使用して、ユーザーのグループ(リソース・コンシューマ・グループ)が消費するUNDO表領域の量を制限できます。

UNDOプールは、コンシューマ・グループごとに指定できます。UNDOプールによって、コンシューマ・グループが生成できるUNDOの合計量が制御されます。コンシューマ・グループが生成するUNDOの合計量がそのUNDO制限を超えると、UNDOを生成している現行のUPDATEトランザクションが終了します。コンシューマ・グループの他のメンバーは、UNDO領域がプールから解放されるまで、新たに更新を実行できなくなります。

UNDO_POOLディレクティブが明示的に定義されていないときは、ユーザーは無制限にUNDO領域を使用できます。

UNDO表領域に対する領域のアラートしきい値の管理

Oracle Databaseでは、表領域に使用可能な領域が少なくなると事前にアラートが生成されるため、表領域のディスク領域の使用状況を管理するために役立ちます。UNDO表領域のアラートしきい値の設定方法は、「表領域のアラートの管理」を参照してください。

Oracle Databaseでは、UNDO領域の事前アラート以外に、「スナップショットが古すぎます」エラーが発生するような長時間実行される問合せがシステムにある場合にもアラートが生成されます。過剰にアラートが生成されるのを防ぐため、長時間実行される問合せのアラートは24時間以上の間隔をおいて発行されます。アラートが生成された場合は、Enterprise Managerの「UNDOアドバイザ」ページをチェックしてUNDO表領域に関する詳細情報を参照できます。

自動UNDO管理への移行

現在、ロールバック・セグメントを使用してUNDO領域を管理している場合は、データベースを自動UNDO管理に移行することをお薦めします。

手順については、『Oracle Databaseアップグレード・ガイド』を参照してください。

UNDO領域のデータ・ディクショナリ・ビュー

ここでは、自動UNDO管理モードにおいてUNDO領域に関する情報を表示する際に役立つビューについて説明し、いくつかの例を示します。ここで紹介したビュー以外にも、表領域やデータファイルの情報を表示するビューを使用して、情報を取得できます。これらのビューの詳細は、「データファイルのデータ・ディクショナリ・ビュー」を参照してください。

UNDO表領域に関する領域情報を取得するために、次の動的パフォーマンス・ビューが役立ちます。

ビュー 説明
V$UNDOSTAT UNDO領域の監視とチューニングのための統計情報が含まれます。このビューは、現行の作業負荷に必要なUNDO領域の量を見積る際に利用できます。また、データベースはこの情報を使用して、システム内のUNDOの使用方法をチューニングします。このビューの情報は、自動UNDO管理モードでのみ意味があります。
V$ROLLSTAT 自動UNDO管理モードの場合、このビューの情報は、UNDO表領域内のUNDOセグメントの動作を反映します。
V$TRANSACTION UNDOセグメント情報が含まれます。
DBA_UNDO_EXTENTS UNDO表領域内の各エクステントの状態およびサイズを示します。
DBA_HIST_UNDOSTAT V$UNDOSTAT情報の統計スナップショットが含まれます。詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。


関連項目:

自動UNDO管理モードで使用するビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

V$UNDOSTATビューは、現行インスタンス内のUNDO領域におけるトランザクションの実行の効果を監視する際に役立ちます。UNDO領域の消費、トランザクションの同時実行性、UNDO保存期間のチューニング、インスタンス内の長時間実行される問合せの長さおよびSQL IDに関する統計が使用できます。

ビュー内の各行には、インスタンス内で10分ごとに収集された統計が表示されます。各行は、BEGIN_TIME列の値の降順で表示されます。各行は(BEGIN_TIMEEND_TIME)でマークされた時間間隔に属します。各列は、その時間間隔中に特定の統計に関して収集されたデータを表します。ビューの最初の行は、現行の(部分的な)時間間隔に関する統計を示します。このビューには、4日サイクルによる合計576行が含まれます。

次の例は、V$UNDOSTATビューに対する問合せの結果を示したものです。

  SELECT TO_CHAR(BEGIN_TIME, 'MM/DD/YYYY HH24:MI:SS') BEGIN_TIME,
         TO_CHAR(END_TIME, 'MM/DD/YYYY HH24:MI:SS') END_TIME,
         UNDOTSN, UNDOBLKS, TXNCOUNT, MAXCONCURRENCY AS "MAXCON"
         FROM v$UNDOSTAT WHERE rownum <= 144;
  
  BEGIN_TIME          END_TIME               UNDOTSN   UNDOBLKS   TXNCOUNT     MAXCON
  ------------------- ------------------- ---------- ---------- ---------- ----------
  10/28/2004 14:25:12 10/28/2004 14:32:17          8         74   12071108          3
  10/28/2004 14:15:12 10/28/2004 14:25:12          8         49   12070698          2
  10/28/2004 14:05:12 10/28/2004 14:15:12          8        125   12070220          1
  10/28/2004 13:55:12 10/28/2004 14:05:12          8         99   12066511          3
  ...
  10/27/2004 14:45:12 10/27/2004 14:55:12          8         15   11831676          1
  10/27/2004 14:35:12 10/27/2004 14:45:12          8        154   11831165          2
 
  144 rows selected.

この例は、10/27/2004の14:35:12から24時間前までの間に、システムでUNDO領域がどのように消費されたのかを示しています。