ヘッダーをスキップ

Oracle Database 管理者ガイド
10gリリース2(10.2)

B19224-02
目次
目次
索引
索引

戻る 次へ

26 スケジューラの概要

Oracle Databaseには、Oracle Scheduler(スケジューラ)を使用した高度なジョブ・スケジューリング機能が用意されています。 この章では、スケジューラの概要について説明します。この章の内容は、次のとおりです。

スケジューラの概要

組織には非常に多くのタスクがあり、その1つ1つを手動で処理するのはわずらわしいことです。これらの管理タスクを簡単に処理し、複雑なスケジューリングのニーズに対応した豊富な機能セットを提供するために、Oracleでは、DBMS_SCHEDULERパッケージでファンクションとプロシージャの集合を提供しています。これらの機能を総称してスケジューラと呼び、PL/SQLプログラムからコールできます。

スケジューラを使用すると、データベース管理者およびアプリケーション開発者は、データベース環境において様々なタスクをいつどこで実行するかを制御できます。これらのタスクは時間を要する複雑なタスクの場合があるため、スケジューラを使用すると、管理性および計画性の向上に役立ちます。また、多数の日常的なデータベース・タスクが手動で操作することなく確実に実行されるため、操作コストの削減、信頼性の高いルーチンの実現、人為的なエラーの最小化および必要期間の短縮が可能です。

次に、スケジューラを使用する一般的な例を示します。

スケジューラの機能

スケジューラでは、複雑なエンタープライズ・スケジューリング機能が提供されます。次のことを実行できます。

基本的なスケジューラの概要

スケジューラでは、Oracle環境内のタスクを管理するためにモジュール化された方法が提供されます。モジュール化の利点には、データベース環境の管理の容易さと、既存タスクに類似した新規タスクを作成する際のスケジューラ・オブジェクトの再利用性があります。

スケジューラでは、ほとんどの構成要素が表などのデータベース・オブジェクトであるため、標準のOracle権限を使用できます。

スケジューラの基本要素は次のとおりです。

プログラム

スケジューラ・プログラム・オブジェクトは、スケジューラによって実行される内容に関するメタデータの集合です。プログラム・オブジェクト名、プログラムの処理(例: プロシージャまたは実行可能ファイル名)、プログラム・タイプ(例: PL/SQLおよびJavaストアド・プロシージャまたはPL/SQL無名ブロック)およびプログラムに必要な引数の数などの情報が含まれます。

プログラムは、ジョブとは別個のエンティティです。ジョブは特定の時間または特定のイベントが発生した場合に実行されて、特定のプログラムを起動します。ジョブは、既存のプログラム・オブジェクトを指し示すように作成できます。これは、様々なジョブで同じプログラムを使用でき、そのプログラムを様々な時間に様々な設定で実行できることを意味します。したがって、適切な権限があれば、様々なユーザーが同じプログラムを再定義せずに使用できます。このため、ユーザーが既存プログラムのリストから選択できるプログラム・ライブラリの作成が可能です。

引数を必要とするストアド・プロシージャまたは他の実行可能ファイルを起動できるため、スケジューラ・プログラムには、これらの引数のデフォルト値をプログラム属性として格納する方法が用意されています。

プログラムの詳細は、「プログラムの作成」を、ジョブの概要は、「ジョブ」を参照してください。

スケジュール

スケジュールは、ジョブの実行時期と実行回数を指定します。ジョブは、後で処理するかまたは即時に処理するようにスケジュールできます。後で実行するジョブの場合、ユーザーはジョブの開始日時を指定できます。一定期間繰り返すジョブの場合は、スケジュールの終了時期を示す終了日時を指定できます。

スケジュールには、特定のイベントが発生したときに実行するジョブも指定できます。たとえば、バッジの読取り時や、在庫がしきい値を下回った場合などです。イベントの詳細は、「イベント」を参照してください。

プログラムと同様に、スケジュールは名前を付けてデータベースに保存できるオブジェクトです。名前付きのスケジュールは、複数のユーザーが共有できます。たとえば、業務上の四半期の終了時期は、多くのジョブにとって共通の期間である可能性があります。ジョブの作成者は、新規のジョブを定義するたびに四半期の終了時期のスケジュールを定義するかわりに、名前付きのスケジュールを指し示すことができます。

次に、時間ベースのジョブの制御に使用するスケジュールの例を示します。

詳細は、「スケジュールの作成」を参照してください。

ジョブ

ジョブは、1回以上実行するようにスケジュールされるユーザー定義タスクです。ジョブは、実行する必要がある内容(処理)と実行時期(スケジュール)の組合せです。適切な権限を持つユーザーは、次のいずれかの方法でジョブを作成できます。

プログラムやスケジュールと同様に、ジョブは名前を付けてデータベースに保存できるオブジェクトです。

ジョブ引数

名前付きのプログラム・オブジェクトをカスタマイズするには、ジョブ引数を指定します。ジョブ引数は、プログラム・オブジェクトのデフォルトの引数値を上書きし、デフォルト値がないプログラム引数に値を提供します。また、ジョブ引数は、ジョブが指定するインライン処理(例: ストアド・プロシージャ)に対しても引数値を提供できます。

必要なプログラム引数値のすべてが、参照先のプログラム・オブジェクトにデフォルトとして定義されているか、またはジョブ引数として定義されるまで、ジョブは使用できません。

ジョブの一般的な例に、一連のレポートを夜間に実行するジョブがあります。様々な部門で様々なレポートが必要な場合は、このタスクのプログラムを、様々な部門の様々なユーザー間で共有できるように作成できます。このプログラム処理では、レポート・スクリプトが実行され、プログラムには1つの引数として、部門番号を設定します。各ユーザーはこのプログラムを指し示すジョブを作成し、部門番号をジョブ引数として指定できます。

詳細は、「ジョブの作成」を参照してください。

ジョブ・インスタンス

ジョブ・インスタンスは、ジョブの特定の実行を表します。1回のみ実行するようにスケジュールされたジョブのインスタンスは1つのみです。繰返しスケジュールされたジョブには複数のインスタンスがあり、ジョブの各実行が1つのインスタンスを表します。たとえば、2002年10月8日、火曜日に実行されるようにスケジュールされたジョブのインスタンスは1つです。1週間毎日正午に実行されるジョブには7つのインスタンスがあり、ジョブの実行ごとに1つのインスタンスが対応します。

ジョブの作成時に、ジョブを表すためにスケジューラのジョブ表に追加されるエントリは1つのみです。ジョブが実行されるたびに、1つのエントリがジョブ・ログに追加されます。したがって、繰返しスケジュールのジョブを作成した場合、ジョブのビューには1つのエントリが、ジョブ・ログには複数のエントリが存在します。各ジョブ・インスタンスのログ・エントリでは、特定の実行に関して、ジョブの完了ステータス、開始時間と終了時間などの情報が提供されます。ジョブの各実行には一意のログIDが割り当てられます。このIDは、ジョブ・ログのビューとジョブ実行の詳細ビューの両方に使用されます。

詳細は、「スケジューラ情報の表示方法」を参照してください。

イベント

イベントは、なんらかの処理または発生が検出されたことを、アプリケーションまたはシステム・プロセスが別のアプリケーションまたはシステム・プロセスに示すために送信するメッセージです。イベントは、1つのアプリケーションまたはプロセスによって呼び出され(送信)、1つ以上のアプリケーションまたはプロセスによって使用されます(受信)。

スケジューラには、次の2種類のイベントがあります。

スケジューラは、Oracle Streamsアドバンスト・キューイングを使用してイベントを呼び出して使用します。ジョブの状態の変更に関するイベントが発生すると、スケジューラは、メッセージをデフォルトのイベント・キューにエンキューします。アプリケーションは、このキューをサブスクライブし、イベント・メッセージをデキューして、適切な処理を行います。ジョブの開始をスケジューラに通知するイベントが発生すると、アプリケーションは、このジョブの設定時に指定したキューにメッセージをエンキューします。

関連項目

  • アドバンスト・キューイングの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイドおよびリファレンス』を参照してください。

  • イベントの詳細は、「イベントの使用」を参照してください。

 

チェーン

チェーンは、結合した1つの目的のために互いにリンクされたプログラムのグループです。チェーンとは、たとえば、「プログラムAを実行してからプログラムBを実行するが、プログラムCは、プログラムAとプログラムBの両方が正常に完了した場合のみ実行し、正常に完了しない場合はプログラムDを実行する」などがあります。スケジューラ・ジョブは、単一のプログラム・オブジェクトを指し示すかわりに、チェーンを指し示すことができます。

複数の相互依存プログラムのチェーン内にある各位置は、ステップと呼ばれます。通常は、最初の一連のチェーン・ステップを開始し、後続のステップは、1つ以上前のステップの完了に従って実行されます。各ステップは、次のいずれかを指し示すことができます。

チェーン内の複数のステップは、同じプログラムまたはネストしたチェーンを起動できます。

チェーンは、実行するステップと、ステップの実行時期の選択に関して多くの可能なパスを持ち、ある意味でDecision Treeに似ています。特定の段階で実行する処理を決定するために、ルールのリストが使用されます。ルールは、たとえば、「ステップ2またはステップ3が失敗した場合は、1時間待機してからステップ4を開始する」などです。

チェーンを指し示しているジョブの実行中は、実行しているチェーンのすべてのステップについて現在の状態を監視できます。

チェーンの作成が必要な典型的な状況として、正常な取引のために様々なプログラムの結合を必要とする金融取引などがあります。

詳細は、「チェーンの使用」を参照してください。

プログラム、ジョブおよびスケジュールの関連

実行内容と実行時期を定義するには、プログラム、ジョブおよびスケジュール間に関連を割り当てます。図26-1に、これらの関連の例を示します。

図 26-1    プログラム、ジョブおよびスケジュール間の関連


画像の説明

図26-1を理解するために、表を分析する場合を考えてみます。この例では、P1が、DBMS_STATSパッケージを使用して表を分析するプログラムです。このプログラムには、表名に対する入力パラメータがあります。2つのジョブJ1J2は、両方とも同じプログラムを指し示していますが、別々の表名が指定されています。さらに、スケジュールS1には、毎日午前2時の実行時間を指定できます。最終的な結果として、J1J2で名前が指定された2つの表は、毎日午前2時に分析されます。

J4は、すべての関連情報がそのジョブ自体に定義された自己完結のジョブで、他のエンティティを指し示していないことに注意してください。P2P9およびS2は、必要に応じて、プログラムまたはスケジュールに関連を割り当てないままにできることを示しています。たとえば、年度末の在庫を計算するプログラムを作成し、一時的に、そのプログラムをどのジョブにも割り当てないままにできます。

高度なスケジューラの概要

多数のスケジューラ機能を使用すると、データベース管理者はスケジューリングのさらに詳細な部分を制御できます。通常、これらのトピックは、アプリケーション開発者にとってはそれほど重要ではありません。

この項の内容は、次のとおりです。

ジョブ・クラス

ジョブ・クラスは、次の内容を実行します。

ジョブ・クラスの定義するときは、ジョブを機能別に分類してください。マーケティング、生産、販売、財務および人事など、同様のデータにアクセスするジョブをグループに分けることを考慮してください。

次の制限事項に注意してください。

ウィンドウ

日または週などの様々な期間中にリソース割当てを変更するには、ウィンドウを作成します。ウィンドウは、午前12時〜午前6時など、開始と終了が明確に定義された期間で表されます。

ウィンドウは、ジョブ・クラスを使用して、リソース割当てを制御します。各ウィンドウは、ウィンドウがオープンしたとき(アクティブになったとき)に、アクティブにするリソース・プランを指定し、各ジョブ・クラスは、リソース・コンシューマ・グループを指定するか、コンシューマ・グループにマップできるデータベース・サービスを指定します。したがって、ウィンドウ内で実行するジョブには、そのジョブ・クラスのコンシューマ・グループとウィンドウのリソース・プランに応じてリソースが割り当てられます。

図26-2に、2つのウィンドウが設定された稼働日を示します。この構成では、コンシューマ・グループ1にリンクしているジョブ・クラスに属するジョブが、午後よりも午前にリソースを多く使用しています。コンシューマ・グループ2にリンクしているジョブ・クラスのジョブは、この逆です。

図 26-2    ジョブに割り当てるリソースの定義に役立つウィンドウ


画像の説明

リソース・プランおよびコンシューマ・グループの詳細は、第24章「データベース・リソース・マネージャの使用」を参照してください。

各ウィンドウには、優先順位を割り当てることができます。ウィンドウが重複する場合は、優先順位の高いウィンドウが優先順位の低いウィンドウより優先して選択されます。スケジューラは、ウィンドウの開始時間と終了時間に従って、各ウィンドウを自動的にオープンしたり、クローズします。

ジョブは、そのschedule_name属性でウィンドウを指定できます。スケジューラは、このウィンドウがオープンするとジョブを開始します。ウィンドウがすでにオープンしている場合にそのウィンドウを指し示す新規ジョブが作成されると、そのジョブはウィンドウが次回オープンするまで開始されません。

ウィンドウの作成と使用については、「ウィンドウの作成」を参照してください。


注意

必要な場合は、現行のリソース・プランが切り替わらないように一時的にウィンドウをブロックできます。 詳細は、「データベース・リソース・マネージャの使用可能化」を参照するか、または『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_RESOURCE_MANAGER.SWITCH_PLANパッケージ・プロシージャに関する説明を参照してください。 


ウィンドウ・グループ

ジョブのスケジュールで、ウィンドウを使いやすいようにグループ化できます。ウィンドウ・グループを使用すると、1日あるいは1週間などの間に複数期間実行するジョブを簡単にスケジュールできます。ジョブのschedule_name属性をこのウィンドウ・グループの名前に設定すると、ウィンドウ・グループで指定したすべての期間で、このジョブを実行できます。

たとえば、「週末」という名前のウィンドウと「平日夜間」という名前のウィンドウがあり、この2つのウィンドウを「停止時間」という名前のウィンドウ・グループに追加するとします。データ・ウェアハウスの従業員は、この「停止時間」ウィンドウ・グループに従って、問合せを実行するジョブを作成できます。このウィンドウ・グループ(「平日夜間」と「週末」の時間帯)では、問合せに対して使用可能なリソースが高い比率で割り当てられる可能性があります。

ウィンドウ・グループのウィンドウがすでにオープンしているときに、そのウィンドウ・グループを指し示す新規ジョブが作成された場合、そのジョブはウィンドウ・グループの次のウィンドウがオープンするまで開始されません。

ウィンドウ・グループの作成例は、「ウィンドウ・グループの作成」を参照してください。

スケジューラのアーキテクチャ

この項では、スケジューラのアーキテクチャについて説明します。この項の内容は、次のとおりです。

図26-3に、データベースによるジョブの処理方法を示します。

図 26-3    スケジューラの構成要素


画像の説明

ジョブ表

ジョブ表は、すべてのジョブに対するコンテナです。データベースごとに1つの表があります。ジョブ表には、すべてのジョブに関して、ロギング・レベルや所有者名などの情報が格納されます。この情報は*_SCHEDULER_JOBSビューで参照できます。

ジョブはデータベース・オブジェクトであるため、累積されて多くの領域を使用する場合があります。これを回避するために、ジョブ・オブジェクトは、ジョブの完了後、デフォルトで自動的に削除されます。この動作は、auto_dropジョブ属性によって制御されます。

使用可能なジョブのビューと管理については、「スケジューラ情報の表示方法」を参照してください。

ジョブ・コーディネータ

ジョブ・コーディネータは、バックグラウンド・プロセス(cjqNNN)であり、ジョブの実行やウィンドウのオープンが必要なときに自動的に開始します。ジョブ・コーディネータは、スケジューラが非アクティブな状態を持続できる期間を経過すると、自動的に停止します。ジョブ・コーディネータの機能は次のとおりです。

ジョブ・コーディネータによるジョブ表のチェックの時期は、設定する必要はありません。期間はシステムによって自動的に選択されます。

インスタンスごとに1つのジョブ・コーディネータが使用されます。これは、RAC環境の場合も同じです。

関連項目

ジョブ・コーディネータの管理については、「スケジューラ情報の表示方法」を、RACの情報については、「Real Application Clusters環境におけるスケジューラの使用」を参照してください。 

ジョブの実行方法

処理のためにジョブが取り出されると、ジョブ・スレーブは次のことを実行します。

  1. ジョブの実行に必要なすべてのメタデータを収集します。例として、プログラムの引数および権限情報があります。

  2. ジョブの所有者としてデータベース・セッションを開始し、トランザクションを開始した後に、ジョブの実行を開始します。

  3. ジョブが完了すると、スレーブはトランザクションをコミットし、終了します。

  4. セッションをクローズします。

ジョブ・スレーブ

ジョブ・スレーブは、発行されたジョブを実際に実行します。ジョブの実行時期になるとジョブ・コーディネータによって起動されます。ジョブ・スレーブは、ジョブ表からジョブを実行するためのメタデータを収集します。

ジョブが終了すると、スレーブは次のことを実行します。

スケジューラは、必要に応じてスレーブ・プールを動的にサイズ変更します。

Real Application Clusters環境におけるスケジューラの使用

Real Application Clusters(RAC)環境でのスケジューラでは、各データベースに対して1つのジョブ表が使用され、各インスタンスに対して1つのジョブ・コーディネータが使用されます。ジョブ・コーディネータは相互に通信し、情報を最新に保ちます。スケジューラは、ジョブ・クラスのジョブの負荷を均等にするように試みます。ジョブ・クラスにサービス・アフィニティがない場合は、使用可能なすべてのインスタンス間で負荷を均等にし、ジョブ・クラスにサービス・アフィニティがある場合は、特定のサービスに割り当てられたインスタンス間で負荷を均等にします。

図26-4に、典型的なRACアーキテクチャを示します。各インスタンスのジョブ・コーディネータは他のコーディネータと情報を交換します。

図 26-4    RACのアーキテクチャとスケジューラ


画像の説明

スケジューラ使用時のサービス・アフィニティ

スケジューラを使用すると、ジョブを実行するデータベース・サービスを指定できます(サービス・アフィニティ)。この結果、インスタンス・アフィニティより可用性が向上します。これは、インスタンスが停止した場合に、そのサービスに他のノードが動的に割り当てられることが保証されるためです。インスタンス・アフィニティにはこの機能がないため、インスタンスが停止したときに、そのインスタンスに対するアフィニティを持つジョブはいずれも、インスタンスが回復するまで実行できません。図26-5は、サービスとインスタンスの典型的な使用例です。

図 26-5    サービス・アフィニティとスケジューラ


画像の説明

図26-5では、サービスのプロパティが変更可能で、その変更はスケジューラによって自動的に認識されます。

各ジョブ・クラスで、データベース・サービスを指定できます。サービスの指定がない場合、このジョブ・クラスは、起動しているすべてのインスタンスへのマッピングが保証されている内部サービスに属します。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引