16 UNDOの管理
デフォルトのインストールで、Oracle DatabaseによってUNDOが自動的に管理されます。通常、DBAによる操作は不要です。ただし、インストールでOracle Flashback操作を使用する場合は、それらの操作が正常に終了するように、UNDO管理タスクをいくつか実行することが必要な場合があります。
- UNDOの概要
Oracle Databaseでは、データベースの変更をロールバックまたは取り消すために使用する情報を作成して管理します。これらの情報は、主にコミットされる前のトランザクションの処理レコードから構成されます。これらのレコードを総称してUNDOと呼びます。 - 自動UNDO管理の概要
Oracle DatabaseでUNDO情報と領域を自動的に管理できます。 - 最小UNDO保存期間の設定
最小UNDO保存期間(秒単位)を指定するには、UNDO_RETENTION
初期化パラメータを設定します。 - 固定サイズのUNDO表領域のサイズ変更
UNDO保存期間の自動チューニングは、通常、固定サイズのUNDO表領域に有効です。固定サイズの表領域を使用する場合は、UNDOアドバイザを使用すると、必要な容量を見積るのに役立ちます。 - UNDO表領域の管理
UNDO表領域の管理では、表領域の作成、変更および削除などのタスクを行います。UNDO表領域を切り替えたり、UNDO領域のユーザー割当てを決定することもできます。 - 自動UNDO管理への移行
現在、ロールバック・セグメントを使用してUNDO領域を管理している場合は、データベースを自動UNDO管理に移行することをお薦めします。 - 一時UNDOの管理
デフォルトでは、一時表のUNDOレコードはUNDO表領域に格納され、REDOにログが記録されますが、これは永続表のUNDOが管理される方法と同じです。ただし、TEMP_UNDO_ENABLED
初期化パラメータを使用すると、一時表のUNDOと永続表のUNDOを区別できます。このパラメータをTRUE
に設定した場合、一時表のUNDOはtemporary undoと呼ばれます。 - UNDO領域のデータ・ディクショナリ・ビュー
ビューのセットを問い合せて、自動UNDO管理モードのUNDO領域についての情報を取得できます。
関連項目:
Oracle Databaseによってデータファイルが作成および管理されるUNDO表領域の作成方法は、「Oracle Managed Filesの使用」を参照してください。
親トピック: Oracle Databaseの構造と記憶域
16.1 UNDOの概要
Oracle Databaseでは、データベースの変更をロールバックまたは取り消すために使用する情報を作成して管理します。これらの情報は、主にコミットされる前のトランザクションの処理レコードから構成されます。これらのレコードを総称してUNDOと呼びます。
UNDOレコードは次の処理に使用されます。
-
ROLLBACK
文を発行したときのトランザクションのロールバック -
データベースのリカバリ
-
読取り一貫性の実現
-
Oracle Flashback Queryを使用した過去のある時点のデータの分析
-
Oracle Flashback機能を使用した論理的な破損のリカバリ
ROLLBACK
文を発行すると、コミットされていないトランザクションによってデータベースに加えられた変更が、UNDOレコードを使用して取り消されます。データベース・リカバリ時は、REDOログからデータファイルに適用されたコミットされていない変更が、UNDOレコードを使用してすべて取り消されます。UNDOレコードは、あるユーザーがデータを変更しているときに同じデータに同時にアクセスしようとしている別のユーザーのために、そのデータの変更前のイメージを維持することによって読込み一貫性を提供します。
関連項目:
親トピック: UNDOの管理
16.2 自動UNDO管理の概要
Oracle Databaseは、UNDO情報と領域を自動的に管理できます。
- 自動UNDO管理の概要
Oracleには、UNDO情報と領域を管理するために、自動UNDO管理と呼ばれる完全に自動化されたメカニズムが用意されています。自動UNDO管理では、データベースによってUNDOセグメントがUNDO表領域で管理されます。 - UNDO保存期間
UNDO保存期間とは、Oracle Databaseで古いUNDO情報を上書きしないで保存する最低期間のことです。
親トピック: UNDOの管理
16.2.1 自動UNDO管理の概要
Oracleには、ロールバック情報と領域を管理するための、自動UNDO管理と呼ばれる完全に自動化されたメカニズムが用意されています。自動UNDO管理では、データベースによってUNDOセグメントがUNDO表領域で管理されます。
自動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表領域の名前を指定します。データベースに複数のUNDO表領域があり、データベース・インスタンスで特定のUNDO表領域を使用するように指定する場合にのみ使用します。 |
自動UNDO管理が使用可能な場合は、初期化パラメータ・ファイルに手動UNDO管理に関するパラメータが含まれていても、それらは無視されます。
ノート:
Oracle Databaseの以前のリリースでは、手動UNDO管理モードがデフォルトです。自動UNDO管理モードに変更するには、UNDO表領域を作成してからUNDO_MANAGEMENT
初期化パラメータをAUTO
に変更する必要があります。Oracle DatabaseがOracle9i以上で、自動UNDO管理に変更する場合、手順については『Oracle Databaseアップグレード・ガイド』を参照してください。
UNDO_MANAGEMENT
初期化パラメータがNULLの場合、Oracle Database 11g以上では自動UNDO管理モードにデフォルト設定されますが、以前のリリースでは手動UNDO管理モードにデフォルト設定されます。したがって、以前のリリースを現在のリリースにアップグレードする場合は注意が必要です。UNDO表領域のサイズの設定方法に関する情報など、自動UNDO管理モードに移行するための適切な方法については、『Oracle Databaseアップグレード・ガイド』を参照してください。
親トピック: 自動UNDO管理の概要
16.2.2 UNDO保存期間
UNDO保存期間とは、Oracle Databaseで古いUNDO情報を上書きしないで保存する最低期間のことです。
- UNDOの保存期間
自動UNDO管理が有効な場合は、常に現在のUNDO保存期間が存在します。これは、Oracle Databaseで古いUNDO情報を上書きしないで保存する最低期間のことです。 - UNDOの保存期間の自動チューニング
Oracle Databaseでは、UNDO表領域の構成方法に基づいて、UNDO保存期間を自動的にチューニングします。 - 保存期間の保証
長時間実行される問合せやOracle Flashback操作を正常に行うために、保存期間の保証を有効化できます。 - UNDOの保存期間のチューニングとアラートしきい値
固定サイズのUNDO表領域を使用する場合、データベースでは、データベース統計とUNDO表領域のサイズに基づいて最適な保存期間を計算します。 - チューニング済UNDO保存期間の追跡
現行の保存期間を判別するには、V$UNDOSTAT
ビューのTUNED_UNDORETENTION
列を問い合せます。
親トピック: 自動UNDO管理の概要
16.2.2.1 UNDOの保存期間
自動UNDO管理が使用可能な場合は、常に現在のUNDO保存期間が存在します。これは、Oracle Databaseが古いロールバック情報を上書きするまでの最小保存期間です。
トランザクションがコミットされると、ロールバックまたはトランザクション・リカバリの実行にUNDOデータは不要になります。しかし、長時間実行の問合せ中にデータ・ブロックの変更前のイメージを生成する場合は、読込み一貫性を保証するために古いロールバック情報が必要になることがあります。また、いくつかのOracle Flashback機能を正常に終了させるには、古いロールバック情報が必要になる場合があります。このため、古いロールバック情報をできるかぎり長い期間保存することをお薦めします。
現在の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保存期間
16.2.2.2 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のロールバック情報が上書きされる場合があります。
関連項目:
親トピック: UNDO保存期間
16.2.2.3 保存期間の保証
長時間実行される問合せや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
列には、GUARANTEE
、NOGUARANTEE
またはNOT
APPLY
(NOT
APPLY
はUNDO表領域以外の表領域で使用)の値が表示されます。
親トピック: UNDO保存期間
16.2.2.4 UNDOの保存期間のチューニングとアラートしきい値
固定サイズのUNDO表領域を使用する場合、データベースでは、データベース統計とUNDO表領域のサイズに基づいて最適な保存期間を計算します。
最適なUNDO管理を実現するために、データベースでは、UNDOの保存期間を、表領域サイズの100%ではなく、70%を基にチューニングするか、または使用済領域に対する警告アラートしきい値の率でチューニングするか、いずれか低い方に基づいてチューニングします。(警告アラートしきい値のデフォルトは70%ですが、変更が可能です。)したがって、UNDO表領域の警告アラートしきい値を70%未満に設定すると、チューニングされるUNDO保存期間の長さが短くなることがあります。表領域のアラートしきい値の詳細は、「表領域のアラートの管理」を参照してください。
親トピック: UNDO保存期間
16.2.2.5 チューニング済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保存期間
16.3 最小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の管理
16.4 固定サイズのUNDO表領域のサイズ変更
UNDO保存期間の動的チューニングは、通常、固定サイズのUNDO表領域に有効です。固定サイズの表領域を使用する場合は、UNDOアドバイザを使用すると、必要な容量を見積るのに役立ちます。
UNDOアドバイザには、Oracle Enterprise Manager Database Express (EM Express)またはDBMS_ADVISOR
PL/SQLパッケージを介してアクセスできます。このアドバイザには、EM Expressを介してアクセスすることをお薦めします。EM Expressを介して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アドバイザのPL/SQLインタフェースのアクティブ化
UNDOアドバイザをアクティブにするには、アドバイザ・フレームワークを使用してUNDOアドバイザ・タスクを作成します。
関連項目:
UNDOアドバイザを使用してUNDO表領域の最小サイズを計算する手順は、『Oracle Database 2日でデータベース管理者』を参照してください。
親トピック: UNDOの管理
16.4.1 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; /
アドバイザ・タスクを作成した後は、EM Expressの自動データベース診断モニターに出力および推奨事項を表示できます。この情報は、DBA_ADVISOR_*
データ・ディクショナリ・ビュー(DBA_ADVISOR_TASKS
、DBA_ADVISOR_OBJECTS
、DBA_ADVISOR_FINDINGS
、DBA_ADVISOR_RECOMMENDATIONS
など)にも表示されます。
関連項目:
-
様々なアドバイザにアドバイザ・タスクを作成する例は、「セグメント・アドバイザの使用」を参照してください
-
EM Expressの自動データベース診断モニターの詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
-
DBA_ADVISOR_*
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
親トピック: 固定サイズのUNDO表領域のサイズ変更
16.5 UNDO表領域の管理
UNDO表領域の管理では、表領域の作成、変更および削除などのタスクを行います。UNDO表領域を切り替えたり、UNDO領域のユーザー割当てを決定することもできます。
- UNDO表領域の作成
新規インストールでは、Database Configuration Assistant (DBCA)によってUNDO表領域が自動的に作成されますが、UNDO表領域を手動で作成することが必要な場合があります。 - UNDO表領域の変更
UNDO表領域を変更するには、ALTER TABLESPACE
文を使用します。 - UNDO表領域の削除
UNDO表領域を削除するには、DROP TABLESPACE
文を使用します。 - UNDO表領域の切替え
あるUNDO表領域から別のUNDO表領域に切り替えることができます。UNDO_TABLESPACE
初期化パラメータは動的パラメータであるため、ALTER SYSTEM SET
文を使用して新しいUNDO表領域を割り当てることができます。 - UNDO領域に対するユーザー割当ての確立
Oracle Database Resource Managerを使用すると、UNDO領域に対するユーザー割当てを確立できます。DBAは、データベース・リソース・マネージャのディレクティブUNDO_POOL
を使用して、ユーザーのグループ(リソース・コンシューマ・グループ)が消費するUNDO表領域の量を制限できます。 - UNDO表領域に対する領域のアラートしきい値の管理
Oracle Databaseでは、表領域に使用可能な領域が少なくなると事前にアラートが生成されるため、表領域のディスク領域の使用状況を管理するために役立ちます。
親トピック: UNDOの管理
16.5.1 UNDO表領域の作成
新規インストールでは、Database Configuration Assistant (DBCA)によってUNDO表領域が自動的に作成されますが、UNDO表領域を手動で作成することが必要な場合があります。
- UNDO表領域の作成について
データベースを作成する際に、CREATE DATABASE
文を使用してUNDO表領域を作成できます。既存のデータベースの場合は、CREATE UNDO TABLESPACE
文を使用してUNDO表領域を作成できます。 - CREATE DATABASEを使用したUNDO表領域の作成
CREATE DATABASE
文でUNDO TABLESPACE
句を使用すると、特定のUNDO表領域を作成できます。 - CREATE UNDO TABLESPACE文の使用
CREATE UNDO TABLESPACE
文はCREATE TABLESPACE
文とほぼ同じですが、UNDO
キーワードを指定します。UNDO表領域の属性のほとんどはデータベースが決定しますが、データベース管理者はDATAFILE
句を指定できます。
親トピック: UNDO表領域の管理
16.5.1.1 UNDO表領域の作成について
データベースを作成する際に、CREATE DATABASE
文を使用してUNDO表領域を作成できます。既存のデータベースの場合は、CREATE UNDO TABLESPACE
文を使用してUNDO表領域を作成できます。
UNDO表領域の作成には2つの方法があります。1つは、CREATE DATABASE
文の発行時にUNDO表領域を作成する方法です。これは、データベースを新規作成中にインスタンスが自動UNDO管理モードで起動したとき(UNDO_MANAGEMENT = AUTO
)に実行されます。もう1つは、既存のデータベースで使用する方法です。この場合はCREATE UNDO TABLESPACE
文を使用します。
UNDO表領域にはデータベース・オブジェクトは作成できません。システム管理のUNDOデータ用に確保されています。
Oracle Databaseでは、単一ファイルUNDO表領域を作成できます。単一ファイル(bigfile)表領域については、「bigfile表領域」を参照してください。
親トピック: UNDO表領域の作成
16.5.1.2 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言語リファレンス』を参照してください。
親トピック: UNDO表領域の作成
16.5.1.3 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表領域の作成
16.5.2 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
文を使用すると、データファイルのサイズを変更または拡張できます。
関連項目:
-
ALTER TABLESPACE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
親トピック: UNDO表領域の管理
16.5.3 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表領域の管理
16.5.4 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 OFFLINE
のUNDO表領域は、別のインスタンスが使用することも、削除することもできません。最終的に、すべてのアクティブなトランザクションがコミットされた後、UNDO表領域は自動的にPENDING OFFLINE
モードからOFFLINE
モードに移行します。それ以降は、他のインスタンスが(Oracle Real Application Cluster環境で)そのUNDO表領域を使用できます。
UNDO TABLESPACE
のパラメータ値を「''」(2つの一重引用符)に設定した場合は、現行のUNDO表領域が次の使用可能なUNDO表領域に切り替えられます。使用可能なUNDO表領域がない場合もあるため、この文の使用には注意が必要です。
次の例では、現行のUNDO表領域の割当てを解除しています。
ALTER SYSTEM SET UNDO_TABLESPACE = '';
親トピック: UNDO表領域の管理
16.5.5 UNDO領域に対するユーザー割当ての確立
Oracle Database Resource Managerを使用すると、UNDO領域に対するユーザー割当てを確立できます。DBAは、データベース・リソース・マネージャのディレクティブUNDO_POOL
を使用して、ユーザーのグループ(リソース・コンシューマ・グループ)が消費するUNDO表領域の量を制限できます。
UNDOプールは、コンシューマ・グループごとに指定できます。UNDOプールによって、コンシューマ・グループが生成できるUNDOの合計量が制御されます。コンシューマ・グループが生成するUNDOの合計量がそのUNDO制限を超えると、UNDOを生成している現行のUPDATE
トランザクションが終了します。コンシューマ・グループの他のメンバーは、UNDO領域がプールから解放されるまで、新たに更新を実行できなくなります。
UNDO_POOL
ディレクティブが明示的に定義されていないときは、ユーザーは無制限にUNDO領域を使用できます。
親トピック: UNDO表領域の管理
16.5.6 UNDO表領域に対する領域のアラートしきい値の管理
Oracle Databaseでは、表領域に使用可能な領域が少なくなると事前にアラートが生成されるため、表領域のディスク領域の使用状況を管理するために役立ちます。
UNDO表領域のアラートしきい値の設定方法は、「表領域のアラートの管理」を参照してください。
Oracle Databaseでは、UNDO領域の事前アラート以外に、「スナップショットが古すぎます
」エラーが発生するような長時間実行される問合せがシステムにある場合にもアラートが生成されます。過剰にアラートが生成されるのを防ぐため、長時間実行される問合せのアラートは24時間以上の間隔をおいて発行されます。アラートが生成された場合は、EM Expressの「UNDOアドバイザ」ページをチェックしてUNDO表領域に関する詳細情報を参照できます。EM Expressを介してUNDOアドバイザを使用する方法の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
親トピック: UNDO表領域の管理
16.6 自動UNDO管理への移行
現在、ロールバック・セグメントを使用してUNDO領域を管理している場合は、データベースを自動UNDO管理に移行することをお薦めします。
手順については、『Oracle Databaseアップグレード・ガイド』を参照してください。
親トピック: UNDOの管理
16.7 一時UNDOの管理
デフォルトでは、一時表のUNDOレコードはUNDO表領域に格納され、REDOにログが記録されますが、これは永続表のUNDOが管理される方法と同じです。ただし、TEMP_UNDO_ENABLED
初期化パラメータを使用すると、一時表のUNDOと永続表のUNDOを区別できます。このパラメータをTRUE
に設定した場合、一時表のUNDOはtemporary undoと呼ばれます。
- 一時UNDOの管理について
一時UNDOレコードはデータベースの一時表領域に格納され、REDOログには記録されません。一時UNDOを有効にすると、一時表領域によって使用されるセグメントの一部に一時UNDOが格納され、これらのセグメントは一時UNDOセグメントと呼ばれます。 - 一時UNDOの有効化と無効化
セッションまたはシステムの一時UNDOを有効化または無効化できます。そのためには、TEMP_UNDO_ENABLED
初期化パラメータを設定します。
親トピック: UNDOの管理
16.7.1 一時UNDOの管理について
一時UNDOレコードはデータベースの一時表領域に格納され、REDOログには記録されません。一時UNDOを有効にすると、一時表領域によって使用されるセグメントの一部に一時UNDOが格納され、これらのセグメントは一時UNDOセグメントと呼ばれます。
一時UNDOを有効にすると、UNDOレコードが占める一時表領域のサイズを大きくすることが必要になることがあります。
一時UNDOを有効にすると、次の利点があります。
-
一時UNDOによって、UNDO表領域に格納されるUNDOの量が削減されます。
UNDO表領域内のUNDOが減少すると、UNDOレコードのUNDO保存期間要件がより現実的なものになることがあります。
-
一時UNDOにより、REDOログのサイズが縮小されます。
REDOログに書き込まれるデータが減少することによってパフォーマンスが向上し、解析するREDOデータが減少することによって、LogMinerなどのREDOログ・レコードを解析するコンポーネントのパフォーマンスが向上します。
-
一時UNDOによって、フィジカル・スタンバイ・データベース内の一時表に対する、Oracle Active Data Guardオプションを使用したデータ操作言語(DML)操作が可能になります。ただし、一時表を作成するデータ定義言語(DDL)操作はプライマリ・データベースで発行する必要があります。
特定のセッションまたはシステム全体に対して一時UNDOを有効にできます。セッションに対してALTER
SESSION
文を使用して一時UNDOを有効にすると、そのセッションによって、他のセッションに影響を及ぼすことなく、一時UNDOが作成されます。システムに対してALTER
SYSTEM
文を使用して一時UNDOを有効にすると、既存のすべてのセッションと新規セッションによって一時UNDOが作成されます。
セッションで一時オブジェクトが最初に使用されるとき、TEMP_UNDO_ENABLED
初期化パラメータの現在の値がセッションの残りの部分に設定されます。したがって、セッションに対して一時UNDOが有効であり、かつ、そのセッションで一時オブジェクトが使用されている場合、セッションに対して一時UNDOを無効にすることはできません。同様に、セッションに対して一時UNDOが無効であり、かつ、そのセッションで一時オブジェクトが使用されている場合、セッションに対して一時UNDOを有効にすることはできません。
Oracle Active Data Guardオプションが指定されたフィジカル・スタンバイ・データベースに対しては、一時UNDOがデフォルトで有効になっています。このデフォルト設定のため、TEMP_UNDO_ENABLED
初期化パラメータは、Active Data Guardオプションが指定されたフィジカル・スタンバイ・データベースには影響を及ぼしません。
ノート:
一時UNDOは、データベースの互換性レベルが12.0.0以上である場合にのみ有効にできます。
関連項目:
-
TEMP_UNDO_ENABLED
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。 -
一時UNDOセグメントの詳細は、『Oracle Database概要』を参照してください。
親トピック: 一時UNDOの管理
16.7.2 一時UNDOの有効化と無効化
セッションまたはシステムに対して一時UNDOを有効または無効にできます。そのためには、TEMP_UNDO_ENABLED
初期化パラメータを設定します。
一時UNDOを有効または無効にするには:
-
SQL*Plusで、データベースに接続します。
セッションに対して一時UNDOを有効または無効にする場合は、SQL*Plusでセッションを開始します。
システムに対して一時UNDOを有効または無効にする場合は、SQL*Plusで
ALTER
SYSTEM
システム権限がある管理ユーザーとして接続します。「SQL*Plusを使用したデータベースへの接続」を参照してください。
-
TEMP_UNDO_ENABLED
初期化パラメータを設定します。-
セッションに対して一時UNDOを有効にするには、次のSQL文を実行します。
ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
-
セッションに対して一時UNDOを無効にするには、次のSQL文を実行します。
ALTER SESSION SET TEMP_UNDO_ENABLED = FALSE;
-
システムに対して一時UNDOを有効にするには、次のSQL文を実行します。
ALTER SYSTEM SET TEMP_UNDO_ENABLED = TRUE;
システムに対して一時UNDOを有効にした後、
ALTER
SESSION
文を使用してセッションの一時UNDOを無効にできます。 -
システムに対して一時UNDOを無効にするには、次のSQL文を実行します。
ALTER SYSTEM SET TEMP_UNDO_ENABLED = FALSE;
システムに対して一時UNDOを無効にした後、
ALTER
SESSION
文を使用してセッションの一時UNDOを有効にできます。
-
サーバー・パラメータ・ファイルまたはテキスト初期化パラメータ・ファイルでTEMP_UNDO_ENABLED
をTRUE
に設定して、システムに対して一時UNDOを有効にすることもできます。この場合、システムに対してはALTER
SYSTEM
文、またはセッションに対してはALTER
SESSION
文によって一時UNDOを無効にしないかぎり、すべての新規セッションで一時UNDOが作成されます。
関連項目:
-
TEMP_UNDO_ENABLED
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。 -
Oracle Data Guard環境での一時UNDOの有効化と無効化の詳細は、『Oracle Data Guard概要および管理』を参照してください。
親トピック: 一時UNDOの管理
16.8 UNDO領域のデータ・ディクショナリ・ビュー
ビューのセットを問い合せて、自動UNDO管理モードのUNDO領域についての情報を取得できます。
ここで紹介したビュー以外にも、表領域やデータファイルの情報を表示するビューを使用して、情報を取得できます。これらのビューの詳細は、「データファイルのデータ・ディクショナリ・ビュー」を参照してください。
UNDO表領域に関する領域情報を取得するために、次の動的パフォーマンス・ビューが役立ちます。
ビュー | 説明 |
---|---|
UNDO領域の監視とチューニングのための統計情報が含まれます。このビューは、現行の作業負荷に必要なUNDO領域の量を見積る際に利用できます。また、データベースはこの情報を使用して、システム内のUNDOの使用方法をチューニングします。このビューの情報は、自動UNDO管理モードでのみ意味があります。 |
|
一時UNDO領域の監視とチューニングのための統計情報が含まれます。このビューは、一時表領域で現行の作業負荷に必要な一時UNDO領域の量を見積る際に利用できます。また、データベースはこの情報を使用して、システム内の一時UNDOの使用方法をチューニングします。このビューは、一時UNDOが有効な場合にのみ意味があります。 |
|
自動UNDO管理モードの場合、このビューの情報は、UNDO表領域内のUNDOセグメントの動作を反映します。 |
|
UNDOセグメント情報が含まれます。 |
|
UNDO表領域内の各エクステントの状態およびサイズを示します。 |
|
|
V$UNDOSTAT
ビューは、現行インスタンス内のUNDO領域におけるトランザクションの実行の効果を監視する際に役立ちます。UNDO領域の消費、トランザクションの同時実行性、UNDO保存期間のチューニング、インスタンス内の長時間実行される問合せの長さおよびSQL IDに関する統計が使用できます。
ビュー内の各行には、インスタンス内で10分ごとに収集された統計が表示されます。各行は、BEGIN_TIME
列の値の降順で表示されます。各行は(BEGIN_TIME
、END_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領域がどのように消費されたのかを示しています。
親トピック: UNDOの管理