48 CDBでのOracle Schedulerの使用

Oracle Schedulerを使用して、マルチテナント・コンテナ・データベース(CDB)でのジョブをスケジュールできます。

CDBでOracle Schedulerを使用する前に、次の要件を満たします。

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でグローバル属性を設定する必要があります。

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に切り替えた後で実行することが異なります。残りのコードは実質的に変更されていません。

48.3 DBMS_JOBの使用

PDBでは、DBMS_JOBを使用してジョブを作成でき、ジョブはこれまでと同様に機能します。ただし、DBMS_JOBはサポートされなくなり、使用することはお薦めしません。Oracleは、Oracle Database 12cリリース2 (12.2)の後のバージョンで、DBMS_JOBを完全に削除することを計画しています。DBMS_JOBからDBMS_SCHEDULERに切り替える必要があります。

スケジューラでは、実行するジョブを、以前のように単一データベースのみから選択するのではなく、それぞれの単一PDBからコーディネータで選択するようになりましたまた、スケジューラでは、スレーブはジョブを実行する前にPDBに切り替えますが、それ以外については、実質的にコードは変更されません。

関連項目:

DBMS_JOBのサポート

48.4 PDBをクローズするプロセス

IMMEDIATEオプションを指定してPDBがクローズされた場合、コーディネータはPDBで実行されているジョブを停止し、そのジョブを再度実行するにはリカバリする必要があります。

Oracle RACデータベースでは、コーディネータは、ほとんどの場合、そのPDBがオープンしている別のインスタンスでジョブをリカバリできます。このため、最初のインスタンスのコーディネータは、PDBがまだオープンしている別のインスタンスを見つけることができた場合は、ジョブをそこに移動します。特定のケースでは、ジョブを別のインスタンスに移動できない場合があります。たとえば、対象のPDBがいずれの場所でもオープンしていない場合、ジョブは移動できません。また、別のインスタンスへのジョブの移動は、そのジョブにINSTANCE_ID属性セットが指定されている場合は実行できません。この場合、ジョブはそのインスタンスでPDBが再びオープンされるまで実行できません。

Oracle RAC以外のケースでは、ジョブの移動が問題となることはありません。終了したジョブは、PDBが再度オープンされた後にのみリカバリできます。

48.5 新規ビューおよび変更されたビュー

CDBでは、既存のビューに変更が加えられ、新しいビューが追加されました。

詳細は、『Oracle Databaseリファレンス』を参照してください。

  • V$ビューとGV$ビューに列(CON_ID)が追加され、この列により、特定のCDB_*行が表すデータを持つコンテナが識別されます。非CDBでは、この列はNULLです。

  • すべてのスケジューラDBA_*ビューに対応するCDB_*ビューがあります。

    PDBでは、これらのビューには対応するDBA_* viewを介して表示可能なオブジェクトのみが表示されますが、ルート・データベースではすべてのオブジェクトを表示できます。CDB_*ビューには、特定のDBA_*ビューで見つかったすべての列および列(CON_ID)が含まれています。非CDBでは、この列はNULLです。