| Oracle Database 管理者ガイド 10gリリース2(10.2) B19224-02 |
|
この章では、Oracle Databaseの変更をロールバックするための情報を格納するUNDO表領域の管理方法について説明します。 この章の内容は、次のとおりです。
すべてのOracle Databaseには、データベースの変更をロールバックまたは取り消すために使用する情報の管理方法が必要です。これらの情報は、主にコミットされる前のトランザクションの処理レコードから構成されます。これらのレコードを総称してUNDOと呼びます。
UNDOレコードは次の処理に使用されます。
ROLLBACK文を発行したときのトランザクションのロールバック
ROLLBACK文を発行すると、コミットされていないトランザクションによってデータベースに加えられた変更が、UNDOレコードを使用して取り消されます。データベース・リカバリ時は、REDOログからデータ・ファイルに適用されたコミットされていない変更が、UNDOレコードを使用してすべて取り消されます。UNDOレコードは、あるユーザーがデータを変更しているときに同じデータに同時にアクセスしようとしている別のユーザーのために、そのデータの変更前のイメージを維持することによって読込み一貫性を提供します。
この項では、自動UNDO管理の概念について説明します。この項の内容は、次のとおりです。
Oracleには、ロールバック情報とUNDO領域を管理するための、自動UNDO管理と呼ばれる完全に自動化されたメカニズムが用意されています。この管理モードでは、UNDO表領域を作成し、サーバーによって、様々なアクティブ・セッションでUNDOセグメントと領域を自動的に管理します。
自動UNDO管理を使用可能にするには、UNDO_MANAGEMENT初期化パラメータをAUTOに設定します。デフォルトのUNDO表領域はデータベースの作成時に作成されます。UNDO表領域は明示的に作成することもできます。 UNDO表領域の作成方法については「UNDO表領域の作成」を参照してください。
インスタンスが起動すると、データベースは最初に使用可能になったUNDO表領域を自動的に選択します。使用可能なUNDO表領域がない場合、インスタンスはUNDO表領域のない状態で起動し、UNDOレコードはSYSTEM表領域に格納されます。通常の環境では、これはお薦めできません。アラート・ログ・ファイルには、システムがUNDO表領域のない状態で稼働していることを伝える警告メッセージが書き込まれます。
データベースに複数のUNDO表領域があるときは、必要に応じて、起動時に特定のUNDO表領域を使用するように指定することもできます。これには、次の例のように、UNDO_TABLESPACE初期化パラメータを設定します。
UNDO_TABLESPACE = undotbs_01
この場合、UNDO表領域(この例ではundotbs_01)がまだ作成されていないと、STARTUPコマンドは失敗します。Oracle Real Application Clusters環境でUNDO_TABLESPACEパラメータを使用すると、インスタンスに特定のUNDO表領域を割り当てることができます。
次に、自動UNDO管理モードに使用する初期化パラメータの概要を示します。
| 初期化パラメータ | 説明 |
|---|---|
|
|
|
|
|
UNDO表領域の名前を指定する動的パラメータ(オプション)。このパラメータは、データベースに複数のUNDO表領域があり、データベース・インスタンスで特定のUNDO表領域を使用するように指定する場合にのみ使用します。 |
自動UNDO管理が使用可能な場合、初期化パラメータ・ファイルに手動UNDO管理に関するパラメータが含まれていても、それらは無視されます。
トランザクションがコミットされると、ロールバックまたはトランザクション・リカバリの実行にUNDOデータは不要になります。しかし、長時間実行の問合せ中にデータ・ブロックの変更前のイメージを生成する場合は、読込み一貫性を保証するために古いロールバック情報が必要になることがあります。また、いくつかのOracleのフラッシュバック機能では、正常に終了するために古いロールバック情報が必要になることがあります。このため、古いロールバック情報をできるだけ長い期間保存することをお薦めします。
自動UNDO管理が使用可能な場合、常に現在のUNDO保存期間が存在します。これは、Oracle Databaseが古いUNDO情報を上書きするまでに保存する最低の期間です。 現在のUNDO保存期間よりも古い(コミット済の)UNDO情報は、期限切れと呼ばれます。 現在のUNDO保存期間内の古いUNDO情報は、期限切れでないUNDO情報と呼ばれます。
Oracle Databaseでは、UNDO表領域サイズとシステム・アクティビティに基づいて、自動的にUNDO保存期間をチューニングします。 最小UNDO保存期間(秒単位)を指定するには、UNDO_RETENTION初期化パラメータを設定します。 UNDO表領域に新しいトランザクション用の空き領域がある場合、データベースは、指定された最小UNDO保存期間を維持しようとします。 新しいトランザクション用の空き領域が不足すると、データベースは、期限切れのUNDOの上書きを始めます。 すべての期限切れUNDOの上書き後、UNDO表領域に新しいトランザクション用の領域がなくなると、期限切れでないUNDO情報の上書きが行われる場合があります。 現行の長時間実行問合せの読取り一貫性で、いずれかの上書きされたUNDO情報が必要になった場合、問合せが「スナップショットが古すぎます。」エラー・メッセージで失敗する可能性があります。
次に、UNDO保存期間にUNDO_RETENTIONパラメータが具体的にどのような影響を与えるかを説明します。
UNDO_RETENTIONパラメータは無視されます。 表領域の空き領域が少なくなると、データベースによって期限切れでないUNDO情報が上書きされる場合があります。
AUTOEXTENDオプションが有効なUNDO表領域の場合、データベースは、UNDO_RETENTIONによって指定された最小保存期間を維持しようとします。 空き領域が少なくなると、期限切れでないUNDO情報を上書きするかわりに、表領域が自動的に拡張されます。 自動拡張可能なUNDO表領域に対してMAXSIZE句が指定されている場合、最大サイズに到達すると、データベースは期限切れでないUNDO情報の上書きを開始する場合があります。
長時間実行される問合せやOracleフラッシュバック操作を正常に終了させるために、保存期間の保証を有効化できます。保存期間の保証を有効にすると、指定したUNDOの最小保存期間が保証されます。つまり、UNDO表領域の領域不足によってトランザクションが失敗した場合でも、期限切れでないUNDOデータは上書きされません保存期間の保証を有効にしないと、領域が十分でない場合、期限切れでないUNDOが上書きされるため、システムのUNDO保存期間が短くなります。デフォルトでは、このオプションは無効になっています。
保存期間の保証を有効にするには、CREATE DATABASE文またはCREATE UNDO TABLESPACE文を使用してUNDO表領域を作成するときに、そのUNDO表領域に対してRETENTION GUARANTEE句を指定します。または、後でこの句をALTER TABLESPACE文で指定することもできます。保存期間の保証を無効にするには、RETENTION NOGUARANTEE句を使用します。
DBA_TABLESPACESビューを使用して、UNDO表領域の保存期間の保証の設定を確認できます。RETENTION列には、GUARANTEE、NOGUARANTEEまたはNOT APPLY(UNDO表領域ではなく表領域で使用)の値が表示されます。
Oracle Databaseでは、UNDO表領域の構成方法に基づいて、自動的にUNDO保存期間をチューニングします。
AUTOEXTENDオプションを使用して構成されている場合、データベースでは、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の最大保存期間を計算します。最適なUNDO管理を実現するために、データベースでは、UNDOの保存期間を、表領域サイズの100%ではなく、85%を基にチューニングするか、または使用済領域に対する警告アラートしきい値の率、あるいはいずれか低い方に基づいてチューニングします(警告アラートしきい値のデフォルトは85%ですが、変更できます)。したがって、UNDO表領域の警告アラートしきい値を85%未満に設定すると、チューニングされるUNDO保存期間の長さが短くなることがあります。 表領域のアラートしきい値の詳細は、「表領域のアラート管理」を参照してください。
UNDO保存期間を設定するには、UNDO_RETENTION初期化パラメータを設定します。 このパラメータで、最小UNDO保存期間を秒単位で指定します。 「UNDOの保存期間」で説明されているように、現行のUNDO保存期間はUNDO_RETENTIONよりも大きくなるように、または保存期間の保証が有効な場合を除き、空き領域が少ない場合はUNDO_RETENTIONよりも少なくなるように、自動的にチューニングされます。
UNDO保存期間の設定方法
UNDO_RETENTIONパラメータの変更は即時に反映されますが、その効果は、現行のUNDO表領域に十分な領域がある場合のみ表れます。
UNDO表領域のサイズは、UNDO表領域の自動拡張機能を使用するか、または固定サイズ表領域の場合はUNDOアドバイザを使用して、適切に変更できます。
Oracle DatabaseはUNDO表領域の自動拡張機能をサポートしているため、本番環境でのUNDO表領域の容量計画が容易になります。システムを本番環境で最初に実行するとき、UNDO表領域の領域要件が不明な場合があります。このような場合は、UNDO表領域の自動拡張機能を使用可能にすると、さらに領域が必要なときにそのサイズが自動的に拡張されます。この方法を使用する場合は、UNDO表領域の作成時にAUTOEXTENDキーワードを組み込みます。
固定サイズの表領域を使用する場合は、UNDOアドバイザを使用すると、必要な容量を見積るのに役立ちます。UNDOアドバイザには、Enterprise ManagerまたはDBMS_ADVISOR PL/SQLパッケージを介してアクセスできます。このアドバイザには、Enterprise Managerを介してアクセスすることをお薦めします。 Enterprise Managerを介してUNDOアドバイザを使用する方法の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
UNDOアドバイザは、自動ワークロード・リポジトリ(AWR)に収集されたデータに基づいて分析します。したがって、AWRで適切なワークロード統計を使用可能にし、UNDOアドバイザが正確な推奨事項を作成できるようにすることが重要です。新規作成したデータベースでは、適切な統計がすぐに使用できない場合があります。このような場合は、自動拡張可能なUNDO表領域を使用できます。
AWR統計の収集間隔と保存期間の調整は、アドバイザが作成する推奨事項の精度とタイプに影響します。 詳細は、「自動ワークロード・リポジトリ」を参照してください。
UNDOアドバイザを使用する場合は、最初に次の2つの値を見積ります。
データベースが起動してしばらくすると、Enterprise Managerの「UNDO管理」ページに「最長実行問合せ」フィールドを表示できます。
たとえば、過去に最大48時間のフラッシュバック問合せを実行したと予測される場合、フラッシュバック要件は48時間です。
次に、これら2つのUNDO保存期間に関する値のうち最大値を選択し、その値を使用して、UNDOアドバイザのグラフで必要なUNDO表領域サイズを調べます。
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(name, 'INSTANCE', 1); DBMS_ADVISOR.execute_task(tname); end; /
アドバイザ・タスクを作成した後は、Enterprise ManagerのAutomatic Database Diagnostic Monitorに出力および推奨事項を表示できます。この情報は、DBA_ADVISOR_*データ・ディクショナリ・ビューにも表示されます。
|
関連項目
|
この項では、UNDO表領域を管理する際に必要な手順について説明します。この項の内容は、次のとおりです。
UNDO表領域の作成には2つの方法があります。1つは、CREATE DATABASE文の発行時にUNDO表領域を作成する方法です。これは、データベースを新規作成中にインスタンスが自動UNDO管理モードで起動したとき(UNDO_MANAGEMENT = AUTO)に実行されます。もう1つは、既存のデータベースで使用する方法です。この場合はCREATE UNDO TABLESPACE文を使用します。
UNDO表領域にはデータベース・オブジェクトは作成できません。UNDO表領域は、システムが管理しているUNDOデータ用に予約されています。
Oracle 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表領域を作成できます。この操作については、「データベース作成時の大型ファイル表領域のサポート」を参照してください。
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つのみアクティブにできます。
UNDO表領域を変更するには、ALTER TABLESPACE文を使用します。ただし、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表領域を削除するには、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表領域の内容はすべて削除されます。
ある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表領域内のトランザクション表に割り当てられます。
切替え操作は、古いUNDO表領域内のトランザクションがコミットされるまで待機しません。古いUNDO表領域内に未処理のトランザクションがある場合、古いUNDO表領域はPENDING OFFLINEモード(状態)になります。このモードでは、既存のトランザクションは引き続き実行できますが、新しいユーザー・トランザクションのUNDOレコードをこのUNDO表領域に格納することはできません。
UNDO表領域は、切替え操作が正常に完了した後も、このPENDING OFFLINEモードのまま存在できます。PENDING OFFLINEのUNDO表領域は、別のインスタンスが使用することも、削除することもできません。最終的に、すべてのアクティブなトランザクションがコミットされた後、UNDO表領域は自動的にPENDING OFFLINEモードからOFFLINEモードに移行します。それ以降は、他のインスタンスが(Oracle Real Application Clusters環境で)そのUNDO表領域を使用できます。
UNDO TABLESPACEのパラメータ値を「''」(2つの一重引用符)に設定した場合、現行のUNDO表領域が次の使用可能なUNDO表領域に切り替えられます。使用可能なUNDO表領域がない場合もあるため、この文の使用には注意が必要です。
次の例では、現行のUNDO表領域の割当てを解除しています。
ALTER SYSTEM SET UNDO_TABLESPACE = '';
Oracle Database Resource Managerを使用すると、UNDO領域に対するユーザー割当てを確立できます。DBAは、データベース・リソース・マネージャのディレクティブUNDO_POOLを使用して、ユーザーのグループ(リソース・コンシューマ・グループ)が消費するUNDO表領域の量を制限できます。
UNDOプールは、コンシューマ・グループごとに指定できます。UNDOプールによって、コンシューマ・グループが生成できるUNDOの合計量が制御されます。コンシューマ・グループが生成するUNDOの合計量がそのUNDO制限を超えると、UNDOを生成している現行のUPDATEトランザクションが終了します。コンシューマ・グループの他のメンバーは、UNDO領域がプールから解放されるまで、新たに更新を実行できなくなります。
UNDO_POOLディレクティブが明示的に定義されていないときは、ユーザーは無制限にUNDO領域を使用できます。
現在、ロールバック・セグメントを使用してUNDO領域を管理している場合は、自動UNDO管理に移行することをお薦めします。Oracle Databaseが提供するファンクションを使用すると、使用しているロールバック・セグメントの構成と使用方法に基づいて新規UNDO表領域のサイズ決定に関する情報が提供されます。このファンクションを実行するには、DBA権限が必要です。
DECLARE utbsiz_in_MB NUMBER; BEGIN utbsiz_in_MB := DBMS_UNDO_ADV.RBU_MIGRATION; end; /
このファンクションは、サイズに関する情報を直接返します。
ここでは、自動UNDO管理モードにおいてUNDO領域に関する情報を表示する際に役立つビューについて説明し、いくつかの例を示します。ここで紹介したビュー以外にも、表領域やデータ・ファイルの情報を表示するビューを使用して、情報を取得できます。 これらのビューの詳細は、「データファイル情報の表示」を参照してください。
Oracle Databaseでは、表領域に使用可能な領域が少なくなると事前にアラートが生成されるため、表領域のディスク領域の使用状況を管理するために役立ちます。 UNDO表領域のアラートのしきい値の設定方法は、「表領域のアラート管理」を参照してください。
Oracle Databaseでは、UNDO領域の事前アラート以外に、「スナップショットが古すぎます。」エラーが発生するような長時間実行される問合せがシステムにある場合にもアラートが生成されます。過剰にアラートが生成されるのを防ぐため、長時間実行される問合せのアラートは24時間以上の間隔をおいて発行されます。アラートが生成された場合は、Enterprise Managerの「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領域がどのように消費されたのかを示しています。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|