22 CDBでのOracle Schedulerの使用

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

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

  • CDBを構成および管理する方法について理解しています。

  • Oracle Schedulerを使用して非CDBでのジョブをスケジュールする方法を理解しています。

この章のトピックは、次のとおりです:

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_PROCESSES0の場合、PDBレベルのJOB_QUEUE_PROCESSES設定に関係なく、DBMS_JOBおよびOracle SchedulerジョブはルートまたはPDBで実行できません。

  • PDB

    JOB_QUEUE_PROCESSESを、このPDBの同時ジョブの最大数に設定します。実際の数は、リソース・マネージャによって割り当てられたリソースと他のコンテナでの需要によって異なります。複数のPDBがジョブをリクエストすると、Oracle Schedulerは、すべてのPDBにかなりの数のプロセスを付与しようとします。

    PDBでJOB_QUEUE_PROCESSES0の場合、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におけるジョブ・コーディネータおよびスレーブ・プロセス

CDB関連の主な変更は、ジョブ・コーディネータ・プロセスに対して行います。

非CDBでは、コーディネータは、実行準備が完了しているすべてのジョブを参照し、実行するそれらのジョブのサブセットを選択して、ジョブ・スレーブに割り当てます。また、ウィンドウをオープンおよびクローズし、これにより、データベースに対して有効なリソース・プランが変更されます。

このことは、次のことを除き、実質的に、CDB内で発生します。

  • ジョブがすべてのPDBから選択されます。

    コーディネータは、ルート・データベースおよびすべての子PDBを参照し、ジョブの優先度、スケジュールされたジョブの開始時間、およびジョブを実行するためのリソースの可用性に基づいてジョブを選択します。後の基準は、ジョブのコンシューマ・グループ、および現在有効なリソース・プランによって異なります。コーディネータでは、すべてのPDBに対して公平になるようには処理しません。PDBのジョブでスタベーションが発生しないようにする唯一の方法は、十分なリソースをPDBに割り当てることです。

  • ウィンドウがPDBおよびルート・データベース・レベルでオープンします。

    非CDBでは、特定の時点でオープンできるウィンドウは1つのみです。CDBには、2つのレベルのウィンドウがあります。PDBレベルでは、ウィンドウを使用して、そのPDBに属するコンシューマ・グループ間でリソースを割り当てるリソース・プランを設定できます。ルート・データベース・レベルでは、ウィンドウで異なるPDBにリソースを割り当てることができます。したがって、どの時点においても、ルート・データベースで1つのウィンドウがオープンし、各PDBで1つのウィンドウがオープンしている可能性があります。

  • ジョブ・スレーブは、そのジョブ・スレーブが属する特定のPDBに切り替えます。

    ジョブ・スレーブは、実質的には非CDBでの場合と同じですが、スレーブがジョブを実行するとき、ジョブが属するPDBに切り替えた後で実行することが異なります。残りのコードは実質的に変更されていません。

DBMS_JOBの使用

PDBでは、DBMS_JOBを使用してジョブを作成でき、ジョブはこれまでと同様に機能します。ただし、DBMS_JOBDBMS_SCHEDULERによって置き換えられました。

DBMS_JOBのサポートは、Oracle Databaseの今後のリリースで削除される可能性があります。そのため、DBMS_JOBからDBMS_SCHEDULERに切り替えることをお薦めします。

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

関連項目:

DBMS_JOBのサポートの詳細は、『Oracle Database管理者ガイド』を参照してください

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

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

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

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

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

一部のCDBビューがCDBに固有であるのに対し、その他のCDBビューにはCDB固有の列があります。

  • V$およびGV$ビューには、CDB_*行が表すデータを含むコンテナを識別するCON_ID列があります。非CDBでは、CON_ID列はNULLです。

  • CDB_*ビューは、すべてのスケジューラのDBA_*ビューに対応します。

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