23 CDBでのOracle Schedulerの使用
Oracle Schedulerを使用して、マルチテナント・コンテナ・データベース(CDB)でのジョブをスケジュールできます。
CDBでOracle Schedulerを使用する前に、次の要件を満たします。
-
CDBを構成および管理する方法について理解しています。
-
Oracle Schedulerを使用して非CDBでのジョブをスケジュールする方法を理解しています。
- CDBにおけるDBMS_SCHEDULERの起動
ほとんどのスケジューラは、2つのスケジューラ・グローバル属性を除き、非CDBで行うのと同じ方法で作業を呼び出します。 - CDBにおけるジョブ・コーディネータおよびスレーブ・プロセス
CDB関連の主な変更は、ジョブ・コーディネータ・プロセスに対して行います。 - DBMS_JOBおよびDBMS_SCHEDULER
DBMS_JOB
ジョブを発行するスキーマにCREATE JOB
権限を付与する場合にのみ、PDBでDBMS_JOB
を使用できます。 - PDBをクローズするプロセス
IMMEDIATEオプションを指定してPDBがクローズされた場合、コーディネータはPDBで実行されているジョブを停止し、そのジョブを再度実行するにはリカバリする必要があります。 - 新規および変更されたCDBビュー
一部のCDBビューがCDBに固有であるのに対し、その他のCDBビューにはCDB固有の列があります。
親トピック: マルチテナント環境でのOracle機能の使用
CDBにおけるDBMS_SCHEDULERの起動
ほとんどのスケジューラは、2つのスケジューラ・グローバル属性を除き、非CDBで行うのと同じ方法で作業を呼び出します。
JOB_QUEUE_PROCESSES
初期化パラメータには、DBMS_JOB
ジョブおよびOracle Scheduler(DBMS_SCHEDULER
)ジョブの実行用に作成可能な、インスタンスごとのジョブ・スレーブの最大数を指定します。値の範囲は0
から4000
です(デフォルト)。
CDB環境でジョブ・スレーブを制限するには、次の場所でJOB_QUEUE_PROCESSES
を設定できます。
-
CDBルート
JOB_QUEUE_PROCESSES
を、スケジューラがデータベース・インスタンス全体で同時に使用できるスレーブ・プロセスの最大数に設定します。CDBルートで
JOB_QUEUE_PROCESSES
が0
の場合、PDBレベルのJOB_QUEUE_PROCESSES
設定に関係なく、DBMS_JOB
およびOracle SchedulerジョブはルートまたはPDBで実行できません。 -
PDB
JOB_QUEUE_PROCESSES
を、このPDBの同時ジョブの最大数に設定します。実際の数は、リソース・マネージャによって割り当てられたリソースと他のコンテナでの需要によって異なります。複数のPDBがジョブをリクエストすると、Oracle Schedulerは、すべてのPDBにかなりの数のプロセスを付与しようとします。PDBで
JOB_QUEUE_PROCESSES
が0
の場合、CDBルートのJOB_QUEUE_PROCESSES
設定に関係なく、DBMS_JOB
とOracle SchedulerジョブはこのPDBで実行できません。
すべてのグローバルOracle Scheduler属性をPDBレベルに設定する必要があります。たとえば、DBMS_SCHEDULER.SET_ATTRIBUTE
を使用してEMAIL_SENDER
属性をルート・データベースで設定する場合、その属性は、特定のPDBで実行されるジョブではなく、ルートで実行されるジョブに適用されます。新しいEMAIL_SENDER
をPDBに選択する場合は、このPDBでグローバル属性を設定する必要があります。
関連項目:
JOB_QUEUE_PROCESSES
についてさらに学習するには、Oracle Databaseリファレンスを参照してください
親トピック: CDBでのOracle Schedulerの使用
CDBにおけるジョブ・コーディネータおよびスレーブ・プロセス
CDB関連の主な変更は、ジョブ・コーディネータ・プロセスに対して行います。
非CDBでは、コーディネータは、実行準備が完了しているすべてのジョブを参照し、実行するそれらのジョブのサブセットを選択して、ジョブ・スレーブに割り当てます。また、ウィンドウをオープンおよびクローズし、これにより、データベースに対して有効なリソース・プランが変更されます。
このことは、次のことを除き、実質的に、CDB内で発生します。
-
ジョブがすべてのPDBから選択されます。
コーディネータは、ルート・データベースおよびすべての子PDBを参照し、ジョブの優先度、スケジュールされたジョブの開始時間、およびジョブを実行するためのリソースの可用性に基づいてジョブを選択します。後の基準は、ジョブのコンシューマ・グループ、および現在有効なリソース・プランによって異なります。コーディネータでは、すべてのPDBに対して公平になるようには処理しません。PDBのジョブでスタベーションが発生しないようにする唯一の方法は、十分なリソースをPDBに割り当てることです。
-
ウィンドウがPDBおよびルート・データベース・レベルでオープンします。
非CDBでは、特定の時点でオープンできるウィンドウは1つのみです。CDBには、2つのレベルのウィンドウがあります。PDBレベルでは、ウィンドウを使用して、そのPDBに属するコンシューマ・グループ間でリソースを割り当てるリソース・プランを設定できます。ルート・データベース・レベルでは、ウィンドウで異なるPDBにリソースを割り当てることができます。したがって、どの時点においても、ルート・データベースで1つのウィンドウがオープンし、各PDBで1つのウィンドウがオープンしている可能性があります。
-
ジョブ・スレーブは、そのジョブ・スレーブが属する特定のPDBに切り替えます。
ジョブ・スレーブは、実質的には非CDBでの場合と同じですが、スレーブがジョブを実行するとき、ジョブが属するPDBに切り替えた後で実行することが異なります。残りのコードは実質的に変更されていません。
親トピック: CDBでのOracle Schedulerの使用
DBMS_JOBおよびDBMS_SCHEDULER
DBMS_JOB
ジョブを発行するスキーマにCREATE JOB
権限を付与する場合にのみ、PDBでDBMS_JOB
を使用できます。
DBMS_JOB
インタフェースは、DBMS_SCHEDULER
を使用して実装されます。そのため、DBMS_JOB
からDBMS_SCHEDULER
に切り替えることをお薦めします。
スケジューラの場合、コーディネータは各PDBから実行するジョブを選択します。また、スケジューラの場合、スレーブ・プロセスはPDBに切り替えてからジョブを実行しますが、それ以外については、実質的にコードは変更されません。
関連項目:
DBMS_JOB
のサポートの詳細は、『Oracle Database管理者ガイド』を参照してください
親トピック: CDBでのOracle Schedulerの使用
PDBをクローズするプロセス
IMMEDIATEオプションを指定してPDBがクローズされた場合、コーディネータはPDBで実行されているジョブを停止し、そのジョブを再度実行するにはリカバリする必要があります。
Oracle RACデータベースでは、コーディネータは、ほとんどの場合、そのPDBがオープンしている別のインスタンスでジョブをリカバリできます。このため、最初のインスタンスのコーディネータは、PDBがまだオープンしている別のインスタンスを見つけることができた場合は、ジョブをそこに移動します。特定のケースでは、ジョブを別のインスタンスに移動できない場合があります。たとえば、対象のPDBがいずれの場所でもオープンしていない場合、ジョブは移動できません。また、別のインスタンスへのジョブの移動は、そのジョブにINSTANCE_ID
属性セットが指定されている場合は実行できません。この場合、ジョブはそのインスタンスでPDBが再びオープンされるまで実行できません。
Oracle RAC以外のケースでは、ジョブの移動が問題となることはありません。終了したジョブは、PDBが再度オープンされた後にのみリカバリできます。
親トピック: CDBでのOracle Schedulerの使用
新規および変更されたCDBビュー
一部のCDBビューがCDBに固有であるのに対し、その他のCDBビューにはCDB固有の列があります。
-
V$
およびGV$
ビューには、CDB_*
行が表すデータを含むコンテナを識別するCON_ID
列があります。非CDBでは、CON_ID
列はNULL
です。 -
CDB_*
ビューは、すべてのスケジューラのDBA_*
ビューに対応します。PDBでは、これらのビューには対応する
DBA_*
ビューを介して表示可能なオブジェクトのみが表示されますが、ルートにはすべてのオブジェクトが表示されます。CDB_*
ビューには、特定のDBA_*
ビューで見つかったすべての列および列(CON_ID
)が含まれています。非CDBでは、この列はNULL
です。
親トピック: CDBでのOracle Schedulerの使用