この章の内容は、次のとおりです。
Oracle Databaseでは、使用可能な領域が少なくなると事前にアラートで通知されるため、表領域のディスク領域を管理するのに役立ちます。デフォルトで、警告およびクリティカルの2つのアラートしきい値が定義されています。警告のしきい値は、領域が残り少なくなり始める境界値です。クリティカルのしきい値は、即時に注意を喚起する必要のある深刻な境界値です。データベースは、両方のしきい値でアラートを発行します。
ローカル管理表領域とディクショナリ管理表領域の両方に対してアラートしきい値を指定するには、次の2つの方法があります。
パーセント・フルによる方法
警告のしきい値とクリティカルのしきい値の両方について、使用済領域が合計領域の一定割合以上になるとアラートが発行されます。
空き領域(KB単位)による方法
警告のしきい値とクリティカルのしきい値の両方について、空き領域が一定容量(KB)未満になるとアラートが発行されます。空き領域のしきい値は、表領域が大規模な場合に便利です。
ローカル管理表領域のアラートはサーバーで生成されます。ディクショナリ管理表領域の場合は、Enterprise Managerがこの機能を提供します。詳細は、「サーバー生成アラートを使用したデータベースの動作の監視」を参照してください。
新しい表領域には、次のようにアラートしきい値が割り当てられます。
ローカル管理表領域: ローカル管理表領域を新規作成すると、データベースに定義されているデフォルトのしきい値がその表領域に割り当てられます。新しく作成されたデータベースには、警告のしきい値に85%使用済、クリティカルのしきい値に97%使用済のデフォルトが割り当てられます。新しいデータベースに対する空き領域のしきい値のデフォルトは、両方ともゼロ(無効)です。これらのデータベースのデフォルトは変更可能で、その手順については後で説明します。
ディクショナリ管理表領域: ディクショナリ管理表領域を新規作成すると、Enterprise Managerのメトリック・カテゴリ「表領域の空き領域(MB)(ディクショナリ管理)」および「表領域使用率(%)(ディクショナリ管理)」の「その他すべて」にリストされているしきい値が割り当てられます。これらの値は、「メトリックとポリシー設定」ページで変更できます。
注意: バージョン9.x以前から10.xにアップグレードしたデータベースでは、すべてのローカル管理表領域のアラートしきい値はデフォルトで0(ゼロ)に設定されます。この設定は、アラート・メカニズムを事実上使用禁止にして、新しく移行されたデータベースへの過剰なアラートを回避しています。 |
各表領域には、パーセント・フルのしきい値のみ、空き領域のしきい値のみ、または同時に両方のしきい値タイプを設定できます。どちらのタイプのしきい値も、0(ゼロ)に設定すると無効になります。
理想的な警告のしきい値は、クリティカルのしきい値が発行される前に問題を解決できる時間を考慮して、早めにアラートを発行する設定です。クリティカルのしきい値は、ただちに処理してサービスの損失を回避できるよう十分早めにアラートを発行するように設定します。
ローカル管理表領域のアラートしきい値の設定方法
次のいずれかを実行します。
Enterprise Managerの「表領域」ページを使用します。
手順については、『Oracle Database 2日でデータベース管理者』を参照してください。
DBMS_SERVER_ALERT.SET_THRESHOLD
パッケージ・プロシージャをコールします。
詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
ディクショナリ管理表領域のアラートしきい値の設定方法
Enterprise Managerの「表領域」ページを使用します。
手順については、『Oracle Database 2日でデータベース管理者』を参照してください。
例: ローカル管理表領域
次の例は、USERS
表領域について空き領域のしきい値を10MB(警告)および2MB(クリティカル)に設定し、パーセント・フルのしきい値を無効にします。
BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => DBMS_SERVER_ALERT.TABLESPACE_BYT_FREE, warning_operator => DBMS_SERVER_ALERT.OPERATOR_LE, warning_value => '10240', critical_operator => DBMS_SERVER_ALERT.OPERATOR_LE, critical_value => '2048', observation_period => 1, consecutive_occurrences => 1, instance_name => NULL, object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE, object_name => 'USERS'); DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL, warning_operator => DBMS_SERVER_ALERT.OPERATOR_GT, warning_value => '0', critical_operator => DBMS_SERVER_ALERT.OPERATOR_GT, critical_value => '0', observation_period => 1, consecutive_occurrences => 1, instance_name => NULL, object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE, object_name => 'USERS'); END; /
注意: パーセント・フルのしきい値に0(ゼロ)以外の値を設定する場合は、「以上」演算子OPERATOR_GE を使用します。 |
データベースのデフォルトしきい値への表領域のリストア
ローカル管理表領域のアラートしきい値に明示的に値を設定した後は、その値をDBMS_SERVER_ALERT.SET_THRESHOLD
を使用してNULL
に設定することで、データベースのデフォルト値に戻すことができます。
データベースのデフォルトしきい値の変更
ローカルに管理されている表領域のデータベースのデフォルトしきい値を変更するには、前の例に示されているようにDBMS_SERVER_ALERT.SET_THRESHOLD
を起動しますが、object_name
をNULL
に設定します。データベースのデフォルトを使用するすべての表領域で、新しいデフォルトに切り替わります。
アラートを表示するには、Enterprise Manager Database Controlのホームページにアクセスします。
ローカル管理表領域のアラートは、DBA_OUTSTANDING_ALERTS
ビューを使用して表示することもできます。詳細は、「サーバー生成アラートのデータ・ディクショナリ・ビュー」を参照してください。
しきい値ベースのアラートには、次の制限があります。
アラートは、オフラインまたは読取り専用モードのローカル管理表領域については発行されません。ただし、それらの表領域が読取り/書込みモードまたは使用可能になると、そのアラート・システムは再アクティブ化されます。
表領域をオフライン化または読取り専用モードにする場合は、しきい値を0(ゼロ)に設定して、表領域に対するアラートを使用禁止にする必要があります。後で表領域を再度オンライン化または読取り/書込みモードにする場合は、しきい値を再設定してアラートを再び使用可能にできます。
関連項目:
|
Oracle Databaseでは、領域割当てが失敗した場合に大規模なデータベース処理を一時停止して、後で再開するための方法が提供されています。そのため、Oracle Databaseサーバーがユーザーにエラーを返すかわりに対処措置を講じることができます。エラー条件が訂正されると、一時停止していた処理が自動的に再開します。この機能のことを、再開可能領域割当てと呼びます。また、影響を受ける文のことを、再開可能文と呼びます。
この項の内容は次のとおりです。
この項では、再開可能領域割当ての概要について説明します。再開可能領域割当ての動作方法および問合せ文とエラー条件の具体的な定義方法について説明します。
再開可能領域割当ての動作の概要は、次のとおりです。詳細はこの後の各項で説明します。
文が再開可能モードで実行されるのは、その文のセッションが、次のいずれかの処理によって再開可能領域割当てに対応している場合のみです。
RESUMABLE_TIMEOUT初期化パラメータが0 (ゼロ)以外の値に設定されている場合に、ALTER SESSION ENABLE RESUMABLE
文が実行前にセッション内で発行された。
ALTER SESSION ENABLE RESUMABLE TIMEOUT
timeout_value
文が実行前にセッション内で発行され、timeout_value
が0 (ゼロ)以外の値である。
次のいずれかの条件が成立すると、再開可能文が一時停止します(非再開可能文では、これらの条件に対応するエラーが通知されます)。
領域不足条件
最大エクステント数到達条件
スペース割当制限超過条件。
再開可能文の実行が一時停止すると、ユーザー指定の操作の実行、エラーの記録および文の実行状態の問合せを行うメカニズムがただちに動作します。再開可能文が一時停止すると、次の処理が実行されます。
エラーがアラート・ログに記録されます。
一時停止された再開可能セッションのアラートが発行されます。
ユーザーがAFTER SUSPEND
システム・イベントに対してトリガーを登録していた場合は、そのユーザー・トリガーが実行されます。ユーザー指定のPL/SQLプロシージャは、DBMS_RESUMABLE
パッケージとDBA_RESUMABLE
またはUSER_RESUMABLE
ビューを使用して、エラー・メッセージ・データにアクセスできます。
文が中断されると、自動的にトランザクションも中断されます。その結果、すべてのトランザクション・リソースが文の一時停止から再開までの間保持されます。
ユーザーの介入や他の問合せによってソート領域が解放されるなどの結果としてエラー条件が解決されると、一時停止していた文が自動的に実行を再開し、一時停止された再開可能セッションのアラートがクリアされます。
一時停止した文は、DBMS_RESUMABLE.ABORT()
プロシージャを使用して、強制的に例外を発生できます。このプロシージャは、DBAまたは文を発行したユーザーがコールできます。
RESUMABLE_TIMEOUT
初期化パラメータまたはALTER
SESSION
ENABLE
RESUMABLE
TIMEOUT
文で指定された一時停止のタイムアウト間隔は、再開可能文に対応付けられています。タイムアウト間隔内にエラー条件が解決されない場合は、タイムアウト間隔の間一時停止していた再開可能文がリストアされ、ユーザーに例外が返されます。
再開可能文は、実行中に一時停止と再開を複数回繰り返すことができます。
再開可能な操作は、次のとおりです。
問合せ
一時領域(ソート領域)を使い果たしたSELECT
文は、再開可能な実行の候補になります。Oracle Call Interface(OCI)の使用時は、OCIStmtExecute()
およびOCIStmtFetch()
の各コールが候補になります。
DML
INSERT
文、UPDATE
文およびDELETE
文が候補になります。それらを実行するために使用するインタフェースは何でもかまいません。OCI、SQLJ、PL/SQLまたは別のインタフェースを使用できます。また、外部表からのINSERT INTO...SELECT
も再開可能にできます。
インポート/エクスポート
SQL*Loaderについては、リカバリ可能なエラーの後に文が再開可能かどうかをコマンドライン・パラメータで制御します。
DDL
次の文が、再開可能な実行の候補になります。
CREATE
TABLE
... AS
SELECT
CREATE
INDEX
ALTER
INDEX
... REBUILD
ALTER
TABLE
... MOVE
PARTITION
ALTER
TABLE
... SPLIT
PARTITION
ALTER
INDEX
... REBUILD
PARTITION
ALTER
INDEX
... SPLIT
PARTITION
CREATE
MATERIALIZED
VIEW
CREATE
MATERIALIZED
VIEW
LOG
訂正可能なエラーには、次の3つのクラスがあります。
領域不足条件
データベースの操作によって、表領域内の表、索引、一時セグメント、UNDOセグメント、クラスタ、LOB、表パーティションまたは索引パーティション用のエクステントをこれ以上取得できません。たとえば、次のエラーはこのカテゴリに属します。
ORA-01653 unable to extend table ... in tablespace ... ORA-01654 unable to extend index ... in tablespace ...
最大エクステント数到達条件
表、索引、一時セグメント、UNDOセグメント、クラスタ、LOB、表パーティションまたは索引パーティション内のエクステント数が、オブジェクトで定義されている最大エクステント数に等しくなりました。たとえば、次のエラーはこのカテゴリに属します。
ORA-01631 max # extents ... reached in table ... ORA-01632 max # extents ... reached in index ...
スペース割当制限超過条件
ユーザーが自分に割り当てられている表領域内のスペース割当制限を超過しました。具体的には、次のエラーによって示されます。
ORA-01536 space quote exceeded for tablespace string
分散環境で、ユーザーが再開可能領域割当てを有効または無効にした場合、またはDBAがRESUMABLE_TIMEOUT
初期化パラメータを変更した場合、その影響を受けるのはローカルのインスタンスです。RESUMABLE
はリモートで有効にできません。分散トランザクションで、リモート・インスタンスのセッションが一時停止されるのは、リモート・インスタンスがそのサイトでインスタンスまたはセッションに対してRESUMABLE
をすでに有効にしている場合のみです。
パラレル実行では、パラレル実行サーバー・プロセスの1つで訂正可能なエラーが発生した場合、そのサーバー・プロセスの実行が一時停止します。他のパラレル実行サーバー・プロセスでは、エラーが発生するまで、または一時停止したサーバー・プロセスに(直接または間接に)ブロックされるまで、個々のタスクの実行が継続されます。訂正可能なエラーが解決すると、一時停止したプロセスが実行を再開し、パラレル操作の実行は継続されます。一時停止したプロセスが終了した場合、パラレル操作は中断し、ユーザーに対してエラーが返されます。
異なるパラレル実行プロセスで、1つ以上の訂正可能なエラーが発生することがあります。この結果、AFTER SUSPEND
トリガーが複数回、パラレルに発行される場合があります。また、あるパラレル実行サーバー・プロセスが一時停止中に他のパラレル実行サーバー・プロセスで訂正不可能なエラーが発生すると、一時停止していた文はただちに強制終了します。
パラレル実行については、すべてのパラレル実行コーディネータとサーバー・プロセスがDBA_RESUMABLE
またはUSER_RESUMABLE
ビューに独自のエントリを持っています。
再開可能領域割当ては、再開可能モードを有効にしたセッションの中で文を実行するときのみ可能です。
再開可能領域割当てがセッションで有効になるのは、ALTER SESSION ENABLE RESUMABLE
文が実行され、そのセッションのRESUMABLE_TIMEOUT
初期化パラメータが0 (ゼロ)以外の値に設定されている場合です。RESUMABLE_TIMEOUT
初期化パラメータをシステム・レベルで設定すると、その設定は、タイムアウト値が指定されていないALTER SESSION ENABLE RESUMABLE
文のデフォルトになります。ALTER SESSION ENABLE RESUMABLE
文でタイムアウト値を指定すると、システム・デフォルトがオーバーライドされます。
ALTER SESSION ENABLE RESUMABLE
文を実行しても、次の場合はセッションで再開可能領域割当てが無効になります。
セッションでALTER SESSION ENABLE RESUMABLE
文が実行されない場合。
セッションでALTER SESSION DISABLE RESUMABLE
文が実行された場合。
セッションでALTER SESSION ENABLE RESUMABLE
文が実行され、タイムアウト値が0 (ゼロ)の場合。
注意: 一時停止した文はなんらかのシステム・リソースを保持している可能性があるため、ユーザーが再開可能領域割当てを有効にして、再開可能文を実行するには、RESUMABLE システム権限が付与されている必要があります。 |
RESUMABLE_TIMEOUT
初期化パラメータを設定して、デフォルトのシステム全体のタイムアウト間隔を指定できます。たとえば、初期化パラメータ・ファイルでRESUMABLE_TIMEOUT
パラメータを次のように設定すると、タイムアウト間隔は1時間に設定されます。
RESUMABLE_TIMEOUT = 3600
このパラメータが0 (ゼロ)に設定された場合、タイムアウト値を指定しないでALTER SESSION ENABLE RESUMABLE
文を実行するセッションでも、再開可能領域割当ては無効になります。
ALTER SYSTEM SET
文を使用して、このパラメータの値をシステム・レベルで変更することもできます。たとえば、次の文では、タイムアウト値を指定しないでALTER SESSION ENABLE RESUMABLE
文を実行するすべてのセッションに対して再開可能領域割当てを無効にします。
ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;
セッション内で、ユーザーはALTER SESSION SET
文を発行してRESUMABLE_TIMEOUT
初期化パラメータを設定し、再開可能領域割当てを有効にしてタイムアウト値を変更するか、または再開可能モードを無効にできます。
次のSQL文を使用して、デフォルトのシステムRESUMABLE_TIMEOUT
値でセッションの再開可能モードを有効化できます。
ALTER SESSION ENABLE RESUMABLE;
再開可能モードを無効化するには、次の文を使用します。
ALTER SESSION DISABLE RESUMABLE;
新しいセッションのデフォルトの再開可能モードは無効です。
タイムアウト間隔や、再開可能文の識別に使用する名前も指定できます。次の項では、各操作について説明します。
介入操作が発生しなかった場合に一時停止した文がエラーとなるタイムアウト間隔は、再開可能モードを有効化するときに指定できます。次の文は、再開可能トランザクションが3600秒後にタイムアウトし、エラーになることを指定します。
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;
TIMEOUT
の値は、別のALTER SESSION ENABLE RESUMABLE
文や他の手段によって変更されるまで、またはセッションが終了するまで有効です。RESUMABLE_TIMEOUT
初期化パラメータが設定されていない場合、ENABLE RESUMABLE TIMEOUT
句を使用して再開可能モードを有効にするときのデフォルトのタイムアウト間隔は7200秒になります。
再開可能文は、名前で識別するように設定できます。次の文は、再開可能文に名前を割り当てます。
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600 NAME 'insert into table';
NAME
の値は、別のALTER SESSION ENABLE RESUMABLE
文によって変更されるまで、またはセッションが終了するまで有効です。NAME
のデフォルト値は、'User
username
(userid
), Session
sessionid
, Instance
instanceid
'です。
文の名前は、DBA_RESUMABLE
ビューおよびUSER_RESUMABLE
ビューで再開可能文を識別する際に使用します。
RESUMABLE_TIMEOUT
初期化パラメータを設定する以外に、デフォルトの再開可能モードを設定するもう1つの方法は、データベース・レベルのLOGON
トリガーを登録して、再開可能を有効化してタイムアウト間隔を設定するように、ユーザーのセッションを変更する方法です。
注意: 再開可能文のデフォルトのモードとタイムアウトを変更する登録済トリガーが複数ある場合、その結果は予測できません。これは、トリガーの起動順序がOracle Databaseで保証されていないためです。 |
再開可能文が一時停止するとき、クライアントにはエラーは通知されません。訂正処理を実行するため、Oracle Databaseではユーザーにエラーを通知して状況に関する情報を提供するかわりの手段が提供されています。
再開可能文で訂正可能なエラーが発生すると、システムは内部的にAFTER SUSPEND
システム・イベントを生成します。ユーザーは、このイベントに対するトリガーをデータベース・レベルとスキーマ・レベルの両方で登録できます。ユーザーがこのシステム・イベントを処理するトリガーを登録した場合、トリガーはSQL文が一時停止した後に実行されます。
AFTER SUSPEND
トリガー内部で実行されたSQL文は、再開不可能であり、かつ自律型です。トリガー内部で開始されたトランザクションは、SYSTEM
ロールバック・セグメントを使用します。これらの条件が課されるのは、デッドロックを回避し、文と同じエラー条件に直面する可能性を少なくするためです。
ユーザーはUSER_RESUMABLE
ビュー、DBA_RESUMABLE
ビューまたはDBMS_RESUMABLE.SPACE_ERROR_INFO
ファンクションをトリガー内部で使用して、再開可能文に関する情報を取得できます。
また、トリガーではDBMS_RESUMABLE
パッケージをコールして、一時停止した文の終了や再開可能タイムアウト値の変更を実行できます。次の例では、DBMS_RESUMABLE
をコールしてタイムアウトを3時間に設定する、システム全体で有効なAFTER SUSPEND
トリガーを作成することによって、デフォルトのシステム・タイムアウトを変更します。
CREATE OR REPLACE TRIGGER resumable_default_timeout AFTER SUSPEND ON DATABASE BEGIN DBMS_RESUMABLE.SET_TIMEOUT(10800); END; /
関連項目: トリガーとシステム・イベントの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。 |
次のビューを問い合せることにより、再開可能文の状態に関する情報を取得できます。
ビュー | 説明 |
---|---|
DBA_RESUMABLE
|
これらのビューには、現在実行中または一時停止しているすべての再開可能文に関する行が含まれます。これらは、再開可能文の実行状態を監視したり、再開可能文に関する特定の情報を取得するために、DBA、AFTER SUSPEND トリガーまたは別のセッションが使用できます。 |
V$SESSION_WAIT |
ある文が一時停止すると、その文を起動したセッションは待機状態になります。このビューには、「文が一時停止され、エラーのクリアを待機しています」という内容のEVENT 列を持つセッションに対して1行が挿入されます。 |
関連項目: これらのビューに含まれる列の詳細は、『Oracle Databaseリファレンス』を参照してください。 |
DBMS_RESUMABLE
パッケージは、再開可能領域割当ての管理に役立ちます。次のプロシージャを起動できます。
プロシージャ | 説明 |
---|---|
ABORT(sessionID) |
このプロシージャは、一時停止した再開可能文を強制終了します。パラメータsessionID は、文が実行されているセッションIDです。パラレルDML/DDLの場合、sessionID はパラレルDML/DDLに参加している任意のセッションIDです。
Oracle Databaseでは、
|
GET_SESSION_TIMEOUT(sessionID) |
このファンクションは、sessionID を持つセッションで設定されている再開可能領域割当ての現行のタイムアウト値を返します。タイムアウトは秒数で返されます。セッションが存在しない場合、このファンクションは-1を返します。 |
SET_SESSION_TIMEOUT(sessionID, timeout) |
このプロシージャは、sessionID を持つセッションに対して再開可能領域割当てのタイムアウト間隔を設定します。パラメータtimeout の単位は秒数です。新しいtimeout 設定は、即時にセッションに適用されます。セッションが存在しない場合は何も起こりません。 |
GET_TIMEOUT() |
このファンクションは、現行セッションで設定されている再開可能領域割当ての現行のtimeout 値を返します。戻される値は秒で示されます。 |
SET_TIMEOUT(timeout) |
このプロシージャは、現行セッションに対して再開可能領域割当てのtimeout 値を設定します。パラメータtimeout の単位は秒数です。新しいタイムアウト設定はセッションに即時適用されます。 |
関連項目: DBMS_RESUMABLEパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 を参照してください。 |
再開可能セッションが一時停止されると、操作を完了するためにリソースを割り当てる必要があるオブジェクトに対して、操作一時停止アラートが発行されます。リソースが割り当てられて操作が完了すると、操作一時停止アラートはクリアされます。システム生成アラートの詳細は、「表領域のアラートの管理」を参照してください。
次の例では、システム全体で有効なAFTER SUSPEND
トリガーを作成し、ユーザーSYS
としてデータベース・レベルで登録します。任意のセッションで再開可能文が一時停止すると、このトリガーは次の2つのうちどちらかの処理を実行します。
UNDOセグメントが領域上限に達した場合は、メッセージがDBAに送られ、文が強制終了します。
他のリカバリ可能なエラーが発生した場合には、タイムアウト間隔が8時間にリセットされます。
この例で使用する文を次に示します。
CREATE OR REPLACE TRIGGER resumable_default AFTER SUSPEND ON DATABASE DECLARE /* declare transaction in this trigger is autonomous */ /* this is not required because transactions within a trigger are always autonomous */ PRAGMA AUTONOMOUS_TRANSACTION; cur_sid NUMBER; cur_inst NUMBER; errno NUMBER; err_type VARCHAR2; object_owner VARCHAR2; object_type VARCHAR2; table_space_name VARCHAR2; object_name VARCHAR2; sub_object_name VARCHAR2; error_txt VARCHAR2; msg_body VARCHAR2; ret_value BOOLEAN; mail_conn UTL_SMTP.CONNECTION; BEGIN -- Get session ID SELECT DISTINCT(SID) INTO cur_SID FROM V$MYSTAT; -- Get instance number cur_inst := userenv('instance'); -- Get space error information ret_value := DBMS_RESUMABLE.SPACE_ERROR_INFO(err_type,object_type,object_owner, table_space_name,object_name, sub_object_name); /* -- If the error is related to undo segments, log error, send email -- to DBA, and abort the statement. Otherwise, set timeout to 8 hours. -- -- sys.rbs_error is a table which is to be -- created by a DBA manually and defined as -- (sql_text VARCHAR2(1000), error_msg VARCHAR2(4000), -- suspend_time DATE) */ IF OBJECT_TYPE = 'UNDO SEGMENT' THEN /* LOG ERROR */ INSERT INTO sys.rbs_error ( SELECT SQL_TEXT, ERROR_MSG, SUSPEND_TIME FROM DBMS_RESUMABLE WHERE SESSION_ID = cur_sid AND INSTANCE_ID = cur_inst ); SELECT ERROR_MSG INTO error_txt FROM DBMS_RESUMABLE WHERE SESSION_ID = cur_sid and INSTANCE_ID = cur_inst; -- Send email to receipient through UTL_SMTP package msg_body:='Subject: Space Error Occurred Space limit reached for undo segment ' || object_name || on ' || TO_CHAR(SYSDATE, 'Month dd, YYYY, HH:MIam') || '. Error message was ' || error_txt; mail_conn := UTL_SMTP.OPEN_CONNECTION('localhost', 25); UTL_SMTP.HELO(mail_conn, 'localhost'); UTL_SMTP.MAIL(mail_conn, 'sender@localhost'); UTL_SMTP.RCPT(mail_conn, 'recipient@localhost'); UTL_SMTP.DATA(mail_conn, msg_body); UTL_SMTP.QUIT(mail_conn); -- Abort the statement DBMS_RESUMABLE.ABORT(cur_sid); ELSE -- Set timeout to 8 hours DBMS_RESUMABLE.SET_TIMEOUT(28800); END IF; /* commit autonomous transaction */ COMMIT; END; /
この項では、使用できない領域の再生方法を説明し、再生に使用できる領域があるセグメントを特定するためのOracle Databaseコンポーネントである、セグメント・アドバイザの概要も説明します。この章では、次の項目について説明します。
時間の経過とともに、表領域内のオブジェクトを更新および削除すると、新しいデータに対して個別に再利用するには不十分な小さい空き領域が作成されます。このような空き領域は、断片化された空き領域と呼ばれます。
オブジェクトに断片化された空き領域があると、結果的に多くの無駄な領域が生じ、データベースのパフォーマンスに影響を与える場合があります。断片化を解消して領域を再生するには、オンラインによるセグメントの縮小を実行することをお薦めします。このプロセスは、最高水位標の下の断片化された空き領域を統合し、セグメントを圧縮します。圧縮すると最高水位標が移動し、その結果、最高水位標の上に新しい空き領域ができます。その後、この最高水位標よりも上の領域は、割当て解除されます。セグメントは、この操作の開始から終了までの大半で、問合せおよびDMLを使用でき、特別なディスク領域の割当ては不要です。
オンラインによるセグメントの縮小で利点を得られるセグメントを特定するには、セグメント・アドバイザを使用します。セグメント・アドバイザは、自動セグメント領域管理(ASSM)を備えたローカル管理表領域のセグメントに対してのみ使用できます。調査可能なセグメントの種類については、他にも制限があります。詳細は、「オンラインによるデータベース・セグメントの縮小」を参照してください。
再生可能な領域を含む表がオンラインによるセグメントの縮小に適していない場合、または領域の再生中に表の論理属性または物理属性を変更する場合は、セグメントの縮小にかわる手段として、表のオンライン再定義を使用できます。オンライン再定義は再編成とも呼ばれます。オンライン再定義は、オンラインによるセグメントの縮小とは異なり、別のディスク領域を割り当てる必要があります。詳細は、「表のオンライン再定義」を参照してください。
セグメント・アドバイザは、再生に使用できる領域があるセグメントを特定します。自動ワークロード・リポジトリ(AWR)の使用状況と増加に関する統計情報が調べられ、セグメントのデータがサンプリングされて、分析が実行されます。メンテナンス・ウィンドウの間に自動化メンテナンス・タスクとして実行されるように構成されていますが、オンデマンド(手動)で実行することもできます。セグメント・アドバイザの自動化メンテナンス・タスクのことを、自動セグメント・アドバイザと呼びます。
セグメント・アドバイザは、次の種類のアドバイスを生成します。
セグメント・アドバイザにより、オブジェクトにかなりの量の空き領域があることが判断されると、オンラインによるセグメントの縮小が提案されます。自動セグメント領域管理のない表領域内の表の場合など、オブジェクトがセグメントの縮小に適さない表である場合は、オンラインによる表の再定義が提案されます。
OLTP圧縮方法を使用して表を圧縮することで効果が期待できるとセグメント・アドバイザが判断した場合、そのことを推奨事項として表示します。(自動セグメント・アドバイザの場合のみ。「自動セグメント・アドバイザを参照してください。)
セグメント・アドバイザにより、特定のしきい値を超える行連鎖のある表が検出されると、表に過剰な連鎖行があることが記録されます。
注意: セグメント・アドバイザによるフラグ設定の対象は、行を長くする更新によって生じた行連鎖のタイプのみです。 |
領域管理のアラートを受け取った場合、または領域の再生を決定した場合は、セグメント・アドバイザを開始してください。
セグメント・アドバイザを使用する手順
自動セグメント・アドバイザの結果を確認します。
自動セグメント・アドバイザを理解するには、この後の「自動セグメント・アドバイザ」を参照してください。結果の表示方法の詳細は、「セグメント・アドバイザの結果の表示」を参照してください。
(オプション)セグメント・アドバイザを手動で再実行し、個々のセグメントの更新結果を取得します。
この後の「手動によるセグメント・アドバイザの実行」を参照してください。
自動セグメント・アドバイザは、すべてのメンテナンス・ウィンドウ内で実行するように構成されている自動化メンテナンス・タスクです。
自動セグメント・アドバイザは、すべてのデータベース・オブジェクトを分析するわけではありません。かわりに、データベース統計を調査し、セグメント・データをサンプリングした後、次のような分析対象オブジェクトを選択します。
領域のクリティカルまたは警告のしきい値を超えた表領域
アクティビティが最も多いセグメント
増加率が最も高いセグメント
また、自動セグメント・アドバイザでは、OLTP圧縮方法で圧縮した場合に節約できる領域の大きさを判断するために、10MB以上で、索引が3つ以上存在する表が評価されます。
分析対象オブジェクトが選択されても、セグメント・アドバイザがオブジェクトを処理する前にメンテナンス・ウィンドウが終了する場合、そのオブジェクトは、自動セグメント・アドバイザの次回の実行に組み込まれます。
自動セグメント・アドバイザによって分析対象として選択された表領域とセグメントのセットは変更できません。ただし、自動セグメント・アドバイザのタスクの有効化または無効化、自動セグメント・アドバイザの実行予定回数、または自動化メンテナンス・タスクのシステム・リソース使用率は変更できます。詳細は、「自動セグメント・アドバイザの構成」を参照してください。
セグメント・アドバイザは、Enterprise ManagerまたはPL/SQLパッケージのプロシージャ・コールを使用して、いつでも手動で実行できます。セグメント・アドバイザを手動で実行する理由には、次のものがあります。
自動セグメント・アドバイザが選択しなかった表領域またはセグメントを分析するため。
個々の表領域またはセグメントを再度分析して、最新の推奨事項を入手するため。
セグメント・アドバイザには、3種類のレベルでアドバイスを要求できます。
セグメント・レベル: 非パーティション表、パーティション表のパーティションまたはサブパーティション、索引、またはLOB列など、単一のセグメントに対してアドバイスが生成されます。
オブジェクト・レベル: 表や索引など、オブジェクト全体についてアドバイスが生成されます。オブジェクトがパーティション化されている場合は、オブジェクトのすべてのパーティションに対してアドバイスが生成されます。また、Enterprise Managerからセグメント・アドバイザを手動で実行する場合は、表の索引やLOBセグメントなど、オブジェクトの依存オブジェクトについてアドバイスを要求できます。
表領域レベル: 表領域のすべてのセグメントに対してアドバイスが生成されます。
表19-2
にあるOBJECT_TYPE列は、アドバイスを要求できるオブジェクトのタイプを示しています。
Enterprise Managerを使用してセグメント・アドバイザを手動で実行するには、OEM_ADVISOR
ロールが付与されている必要があります。セグメント・アドバイザを実行するには、次の2つの方法があります。
セグメント・アドバイザ・ウィザードの使用
この方法を使用すると、表領域レベルまたはオブジェクト・レベルでアドバイスを要求できます。オブジェクト・レベルでは、表、索引、表パーティションおよび索引パーティションについてアドバイスを要求できます。
スキーマ・オブジェクトを表示するページでの「セグメント・アドバイザの実行」コマンドの使用。
たとえば、(「スキーマ」ページからアクセス可能な)「表」ページに表のリストを表示する場合は、表を選択して「アクション」メニューから「セグメント・アドバイザの実行」コマンドを選択します。
この方法では、スキーマ・オブジェクトの依存オブジェクトをセグメント・アドバイザの実行対象に含めることができます。たとえば、表を選択して「セグメント・アドバイザの実行」コマンドを選択すると、パーティション、索引セグメント、LOBセグメントなど、表の依存オブジェクトが表示されます。依存オブジェクトを選択することで、そのオブジェクトを実行対象に指定できます。
両方の場合に、Enterprise Managerは、Oracle Database Schedulerジョブとしてセグメント・アドバイザ・タスクを作成します。即座に実行するようにジョブをスケジュールすることも、スケジューラが提供する高度なスケジューリング機能を利用することもできます。
セグメント・アドバイザ・ウィザードを使用してセグメント・アドバイザを手動で実行する手順
データベース・ホームページから、「関連リンク」の下の「アドバイザ・セントラル」をクリックします。
「アドバイザ・セントラル」ページが表示されます。(図19-2を参照してください。)
「アドバイザ」の下の「セグメント・アドバイザ」をクリックします。
セグメント・アドバイザ・ウィザードの最初のページが表示されます。
セグメント・アドバイザのジョブをスケジュールするウィザードの各手順に従い、ウィザードの最終ページで「発行」をクリックします。
「アドバイザ・セントラル」ページが表示され、「結果」ヘッダーの下のリストの最初に新しいセグメント・アドバイザ・ジョブが表示されます。ジョブ・ステータスは、SCHEDULED
またはRUNNING
になります。(自分のジョブが表示されない場合は、リストの上の検索フィールドを使用して表示してください。)
ジョブのステータスをチェックします。COMPLETED
でない場合は、ページの上部にある「リフレッシュ」ボタンを繰り返しクリックします。(ブラウザのリフレッシュ・アイコンは使用しないでください。)
ジョブ・ステータスがCOMPLETED
に変わった場合は、「選択」列をクリックしてジョブを選択し、「結果の表示」をクリックします。
セグメント・アドバイザは、DBMS_ADVISOR
パッケージを使用して実行することもできます。パッケージ・プロシージャを使用してセグメント・アドバイザのタスクを作成し、タスクの引数を設定してからタスクを実行します。そのためには、ADVISOR
権限が必要です。表19-1に、セグメント・アドバイザに関連するプロシージャを示します。これらのプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
表19-1 セグメント・アドバイザに関連するDBMS_ADVISORパッケージ・プロシージャ
パッケージ・プロシージャ名 | 説明 |
---|---|
|
このプロシージャを使用して、セグメント・アドバイザのタスクを作成します。 |
|
このプロシージャを使用して、セグメント領域のアドバイス対象オブジェクトを識別します。このプロシージャのパラメータ値は、オブジェクト・タイプによって異なります。表19-2に、各オブジェクト・タイプのパラメータ値を示します。 注意: IOTオーバーフロー・セグメントについてアドバイスを要求するには、 select table_name, iot_name, iot_type from dba_tables; |
|
このプロシージャを使用して、必要なセグメント・アドバイスを指定します。表19-3に、このプロシージャに関連する入力パラメータを示します。リストされていないパラメータは、セグメント・アドバイザでは使用されません。 |
|
このプロシージャを使用して、セグメント・アドバイザのタスクを実行します。 |
表19-2 DBMS_ADVISOR.CREATE_OBJECTの入力
入力パラメータ | ||||
---|---|---|---|---|
OBJECT_TYPE | ATTR1 | ATTR2 | ATTR3 | ATTR4 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
|
|
|
|
未使用。 |
表19-3 DBMS_ADVISOR.SET_TASK_PARAMETERの入力
入力パラメータ | 説明 | 可能な値 | デフォルト値 |
---|---|---|---|
|
セグメント・アドバイザを実行する時間制限を秒単位で指定します。 |
任意の秒数。 |
|
|
セグメント・アドバイザですべてのセグメントについて結果を生成するかどうかを指定します。 |
|
|
例: 次の例は、DBMS_ADVISOR
プロシージャを使用して、サンプル表hr.employees
に対してセグメント・アドバイザを実行する方法を示しています。これらのパッケージ・プロシージャを実行するユーザーには、そのパッケージに対するオブジェクトのEXECUTE
権限、またはADVISOR
システム権限が必要です。
オブジェクト型TABLE
をDBMS_ADVISOR.CREATE_OBJECT
に渡すと、オブジェクト・レベルを要求したことになります。表がパーティション化されていない場合は、表セグメントが分析されます(索引またはLOBセグメントなどの依存セグメントは対象外です)。表がパーティション化されている場合は、すべての表パーティションが分析され、個別に結果と推奨事項が生成されます。
variable id number; begin declare name varchar2(100); descr varchar2(500); obj_id number; begin name:='Manual_Employees'; descr:='Segment Advisor Example'; dbms_advisor.create_task ( advisor_name => 'Segment Advisor', task_id => :id, task_name => name, task_desc => descr); dbms_advisor.create_object ( task_name => name, object_type => 'TABLE', attr1 => 'HR', attr2 => 'EMPLOYEES', attr3 => NULL, attr4 => NULL, attr5 => NULL, object_id => obj_id); dbms_advisor.set_task_parameter( task_name => name, parameter => 'recommend_all', value => 'TRUE'); dbms_advisor.execute_task(name); end; end; /
セグメント・アドバイザでは、様々な種類の結果(推奨事項、結果、処置、オブジェクト)が作成されます。次の方法で結果を表示できます。
Enterprise Managerの使用
DBA_ADVISOR_*
ビューの問合せ
DBMS_SPACE.ASA_RECOMMENDATIONS
プロシージャのコール
表19-4に、様々な種類の結果および関連するDBA_ADVISOR_*
ビューを示します。
表19-4 セグメント・アドバイザの結果の種類
結果の種類 | 関連するビュー | 説明 |
---|---|---|
推奨事項 |
|
セグメントの縮小、再編成または圧縮が効果的な場合は、そのセグメントに対して推奨事項が生成されます。表19-5に、生成される結果および推奨事項の例を示します。 |
結果 |
|
結果とは、分析対象のセグメントでセグメント・アドバイザが観察した内容のレポートです。結果には、分析対象の各セグメントの使用領域と空き領域の統計情報が含まれます。すべての結果が推奨事項になるわけではありません。(推奨事項は少数でも、多くの結果がある場合もあります。)セグメント・アドバイザをPL/SQLを使用して手動で実行する際に、 |
処置 |
|
すべての推奨事項は、セグメントの縮小、オンライン再定義(再編成)または圧縮の実施を提案する処置に関連付けられます。 |
オブジェクト |
|
すべての結果、推奨事項および処置はオブジェクトに関連付けられています。表領域やパーティション表の場合のように、複数のセグメントをセグメント・アドバイザが分析する場合、分析対象のセグメントごとに1つのエントリが |
関連項目:
|
Oracle Enterprise Managerでは、自動セグメント・アドバイザの実行とセグメント・アドバイザの手動実行の両方についてセグメント・アドバイザの結果を表示できます。次の種類の結果を表示できます。
すべての推奨事項(自動および手動によるセグメント・アドバイザの複数の実行)
自動セグメント・アドバイザの最新の実行での推奨事項
特定の実行での推奨事項
行連鎖の結果
自動セグメント・アドバイザの最新の実行で分析されたセグメントを一覧に表示することもできます。
Enterprise Managerを使用してセグメント・アドバイザの結果を表示する手順(すべての実行)
データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」タイトルの横の数値リンクをクリックします。
「セグメント・アドバイザ推奨」ページが表示されます。推奨事項は、表領域別に編成されます。
推奨事項が提示されている場合は、表領域を選択し、次に「推奨事項の詳細」をクリックします。
「推奨事項の詳細」ページが表示されます。このページから推奨事項アクティビティ(縮小または再編成)を開始できます。
注意: LOBなどのオブジェクトによっては、指定した「縮小」オプションを使用してサポートされません。かわりに、セグメント・アドバイザを使用して、再利用可能領域を確認し、縮小操作は手動で実行します。 |
ヒント: リストのエントリは、再生可能領域の大きい順にソートされています。列ヘッダーをクリックすると、ソート順を変更したり、昇順から降順に変更できます。 |
Enterprise Managerを使用してセグメント・アドバイザの結果を表示する手順(自動セグメント・アドバイザの最新の実行)
データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」タイトルの横の数値リンクをクリックします。
「セグメント・アドバイザ推奨」ページが表示されます。(図19-3を参照してください。)
「表示」リストで、「最後の自動実行からの推奨事項」を選択します。
推奨事項が提示されている場合は、表領域を選択し、「推奨事項の詳細」をクリックします。
「推奨事項の詳細」ページが表示されます。(図19-4を参照してください。)このページから推奨事項アクティビティ(縮小または再編成)を開始できます。
注意: LOBなどのオブジェクトによっては、指定した「縮小」オプションを使用してサポートされません。かわりに、セグメント・アドバイザを使用して、再利用可能領域を確認し、縮小操作は手動で実行します。 |
Enterprise Managerを使用してセグメント・アドバイザの結果を表示する手順(特定の実行)
「アドバイザ・セントラル」ページから開始します。
Enterprise Managerウィザードでセグメント・アドバイザを実行した場合は、セグメント・アドバイザのタスクを発行した後に「アドバイザ・セントラル」ページが表示されます。それ以外の場合は、データベース・ホームページの「関連リンク」の下にある「アドバイザ・セントラル」をクリックして、このページを表示します。
タスクが「結果」ヘッダーの下のリストに表示されていることを確認します。タスクがない場合は、次の手順を実行します(図19-2を参照)。
ページの「検索」セクションの「アドバイザ・タスク」の下にある「アドバイザ・タイプ」リストから「セグメント・アドバイザ」を選択します。
「アドバイザ実行」リストで、「すべて」または該当する期間を選択します。
(オプション)タスク名を入力します。
「実行」をクリックします。
「結果」セクションにセグメント・アドバイザのタスクが表示されます。
ジョブのステータスをチェックします。COMPLETED
でない場合は、ページの上部にある「リフレッシュ」ボタンを、タスクのステータスがCOMPLETED
になるまでクリックします。(ブラウザのリフレッシュ・アイコンは使用しないでください。)
タスク名をクリックします。
セグメント・アドバイザのタスクのページに、表領域別に編成された推奨事項が表示されます。
リストで表領域を選択して、「推奨事項の詳細」をクリックします。
「推奨事項の詳細」ページが表示されます。(図19-4を参照してください。)このページから推奨事項アクティビティ(縮小または再編成)を開始できます。
行連鎖の結果を表示する手順
データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」タイトルの横の数値リンクをクリックします。
「セグメント・アドバイザ推奨」ページが表示されます。(図19-3を参照してください。)
「関連リンク」ヘッダーの下にある「行チェーン分析」をクリックします。
「行チェーン分析」ページには、連鎖行があるすべてのセグメントと各連鎖行の割合が表示されます。
表19-5のヘッダーには、セグメント・アドバイザからの出力が表示されるDBA_ADVISOR_*
ビューの列が示されます。これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。この表に、考えられる出力の要約を示します。また、表19-2に、分析されたセグメントの情報が表示されるDBA_ADVISOR_OBJECTS
ビューの列を示します。
DBA_ADVISOR_*
ビューを問い合せる前に、DBA_ADVISOR_TASKS
のSTATUS
列を問い合せることで、セグメント・アドバイザのタスクが完了していることを確認できます。
select task_name, status from dba_advisor_tasks where owner = 'STEVE' and advisor_name = 'Segment Advisor'; TASK_NAME STATUS ------------------------------ ----------- Manual Employees COMPLETED
次の例は、ユーザーSTEVE
が発行したセグメント・アドバイザのすべての実行から結果を取得するために、DBA_ADVISOR_*
ビューを問い合せる方法を示しています。
select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message from dba_advisor_findings af, dba_advisor_objects ao where ao.task_id = af.task_id and ao.object_id = af.object_id and ao.owner = 'STEVE';
TASK_NAME SEGNAME PARTITION TYPE MESSAGE ------------------ ------------ --------------- ---------------- -------------------------- Manual_Employees EMPLOYEES TABLE The free space in the obje ct is less than 10MB. Manual_Salestable4 SALESTABLE4 SALESTABLE4_P1 TABLE PARTITION Perform shrink, estimated savings is 74444154 bytes. Manual_Salestable4 SALESTABLE4 SALESTABLE4_P2 TABLE PARTITION The free space in the obje ct is less than 10MB.
表19-5 セグメント・アドバイザの結果: 要約
DBA_ADVISOR_FINDINGSのMESSAGE列 | DBA_ADVISOR_FINDINGSのMORE_INFO列 | DBA_ADVISOR_RECOMMENDATIONSのBENEFIT_TYPE列 | DBA_ADVISOR_ACTIONSのATTR1列 |
---|---|---|---|
情報が不十分なため、推奨事項を作成できません。 |
- |
- |
- |
オブジェクト内の空き領域が10MB以下です。 |
割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx |
- |
- |
オブジェクト内には空き領域がありますが、...のため縮小できません。 |
割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx |
- |
- |
オブジェクト内の空き領域は前回のエクステントのサイズ未満です。 |
割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx |
- |
- |
xxxバイトの節約が予測されるため、縮小を実行してください。 |
割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx |
xxxバイトの節約が予測されるため、縮小を実行してください。 |
実行するコマンド。例: |
表schema.tableの行移動を有効にして縮小を実行してください。xxxバイトの節約が予測されるためです。 |
割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx |
表schema.tableの行移動を有効にして縮小を実行してください。xxxバイトの節約が予測されるためです。 |
実行するコマンド。例: |
オブジェクトobjectの再編成を実行してください。xxxバイトの節約が予測されるためです。 (注意: これは、オンラインによるセグメントの縮小に適していない再生可能な領域を持つオブジェクトに対する結果です。) |
割当領域: xxx: 使用領域: xxx: 再利用可能領域 : xxx |
オブジェクトobjectの再編成を実行してください。xxxバイトの節約が予測されるためです。 |
再編成の実行 |
オブジェクトには、再編成によって削除できる連鎖行があります。 |
xxパーセントの連鎖行を再編成で削除できます。 |
- |
- |
オブジェクトobject_nameを圧縮してください。xxxバイトの節約が予測されるためです。 (この結果は、自動セグメント・アドバイザによってのみ生成されます) |
オブジェクトobject_nameを圧縮してください。xxxバイトの節約が予測されるためです。 |
- |
実行するコマンド。例: この結果については、 |
DBMS_SPACE
パッケージのASA_RECOMMENDATIONS
プロシージャは、自動セグメント・アドバイザの実行およびセグメント・アドバイザの手動実行に対する結果や推奨事項を含むネストされた表オブジェクトを返します。このプロシージャでは、必要な結合がすべて実行され、使用しやすい形式で情報が返されるため、このプロシージャを呼び出す方が、DBA_ADVISOR_*
ビューで作業するより簡単な場合があります。
次の問合せは、自動セグメント・アドバイザの最新の実行による推奨事項と、推奨事項に従うための実行コマンドの例を戻します。
select tablespace_name, segment_name, segment_type, partition_name, recommendations, c1 from table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE')); TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE ------------------------------ ------------------------------ -------------- PARTITION_NAME ------------------------------ RECOMMENDATIONS ----------------------------------------------------------------------------- C1 ----------------------------------------------------------------------------- TVMDS_ASSM ORDERS1 TABLE PARTITION ORDERS1_P2 Perform shrink, estimated savings is 57666422 bytes. alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P2" shrink space TVMDS_ASSM ORDERS1 TABLE PARTITION ORDERS1_P1 Perform shrink, estimated savings is 45083514 bytes. alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P1" shrink space TVMDS_ASSM_NEW ORDERS_NEW TABLE Perform shrink, estimated savings is 155398992 bytes. alter table "STEVE"."ORDERS_NEW" shrink space TVMDS_ASSM_NEW ORDERS_NEW_INDEX INDEX Perform shrink, estimated savings is 102759445 bytes. alter index "STEVE"."ORDERS_NEW_INDEX" shrink space
DBMS_SPACE.ASA_RECOMMENDATIONSの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
自動セグメント・アドバイザは自動化メンテナンス・タスクの1つです。そのため、このタスクの実行時に変更を加える場合は、Enterprise ManagerまたはPL/SQLパッケージ・プロシージャ・コールを使用できます。適切なリソース・プランを変更することで、タスクに割り当てられているリソースを制御することもできます。
これらはPL/SQLパッケージ・プロシージャをコールして変更できますが、Enterprise Managerを使用するほうがさらに簡単です。
Enterprise Managerを使用して自動セグメント・アドバイザのタスクを構成する手順
ユーザーSYSTEM
でEnterprise Managerにログインします。
データベース・ホームページで、「領域サマリー」ヘッダーの下にある「セグメント・アドバイザ推奨」ラベルの横の数値リンクをクリックします。
「セグメント・アドバイザ推奨」ページが表示されます。
「関連リンク」ヘッダーの下にある「自動化メンテナンス・タスク」リンクをクリックします。
自動化メンテナンス・タスク・ページが表示されます。
「構成」をクリックします。
「自動化メンテナンス・タスク構成」ページが表示されます。
自動セグメント・アドバイザを完全に無効化するには、「タスク設定」の下にある「セグメント・アドバイザ」ラベルの横の「無効」を選択して、「適用」をクリックします。
特定のメンテナンス・ウィンドウの自動セグメント・アドバイザを無効化するには、「セグメント・アドバイザ」列の下の該当するチェック・ボックスの選択を解除し、「適用」をクリックします。
メンテナンス・ウィンドウの開始時間、終了時間および継続時間を変更するには、「ウィンドウ・グループの編集」をクリックします。
ウィンドウ・グループの編集ページが表示されます。メンテナンス・ウィンドウの名前をクリックして「編集」をクリックし、ウィンドウのスケジュールを変更します。
次のビューには、自動セグメント・アドバイザ固有の情報が表示されます。詳細は、『Oracle Databaseリファレンス』を参照してください。
ビュー | 説明 |
---|---|
DBA_AUTO_SEGADV_SUMMARY |
このビューには、各行に1件ずつ自動セグメント・アドバイザの実行が要約されます。フィールドには、処理された表領域やセグメントの数、および作成された推奨事項の件数が表示されます。 |
DBA_AUTO_SEGADV_CTL |
自動セグメント・アドバイザがセグメントの選択および処理に使用する制御情報が表示されます。各行には、単一のオブジェクト(表領域またはセグメント)に関する情報(オブジェクトが処理されたかどうか、処理された場合はオブジェクトを処理したタスクIDやその選択理由など)が格納されます。 |
Oracle Databaseセグメントの最高水位標の下の断片化された空き領域を再生するには、オンラインによるセグメントの縮小を使用します。セグメントの縮小の利点は、次のとおりです。
データの縮小はキャッシュ利用の向上につながります。つまり、オンライン・トランザクション処理(OLTP)のパフォーマンスが改善されます。
データが縮小されることで、全表スキャンを実行する際に必要なスキャン・ブロック数が少なくなります。つまり、意思決定支援システム(DSS)のパフォーマンスが改善されます。
セグメントの縮小は、オンラインで適切に機能する操作です。セグメント縮小のデータ移動フェーズでは、DML操作および問合せを発行できます。縮小操作の最後に領域が割当て解除される際は、短い時間ですが同時DML操作がブロックされます。索引は、縮小操作中も保持され、操作が完了した後も使用できます。セグメントの縮小では、余分なディスク領域の割当ては不要です。
セグメントの縮小では、最高水位標の上下両方の未使用領域を再生します。これに対して、領域の割当て解除では、最高水位標よりも上の未使用領域のみを再生します。縮小操作では、デフォルトの場合、セグメントを縮小して最高水位標を調整し、回復した領域が解放されます。
セグメントの縮小には、新しい位置への行の移動が必要です。したがって、最初に、縮小するオブジェクトの行を移動可能にし、オブジェクトに定義したROWIDベースのトリガーを無効にする必要があります。表内の行を移動可能にするには、ALTER
TABLE
... ENABLE
ROW
MOVEMENT
コマンドを使用します。
縮小操作は、自動セグメント領域管理(ASSM)を使用しているローカル管理表領域内のセグメントに対してのみ実行できます。ASSM表領域内では、次の表を除くすべてのセグメント・タイプがオンラインによるセグメントの縮小に適しています。
IOTマッピング表
ROWIDベースのマテリアライズド・ビューを備えた表
ファンクション索引がある表
SECUREFILE
LOB
圧縮表
関連項目: ALTER TABLEコマンドの詳細は、 『Oracle Database SQL言語リファレンス』 を参照してください。 |
オンラインによるセグメントの縮小の起動
オンラインによるセグメントの縮小を起動する前に、セグメント・アドバイザの結果および推奨事項を表示します。詳細は、「セグメント・アドバイザの使用」を参照してください。
Oracle Enterprise ManagerまたはSQL*PlusのSQLコマンドを使用して、オンラインによるセグメントの縮小を起動します。ここからは、コマンドラインによる方法について説明します。
表、索引構成表、索引、パーティション、サブパーティション、マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの領域を縮小できます。この縮小には、SHRINK SPACE
句を指定したALTER
TABLE
、ALTER
INDEX
、ALTER
MATERIALIZED
VIEW
文またはALTER
MATERIALIZED
VIEW
LOG
文を使用します。
次の2つの句を必要に応じて使用することで、縮小操作の処理方法を制御できます。
COMPACT
句を指定すると、セグメントの縮小操作を2つのフェーズに分割できます。COMPACT
を指定すると、Oracle Databaseはセグメント領域の断片化を解消して表の行を縮小しますが、将来のある時点まで最高水位標のリセットおよび領域の割当て解除を延期します。このオプションは、操作に影響される可能性がある長時間実行される問合せがあり、再生されたブロックから読取りが試行される場合に役立ちます。断片化解消および縮小の結果は、第2のフェーズでデータの移動をやり直す必要がないように、ディスクに保存されます。第2のフェーズを完了するには、オフピーク時にCOMPACT
句を指定せずにSHRINK SPACE
句を再度発行します。
CASCADE
句を指定すると、オブジェクトのすべての依存セグメントにセグメントの縮小操作が拡張されます。たとえば、表セグメントを縮小する際にCASCADE
を使用すると、表のすべての索引も縮小されます。(パーティション表のパーティションを縮小するためにCASCADE
を指定する必要はありません。)指定したオブジェクトの依存セグメントのリストを表示するには、DBMS_SPACE
パッケージのOBJECT_DEPENDENT_SEGMENTS
プロシージャを実行できます。
DDL操作と同様に、セグメントの縮小によって、後続のSQL文が再度解析されることになります。これは、COMPACT
句を指定しないかぎり、カーソルが無効になるためです。
例
表およびその依存セグメント(BASICFILE
LOBセグメントを含む)のすべてを縮小します。
ALTER TABLE employees SHRINK SPACE CASCADE;
BASICFILE
LOBセグメントのみを縮小します。
ALTER TABLE employees MODIFY LOB (perf_review) (SHRINK SPACE);
パーティション表の単一パーティションを縮小します。
ALTER TABLE customers MODIFY PARTITION cust_P1 SHRINK SPACE;
IOT索引セグメントとオーバーフロー・セグメントを縮小します。
ALTER TABLE cities SHRINK SPACE CASCADE;
IOTオーバーフロー・セグメントのみを縮小します。
ALTER TABLE cities OVERFLOW SHRINK SPACE;
関連項目:
|
未使用領域の割当てを解除する場合は、未使用の(最高水位標)データベース・セグメントの最後で未使用領域を解放して、表領域の他のセグメントで領域を使用できるようにします。
割当て解除の前に、セグメントの最高水位標の位置および未使用領域の量に関する情報を返す、DBMS_SPACEパッケージの
UNUSED_SPACE
プロシージャを実行できます。自動セグメント領域管理を備えたローカル管理表領域のセグメントの場合は、SPACE_USAGE
プロシージャを使用すると、未使用領域に関するより正確な情報が得られます。
関連項目: DBMS_SPACEパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 を参照してください。 |
次の文は、セグメント(表、索引またはクラスタ)内の未使用領域の割当てを解除します。
ALTER TABLE table DEALLOCATE UNUSED KEEP integer; ALTER INDEX index DEALLOCATE UNUSED KEEP integer; ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;
KEEP
句はオプションで指定でき、セグメントに保持される領域の量を指定できます。DBA_FREE_SPACE
ビューを調べることで、割当て解除された領域が開放されたことを確認できます。
関連項目:
|
Oracle Database 11g リリース2 (11.2.0.2)以降のDBMS_SPACE_ADMIN
パッケージにはDROP_EMPTY_SEGMENTS
プロシージャが含まれています。このプロシージャを使用すると、以前のリリースから移行された空の表およびパーティションのセグメントを削除できます。可能な場合には、索引セグメントなどの表の依存オブジェクトのセグメントもこれに含まれます。
次の例では、データベース内のすべての表から空のセグメントを削除しています。
BEGIN DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS(); END;
次は、HR.EMPLOYEES
表から依存オブジェクトを含め空のセグメントを削除しています。
BEGIN DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS( schema_name => 'HR', table_name => 'EMPLOYEES'); END;
このプロシージャには、11.2との互換性が必要です。
関連項目: このプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 |
表またはその他のデータ構造を作成する際には、必要となる領域の大きさを把握しておく必要があります。領域要件は、データ型ごとに異なります。『Oracle Database PL/SQL言語リファレンス』および『Oracle Database SQL言語リファレンス』には、データ型および領域要件の詳細な説明があります。
Oracle Databaseには、スキーマ・オブジェクトの領域使用に関する情報を表示するためのデータ・ディクショナリ・ビューとPL/SQLパッケージが用意されています。特定のスキーマ・オブジェクトに固有のビューとパッケージは、このマニュアルの各オブジェクトに関連した章に記載されています。ここでは、汎用的な性質を持ち、複数のスキーマ・オブジェクトに適用されるビューとパッケージについて説明します。
これらのDBMS_SPACE
サブプログラムを使用すると、スキーマ・オブジェクトに関する次の情報を取得できます。
関連項目: DBMS_SPACEパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 を参照してください。 |
次のSQL*Plusの例では、DBMS_SPACE
パッケージを使用して、未使用領域情報を取得しています。
SQL> VARIABLE total_blocks NUMBER SQL> VARIABLE total_bytes NUMBER SQL> VARIABLE unused_blocks NUMBER SQL> VARIABLE unused_bytes NUMBER SQL> VARIABLE lastextf NUMBER SQL> VARIABLE last_extb NUMBER SQL> VARIABLE lastusedblock NUMBER SQL> exec DBMS_SPACE.UNUSED_SPACE('SCOTT', 'EMP', 'TABLE', :total_blocks, - > :total_bytes,:unused_blocks, :unused_bytes, :lastextf, - > :last_extb, :lastusedblock); PL/SQL procedure successfully completed. SQL> PRINT TOTAL_BLOCKS ------------ 5 TOTAL_BYTES ----------- 10240 ... LASTUSEDBLOCK ------------- 3
次のビューには、スキーマ・オブジェクトの領域使用に関する情報が表示されます。
次に、これらのビューの使用例を示します。
関連項目: データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。 |
次の問合せは、スキーマhr
の各索引セグメントの名前とサイズを返します。
SELECT SEGMENT_NAME, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS FROM DBA_SEGMENTS WHERE SEGMENT_TYPE = 'INDEX' AND OWNER='HR' ORDER BY SEGMENT_NAME;
問合せ出力は、次のとおりです。
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS ------------------------- --------------- -------- ------ ------- COUNTRY_C_ID_PK EXAMPLE 65536 32 1 DEPT_ID_PK EXAMPLE 65536 32 1 DEPT_LOCATION_IX EXAMPLE 65536 32 1 EMP_DEPARTMENT_IX EXAMPLE 65536 32 1 EMP_EMAIL_UK EXAMPLE 65536 32 1 EMP_EMP_ID_PK EXAMPLE 65536 32 1 EMP_JOB_IX EXAMPLE 65536 32 1 EMP_MANAGER_IX EXAMPLE 65536 32 1 EMP_NAME_IX EXAMPLE 65536 32 1 JHIST_DEPARTMENT_IX EXAMPLE 65536 32 1 JHIST_EMPLOYEE_IX EXAMPLE 65536 32 1 JHIST_EMP_ID_ST_DATE_PK EXAMPLE 65536 32 1 JHIST_JOB_IX EXAMPLE 65536 32 1 JOB_ID_PK EXAMPLE 65536 32 1 LOC_CITY_IX EXAMPLE 65536 32 1 LOC_COUNTRY_IX EXAMPLE 65536 32 1 LOC_ID_PK EXAMPLE 65536 32 1 LOC_STATE_PROVINCE_IX EXAMPLE 65536 32 1 REG_ID_PK EXAMPLE 65536 32 1 19 rows selected.
データベース内に現在割り当てられているエクステントに関する情報は、DBA_EXTENTS
データ・ディクショナリ・ビューに格納されています。たとえば、次の問合せによって、hr
スキーマの各索引セグメントに割り当てられているエクステントとそれらのエクステントのサイズが識別されます。
SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, EXTENT_ID, BYTES, BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_TYPE = 'INDEX' AND OWNER='HR' ORDER BY SEGMENT_NAME;
問合せ出力は、次のとおりです。
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS ------------------------- ------------ --------------- --------- -------- ------ COUNTRY_C_ID_PK INDEX EXAMPLE 0 65536 32 DEPT_ID_PK INDEX EXAMPLE 0 65536 32 DEPT_LOCATION_IX INDEX EXAMPLE 0 65536 32 EMP_DEPARTMENT_IX INDEX EXAMPLE 0 65536 32 EMP_EMAIL_UK INDEX EXAMPLE 0 65536 32 EMP_EMP_ID_PK INDEX EXAMPLE 0 65536 32 EMP_JOB_IX INDEX EXAMPLE 0 65536 32 EMP_MANAGER_IX INDEX EXAMPLE 0 65536 32 EMP_NAME_IX INDEX EXAMPLE 0 65536 32 JHIST_DEPARTMENT_IX INDEX EXAMPLE 0 65536 32 JHIST_EMPLOYEE_IX INDEX EXAMPLE 0 65536 32 JHIST_EMP_ID_ST_DATE_PK INDEX EXAMPLE 0 65536 32 JHIST_JOB_IX INDEX EXAMPLE 0 65536 32 JOB_ID_PK INDEX EXAMPLE 0 65536 32 LOC_CITY_IX INDEX EXAMPLE 0 65536 32 LOC_COUNTRY_IX INDEX EXAMPLE 0 65536 32 LOC_ID_PK INDEX EXAMPLE 0 65536 32 LOC_STATE_PROVINCE_IX INDEX EXAMPLE 0 65536 32 REG_ID_PK INDEX EXAMPLE 0 65536 32 19 rows selected.
hr
スキーマの場合は、複数のエクステントが割り当てられているセグメントはありません。
データベース内の使用可能エクステント(どのセグメントにも割り当てられていないエクステント)に関する情報は、DBA_FREE_SPACE
データ・ディクショナリ・ビューに格納されています。たとえば、次の問合せは、SMUNDO
表領域内の使用可能エクステントとして使用可能な空き領域を示します。
SELECT TABLESPACE_NAME, FILE_ID, BYTES, BLOCKS FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='SMUNDO';
問合せ出力は、次のとおりです。
TABLESPACE_NAME FILE_ID BYTES BLOCKS --------------- -------- -------- ------ SMUNDO 3 65536 32 SMUNDO 3 65536 32 SMUNDO 3 65536 32 SMUNDO 3 65536 32 SMUNDO 3 65536 32 SMUNDO 3 65536 32 SMUNDO 3 131072 64 SMUNDO 3 131072 64 SMUNDO 3 65536 32 SMUNDO 3 3407872 1664 10 rows selected.
Oracle Databaseには、データベース・オブジェクトの容量を計画する方法が2つあります。
Enterprise Managerの使用
DBMS_SPACE
PL/SQLパッケージの使用
ここでは、PL/SQLによる方法について説明します。Enterprise Managerを使用した容量計画の詳細は、Enterprise Managerのオンライン・ヘルプおよび『Oracle Database 2日でデータベース管理者』を参照してください。
DBMS_SPACE
パッケージには、新しいオブジェクトのサイズを予測したり、既存のデータベース・オブジェクトのサイズを監視できる3つのプロシージャがあります。ここでは、これらのプロシージャについて説明します。この項の内容は、次のとおりです。
データベース表のサイズは、表領域の記憶域属性、表領域のブロック・サイズ、他の様々な要因によって大きく変化する可能性があります。DBMS_SPACE
パッケージのCREATE_TABLE_COST
プロシージャを使用すると、表を作成する際の領域使用コストを予測できます。このプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
プロシージャには、2つの異形があります。第1の異形は、行の平均サイズを使用してサイズを見積ります。第2の異形は、列情報を使用して表のサイズを見積ります。両方の異形ともに入力として次の値が必要です。
TABLESPACE_NAME
: オブジェクトが作成される表領域。デフォルトはSYSTEM
表領域です。
ROW_COUNT
: 表の予測行数。
PCT_FREE
: 更新の結果、既存の行を将来拡張するように各ブロックに確保する空き領域の割合(パーセンテージ)。
さらに、第1の異形には、AVG_ROW_SIZE
の値も入力する必要があります。値は、予測された行サイズの平均をバイト単位で指定します。
また、第2の異形には、予想された各列値をCOLINFOS
に指定する必要があります。この値は、属性COL_TYPE
(列のデータ型)とCOL_SIZE
(列の文字数またはバイト数)からなるオブジェクト型です。
このプロシージャでは、2つの値が戻ります。
USED_BYTES
: ブロック・メタデータ、PCT_FREE
領域などのオーバーヘッドを含め、データとして使用される実際のバイト数。
ALLOC_BYTES
: 表領域のエクステントの特性を考慮してオブジェクトに割り当てられる予測した領域の大きさ。
注意: Oracle Databaseのリリース11.2.0.2からは、パーティション表のすべての新規セグメントについて、第1エクステントのデフォルトのサイズが64KBではなく8MBになりました。このことは、パーティション表に対する挿入と問合せのパフォーマンス向上に役立ちます。パーティション表の初期サイズが大きくても、十分なデータが挿入されると、領域消費は以前のリリースと同じになります。このデフォルトは、表の記憶域句にINITIAL サイズを設定して上書きできます。この新しいデフォルトは、表パーティションおよびLOBパーティションにのみ適用されます。 |
DBMS_SPACE
パッケージのCREATE_INDEX_COST
プロシージャを使用すると、既存の表に索引を作成する際の領域使用コストを予測できます。
プロシージャには次の値を入力する必要があります。
DDL
: 索引を作成するCREATE INDEX
文。このDDL文に指定する表は、既存の表であることが必要です。
PLAN_TABLE
(オプション): 使用するPLAN TABLEの名前。デフォルトはNULL
です。
このプロシージャから戻る結果は、セグメントに対して収集された統計によって異なります。したがって、このプロシージャを実行する直前に必ず統計を取得してください。最近の統計がない状態でもエラーになりませんが、不適切な結果が戻る可能性があります。このプロシージャでは、次の値が戻ります。
USED_BYTES
: 実際の索引データを表すバイト数。
ALLOC_BYTES
: 表領域の索引に割り当てられる領域の大きさ。
DBMS_SPACE
パッケージ・プロシージャのOBJECT_GROWTH_TREND
関数では、特定の時点におけるオブジェクトの領域使用が各行に記述された1行以上の表が作成されます。この関数は、自動ワークロード・リポジトリから領域使用の合計を取得するか、現在の領域使用を計算して、自動ワークロード・リポジトリから取得した領域使用の変更履歴と結合します。この関数のパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
関数には次の値を入力する必要があります。
OBJECT_OWNER
: オブジェクトの所有者。
OBJECT_NAME
: オブジェクトの名前。
PARTITION_NAME
: 適切な場合は、表または索引パーティションの名前を指定します。それ以外の場合は、NULL
を指定します。
OBJECT_TYPE
: オブジェクトの種類。
START_TIME
: 増加傾向分析の開始を示すTIMESTAMP
値。
END_TIME
: 増加傾向分析の終了を示すTIMESTAMP
値。デフォルトはNOW
です。
INTERVAL
: 関数が領域使用情報を取得するレポート間隔の長さ(分単位)。
SKIP_INTERPOLATED
: INTERVAL
の前後に記録された統計情報に基づいて、この関数が値を除外する('YES
')かしない('NO
')かを決定します。要求したレポート作成間隔と実際の記録間隔がどのように関連しているかをより明確に表示できるため、チャートではなく表として結果表が表示される場合には、この設定が便利です。
この関数は、1つの間隔のオブジェクトの領域使用情報が各行に示された表を返します。返される表が非常に大きい場合は、情報が作成されると同時に別のアプリケーションが使用できるように結果がパイプライン化されます。出力表には次の列があります。
TIMEPOINT
: レポート間隔の時間を示すTIMESTAMP
値。
最も古いオブジェクトの記録統計よりも前のTIME
値の記録は作成されません。
SPACE_USAGE
: オブジェクト・データとして実際に使用されているバイト数。
SPACE_ALLOC
: その時点で表領域のオブジェクトに割り当てられていたバイト数。
QUALITY
: 要求されたレポート間隔と実際の統計記録が一致している程度を示す値。オブジェクト・サイズ使用統計には保証されているレポート間隔はなく、実際のレポート間隔は時間の経過およびオブジェクトによって変わるため、この情報が役立ちます。
QUALITY
列には、次の値が設定されます。
GOOD
: 記録されたタイムスタンプが入力パラメータに指定したINTERVAL
の10%以内で、TIME
の値が記録統計に常に基づいている場合。
INTERPOLATED
: 値はGOOD
の基準を満たしていないが、TIME
値の前後の記録統計に基づいている場合。現在のインメモリー統計は、クラスタ内のすべてのインスタンスで収集でき、現時点の記録値として取り扱うことができます。
PROJECTION
: 表が作成された時点ではTIME
値が未来であった場合。Oracle Real Application Clusters環境では、統計の記録ルールによって、どのオブジェクトが選択されるかを各インスタンスが独自に選択できるようになっています。
この関数から戻る出力は、Oracle RAC環境のすべてのインスタンスについて記録した値の集合です。各値は、GOOD
およびINTERPOLATED
値の組合せから計算できます。その値の少なくとも80%がGOOD
のインスタンス値から導出された場合、戻される集計値はGOOD
にマークされます。