48 CDBでのOracle Schedulerの使用
Oracle Schedulerを使用して、マルチテナント・コンテナ・データベース(CDB)でのジョブをスケジュールできます。
CDBでOracle Schedulerを使用する前に、次の要件を満たします。
-
CDBを構成および管理する方法について理解しています。概要および関連情報は、「マルチテナント環境の管理」を参照してください。
-
Oracle Schedulerを使用して非CDBでのジョブをスケジュールする方法を理解しています。詳細は、「Oracle Schedulerの概要」、「Oracle Schedulerを使用したジョブのスケジューリング」および「Oracle Schedulerの管理」を参照してください。
- CDBにおけるDBMS_SCHEDULERの起動
ほとんどのスケジューラは、2つのスケジューラ・グローバル属性を除き、非CDBで行っていたのとまったく同じ方法で作業を呼び出します。 - CDBにおけるジョブ・コーディネータおよびスレーブ・プロセス
CDB関連の主な変更は、ジョブ・コーディネータ・プロセスに対して行います。 - DBMS_JOBの使用方法
PDBでは、DBMS_JOB
を使用してジョブを作成でき、ジョブはこれまでと同様に機能します。ただし、DBMS_JOB
はサポートされなくなり、使用することはお薦めしません。Oracleは、Oracle Database 12cリリース2 (12.2)の後のバージョンで、DBMS_JOB
を完全に削除することを計画しています。DBMS_JOB
からDBMS_SCHEDULER
に切り替える必要があります。 - PDBをクローズするプロセス
IMMEDIATEオプションを指定してPDBがクローズされた場合、コーディネータはPDBで実行されているジョブを停止し、そのジョブを再度実行するにはリカバリする必要があります。 - 新規ビューおよび変更されたビュー
CDBでは、既存のビューに変更が加えられ、新しいビューが追加されました。
親トピック: マルチテナント環境の管理
48.1 CDBにおけるDBMS_SCHEDULERの起動
ほとんどのスケジューラは、2つのスケジューラ・グローバル属性を除き、非CDBで行っていたのとまったく同じ方法で作業を呼び出します。
ジョブ・スレーブを制限するには、JOB_QUEUE_PROCESSES
初期化パラメータの値を設定します。CDBルートで、JOB_QUEUE_PROCESSES
を、CDB全体で同時に使用できるジョブ・スレーブの最大数に設定します。CDBルートでJOB_QUEUE_PROCESSES
が0に設定されている場合、PDBレベルのJOB_QUEUE_PROCESSES
設定に関係なく、DBMS_JOBS
およびOracle SchedulerジョブはCDBルートで実行できません。PDBで、JOB_QUEUE_PROCESSES
を、PDBで同時に使用できるジョブ・スレーブの最大数に設定します。実際の数は、リソース・マネージャによって割り当てられたリソースと他のコンテナでの需要によって異なります。PDBでJOB_QUEUE_PROCESSES
が0の場合は、CDBルートでのJOB_QUEUE_PROCESSES
の設定にかかわらず、PDBでDBMS_JOBS
およびOracle Schedulerジョブを実行できません。
その他のすべてのグローバル属性設定については、プラガブル・データベース(PDB)レベルのみにする必要があります。たとえば、EMAIL_SENDER
属性をルート・データベースで設定する場合、その属性は、特定のPDBで実行されるジョブではなく、ルートで実行されるジョブに適用されます。新しいEMAIL_SENDER
をPDBに選択する場合は、そのPDBでグローバル属性を設定する必要があります。
親トピック: CDBでのOracle Schedulerの使用
48.2 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の使用
48.3 DBMS_JOBの使用
PDBでは、DBMS_JOB
を使用してジョブを作成でき、ジョブはこれまでと同様に機能します。ただし、DBMS_JOB
はサポートされなくなり、使用することはお薦めしません。Oracleは、Oracle Database 12cリリース2 (12.2)の後のバージョンで、DBMS_JOB
を完全に削除することを計画しています。DBMS_JOB
からDBMS_SCHEDULER
に切り替える必要があります。
スケジューラでは、実行するジョブを、以前のように単一データベースのみから選択するのではなく、それぞれの単一PDBからコーディネータで選択するようになりましたまた、スケジューラでは、スレーブはジョブを実行する前にPDBに切り替えますが、それ以外については、実質的にコードは変更されません。
関連項目:
親トピック: CDBでのOracle Schedulerの使用
48.4 PDBをクローズするプロセス
IMMEDIATEオプションを指定してPDBがクローズされた場合、コーディネータはPDBで実行されているジョブを停止し、そのジョブを再度実行するにはリカバリする必要があります。
Oracle RACデータベースでは、コーディネータは、ほとんどの場合、そのPDBがオープンしている別のインスタンスでジョブをリカバリできます。このため、最初のインスタンスのコーディネータは、PDBがまだオープンしている別のインスタンスを見つけることができた場合は、ジョブをそこに移動します。特定のケースでは、ジョブを別のインスタンスに移動できない場合があります。たとえば、対象のPDBがいずれの場所でもオープンしていない場合、ジョブは移動できません。また、別のインスタンスへのジョブの移動は、そのジョブにINSTANCE_ID
属性セットが指定されている場合は実行できません。この場合、ジョブはそのインスタンスでPDBが再びオープンされるまで実行できません。
Oracle RAC以外のケースでは、ジョブの移動が問題となることはありません。終了したジョブは、PDBが再度オープンされた後にのみリカバリできます。
親トピック: CDBでのOracle Schedulerの使用
48.5 新規ビューおよび変更されたビュー
CDBでは、既存のビューに変更が加えられ、新しいビューが追加されました。
詳細は、『Oracle Databaseリファレンス』を参照してください。
-
V$
ビューとGV
$ビューに列(CON_ID
)が追加され、この列により、特定のCDB_*
行が表すデータを持つコンテナが識別されます。非CDBでは、この列はNULL
です。 -
すべてのスケジューラ
DBA_*
ビューに対応するCDB_*
ビューがあります。PDBでは、これらのビューには対応する
DBA_* view
を介して表示可能なオブジェクトのみが表示されますが、ルート・データベースではすべてのオブジェクトを表示できます。CDB_*
ビューには、特定のDBA_*
ビューで見つかったすべての列および列(CON_ID
)が含まれています。非CDBでは、この列はNULL
です。
親トピック: CDBでのOracle Schedulerの使用