| Oracle Database 管理者ガイド 10gリリース2(10.2) B19224-02 |
|
Oracle Databaseには、Oracle Scheduler(スケジューラ)を使用した高度なジョブ・スケジューリング機能が用意されています。 この章では、スケジューラの概要について説明します。この章の内容は、次のとおりです。
組織には非常に多くのタスクがあり、その1つ1つを手動で処理するのはわずらわしいことです。これらの管理タスクを簡単に処理し、複雑なスケジューリングのニーズに対応した豊富な機能セットを提供するために、Oracleでは、DBMS_SCHEDULERパッケージでファンクションとプロシージャの集合を提供しています。これらの機能を総称してスケジューラと呼び、PL/SQLプログラムからコールできます。
スケジューラを使用すると、データベース管理者およびアプリケーション開発者は、データベース環境において様々なタスクをいつどこで実行するかを制御できます。これらのタスクは時間を要する複雑なタスクの場合があるため、スケジューラを使用すると、管理性および計画性の向上に役立ちます。また、多数の日常的なデータベース・タスクが手動で操作することなく確実に実行されるため、操作コストの削減、信頼性の高いルーチンの実現、人為的なエラーの最小化および必要期間の短縮が可能です。
次に、スケジューラを使用する一般的な例を示します。
スケジューラでは、複雑なエンタープライズ・スケジューリング機能が提供されます。次のことを実行できます。
ジョブ・スケジューラの最も基本的な機能は、特定の日時または特定のイベントが発生したときにジョブが実行されるようにスケジュールする機能です。スケジューラを使用すると、ジョブの実行をスケジュールできるため、操作コストを削減できます。たとえば、本番で使用されているデータベースにパッチを適用する必要がある場合について考えてみます。中断による影響を最小限に抑えるために、このタスクはオフピーク時に実行する必要があります。この処理は、スケジューラを使用すると簡単に実現できます。IT担当者にこのタスクをオフピーク時に手動で実行するよう指示するかわりに、スケジューラを使用して、ジョブを作成し、指定した時間にジョブが実行されるようにスケジュールできます。詳細は、「ジョブの作成」を参照してください。
スケジューラを使用すると、限られたコンピューティング資源を競合するジョブの間で適切に割り当てることができ、ビジネス・ニーズに基づいてジョブ処理を調整できます。これは次の方法で実現されます。
ジョブの作成から完了までの間には様々な状態があります。スケジューラのアクティビティはログに記録されるため、ジョブのステータスや最終の実行時間などの情報を簡単に追跡できます。この情報はビューに格納され、Enterprise ManagerまたはSQL問合せで簡単に問い合せることができます。このビューからジョブとその実行内容に関する有益な情報が得られるため、これを使用してジョブをより適切にスケジュールし管理することができます。たとえば、DBAはユーザーscottの失敗ジョブをすべて簡単に追跡できます。 「スケジューラの監視と管理」を参照してください。
クラスタは、同じタスクを実行するために連携して動作するデータベース・インスタンスのセットです。Oracle Real Application Clusters(RAC)は、アプリケーションを変更せずにスケーラビリティと信頼性を提供します。スケジューラは、このようなクラスタ化された環境でのジョブの実行を完全にサポートします。システムの負荷を均等にし、パフォーマンスを向上させるために、ジョブを実行するデータベース・サービスを指定することもできます。 詳細は、「Real Application Clusters環境におけるスケジューラの使用」を参照してください。
スケジューラでは、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種類のイベントがあります。
スケジューラは、スケジューラ自体で発生する状態の変更を示すためにイベントを呼び出します。たとえば、スケジューラは、ジョブの開始時、ジョブの完了時、ジョブがその割当ての実行時間を超えたときなどにイベントを呼び出します。イベントのコンシューマは、そのイベントに対応して処理を実行するアプリケーションです。
たとえば、システムの負荷が高いために、スケジュールされた開始時間から30分をすぎてもジョブが開始されない場合、スケジューラは、ハンドラのアプリケーションがデータベース管理者に電子メール通知を送信するイベントを呼び出すことができます。
アプリケーションは、スケジューラが使用するイベントを呼び出すことができます。スケジューラは、ジョブを開始することでこのイベントを処理します。スケジュールは、日付、時間、繰り返し発生する情報を定義するかわりに、イベントを参照するように作成できます。このようなスケジュール(イベント・スケジュール)に割り当てられたジョブは、イベントが呼び出されると実行されます。スケジュールの割当てを行わず、ジョブを開始するための手段としてイベントを直接参照するジョブを作成することもできます。
たとえば、在庫が一定のしきい値を下回ったことを感知した在庫追跡システムでは、在庫の補充ジョブを開始するイベントを呼び出すことができます。
スケジューラは、Oracle Streamsアドバンスト・キューイングを使用してイベントを呼び出して使用します。ジョブの状態の変更に関するイベントが発生すると、スケジューラは、メッセージをデフォルトのイベント・キューにエンキューします。アプリケーションは、このキューをサブスクライブし、イベント・メッセージをデキューして、適切な処理を行います。ジョブの開始をスケジューラに通知するイベントが発生すると、アプリケーションは、このジョブの設定時に指定したキューにメッセージをエンキューします。
|
関連項目
|
チェーンは、結合した1つの目的のために互いにリンクされたプログラムのグループです。チェーンとは、たとえば、「プログラムAを実行してからプログラムBを実行するが、プログラムCは、プログラムAとプログラムBの両方が正常に完了した場合のみ実行し、正常に完了しない場合はプログラムDを実行する」などがあります。スケジューラ・ジョブは、単一のプログラム・オブジェクトを指し示すかわりに、チェーンを指し示すことができます。
複数の相互依存プログラムのチェーン内にある各位置は、ステップと呼ばれます。通常は、最初の一連のチェーン・ステップを開始し、後続のステップは、1つ以上前のステップの完了に従って実行されます。各ステップは、次のいずれかを指し示すことができます。
チェーン内の複数のステップは、同じプログラムまたはネストしたチェーンを起動できます。
チェーンは、実行するステップと、ステップの実行時期の選択に関して多くの可能なパスを持ち、ある意味でDecision Treeに似ています。特定の段階で実行する処理を決定するために、ルールのリストが使用されます。ルールは、たとえば、「ステップ2またはステップ3が失敗した場合は、1時間待機してからステップ4を開始する」などです。
チェーンを指し示しているジョブの実行中は、実行しているチェーンのすべてのステップについて現在の状態を監視できます。
チェーンの作成が必要な典型的な状況として、正常な取引のために様々なプログラムの結合を必要とする金融取引などがあります。
詳細は、「チェーンの使用」を参照してください。
実行内容と実行時期を定義するには、プログラム、ジョブおよびスケジュール間に関連を割り当てます。図26-1に、これらの関連の例を示します。
図26-1を理解するために、表を分析する場合を考えてみます。この例では、P1が、DBMS_STATSパッケージを使用して表を分析するプログラムです。このプログラムには、表名に対する入力パラメータがあります。2つのジョブJ1とJ2は、両方とも同じプログラムを指し示していますが、別々の表名が指定されています。さらに、スケジュールS1には、毎日午前2時の実行時間を指定できます。最終的な結果として、J1とJ2で名前が指定された2つの表は、毎日午前2時に分析されます。
J4は、すべての関連情報がそのジョブ自体に定義された自己完結のジョブで、他のエンティティを指し示していないことに注意してください。P2、P9およびS2は、必要に応じて、プログラムまたはスケジュールに関連を割り当てないままにできることを示しています。たとえば、年度末の在庫を計算するプログラムを作成し、一時的に、そのプログラムをどのジョブにも割り当てないままにできます。
多数のスケジューラ機能を使用すると、データベース管理者はスケジューリングのさらに詳細な部分を制御できます。通常、これらのトピックは、アプリケーション開発者にとってはそれほど重要ではありません。
この項の内容は、次のとおりです。
ジョブ・クラスは、次の内容を実行します。
各ジョブ・クラスでは、ロギング・レベルなどの属性セットを指定します。ジョブをジョブ・クラスに割り当てると、そのジョブはこれらの属性を継承します。たとえば、全給与ジョブに対するログ・エントリのパージに関して、同じポリシーを指定できます。
ジョブ・クラスのservice属性を必要なデータベース・サービス名に設定できます。これによって、Real Application Clusters環境のインスタンスが決まります。このインスタンスは、メンバーのジョブを実行し、必要に応じて、メンバーのジョブに割り当てられたシステム・リソースを実行します。 詳細は、「スケジューラ使用時のサービス・アフィニティ」を参照してください。
各ジョブ・クラスでは、リソース・コンシューマ・グループを属性として指定できるため、ジョブ・クラスでは、データベース・リソース・マネージャとスケジューラ間のリンクが提供されます。このため、指定したコンシューマ・グループに属するメンバーのジョブには、現行のリソース・プランの設定に応じて、リソースが割り当てられます。
また、resource_consumer_group属性をNULLのままにし、ジョブ・クラスのservice属性を必要なデータベース・サービス名に設定できます。このサービスは、リソース・コンシューマ・グループにマップできます。
コンシューマ・グループへのサービスのマッピングの詳細は、第24章「データベース・リソース・マネージャの使用」を参照してください。
同じジョブ・クラス内では、個々のジョブに1〜5の優先順位値を割り当てることができます。このため、クラス内の2つのジョブが同時に開始するようにスケジュールされている場合は、優先順位の高いジョブが優先されます。この機能によって、重要度の高いジョブが時間どおりに完了するのを重要度の低いジョブが妨げることはありません。
2つのジョブに同じ優先値が割り当てられている場合は、開始日の早いジョブが優先されます。ジョブに優先順位が割り当てられていない場合、そのジョブの優先順位は3にデフォルト設定されます。
ジョブ・クラスの定義するときは、ジョブを機能別に分類してください。マーケティング、生産、販売、財務および人事など、同様のデータにアクセスするジョブをグループに分けることを考慮してください。
次の制限事項に注意してください。
DEFAULT_JOB_CLASSクラスのメンバーになります。
DEFAULT_JOB_CLASSクラスに割り当てられます。削除したクラスに属しているジョブの中ですでに実行中のジョブは、ジョブの開始時に判別されたクラスの設定のまま実行されます。
日または週などの様々な期間中にリソース割当てを変更するには、ウィンドウを作成します。ウィンドウは、午前12時〜午前6時など、開始と終了が明確に定義された期間で表されます。
ウィンドウは、ジョブ・クラスを使用して、リソース割当てを制御します。各ウィンドウは、ウィンドウがオープンしたとき(アクティブになったとき)に、アクティブにするリソース・プランを指定し、各ジョブ・クラスは、リソース・コンシューマ・グループを指定するか、コンシューマ・グループにマップできるデータベース・サービスを指定します。したがって、ウィンドウ内で実行するジョブには、そのジョブ・クラスのコンシューマ・グループとウィンドウのリソース・プランに応じてリソースが割り当てられます。
図26-2に、2つのウィンドウが設定された稼働日を示します。この構成では、コンシューマ・グループ1にリンクしているジョブ・クラスに属するジョブが、午後よりも午前にリソースを多く使用しています。コンシューマ・グループ2にリンクしているジョブ・クラスのジョブは、この逆です。
リソース・プランおよびコンシューマ・グループの詳細は、第24章「データベース・リソース・マネージャの使用」を参照してください。
各ウィンドウには、優先順位を割り当てることができます。ウィンドウが重複する場合は、優先順位の高いウィンドウが優先順位の低いウィンドウより優先して選択されます。スケジューラは、ウィンドウの開始時間と終了時間に従って、各ウィンドウを自動的にオープンしたり、クローズします。
ジョブは、そのschedule_name属性でウィンドウを指定できます。スケジューラは、このウィンドウがオープンするとジョブを開始します。ウィンドウがすでにオープンしている場合にそのウィンドウを指し示す新規ジョブが作成されると、そのジョブはウィンドウが次回オープンするまで開始されません。
ウィンドウの作成と使用については、「ウィンドウの作成」を参照してください。
|
注意
必要な場合は、現行のリソース・プランが切り替わらないように一時的にウィンドウをブロックできます。 詳細は、「データベース・リソース・マネージャの使用可能化」を参照するか、または『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の |
ジョブのスケジュールで、ウィンドウを使いやすいようにグループ化できます。ウィンドウ・グループを使用すると、1日あるいは1週間などの間に複数期間実行するジョブを簡単にスケジュールできます。ジョブのschedule_name属性をこのウィンドウ・グループの名前に設定すると、ウィンドウ・グループで指定したすべての期間で、このジョブを実行できます。
たとえば、「週末」という名前のウィンドウと「平日夜間」という名前のウィンドウがあり、この2つのウィンドウを「停止時間」という名前のウィンドウ・グループに追加するとします。データ・ウェアハウスの従業員は、この「停止時間」ウィンドウ・グループに従って、問合せを実行するジョブを作成できます。このウィンドウ・グループ(「平日夜間」と「週末」の時間帯)では、問合せに対して使用可能なリソースが高い比率で割り当てられる可能性があります。
ウィンドウ・グループのウィンドウがすでにオープンしているときに、そのウィンドウ・グループを指し示す新規ジョブが作成された場合、そのジョブはウィンドウ・グループの次のウィンドウがオープンするまで開始されません。
ウィンドウ・グループの作成例は、「ウィンドウ・グループの作成」を参照してください。
この項では、スケジューラのアーキテクチャについて説明します。この項の内容は、次のとおりです。
図26-3に、データベースによるジョブの処理方法を示します。
ジョブ表は、すべてのジョブに対するコンテナです。データベースごとに1つの表があります。ジョブ表には、すべてのジョブに関して、ロギング・レベルや所有者名などの情報が格納されます。この情報は*_SCHEDULER_JOBSビューで参照できます。
ジョブはデータベース・オブジェクトであるため、累積されて多くの領域を使用する場合があります。これを回避するために、ジョブ・オブジェクトは、ジョブの完了後、デフォルトで自動的に削除されます。この動作は、auto_dropジョブ属性によって制御されます。
使用可能なジョブのビューと管理については、「スケジューラ情報の表示方法」を参照してください。
ジョブ・コーディネータは、バックグラウンド・プロセス(cjqNNN)であり、ジョブの実行やウィンドウのオープンが必要なときに自動的に開始します。ジョブ・コーディネータは、スケジューラが非アクティブな状態を持続できる期間を経過すると、自動的に停止します。ジョブ・コーディネータの機能は次のとおりです。
CREATE_JOBプロシージャを使用してジョブが作成されたときに起動します。
ジョブ・コーディネータによるジョブ表のチェックの時期は、設定する必要はありません。期間はシステムによって自動的に選択されます。
インスタンスごとに1つのジョブ・コーディネータが使用されます。これは、RAC環境の場合も同じです。
|
関連項目
ジョブ・コーディネータの管理については、「スケジューラ情報の表示方法」を、RACの情報については、「Real Application Clusters環境におけるスケジューラの使用」を参照してください。 |
処理のためにジョブが取り出されると、ジョブ・スレーブは次のことを実行します。
ジョブ・スレーブは、発行されたジョブを実際に実行します。ジョブの実行時期になるとジョブ・コーディネータによって起動されます。ジョブ・スレーブは、ジョブ表からジョブを実行するためのメタデータを収集します。
ジョブが終了すると、スレーブは次のことを実行します。
スケジューラは、必要に応じてスレーブ・プールを動的にサイズ変更します。
Real Application Clusters(RAC)環境でのスケジューラでは、各データベースに対して1つのジョブ表が使用され、各インスタンスに対して1つのジョブ・コーディネータが使用されます。ジョブ・コーディネータは相互に通信し、情報を最新に保ちます。スケジューラは、ジョブ・クラスのジョブの負荷を均等にするように試みます。ジョブ・クラスにサービス・アフィニティがない場合は、使用可能なすべてのインスタンス間で負荷を均等にし、ジョブ・クラスにサービス・アフィニティがある場合は、特定のサービスに割り当てられたインスタンス間で負荷を均等にします。
図26-4に、典型的なRACアーキテクチャを示します。各インスタンスのジョブ・コーディネータは他のコーディネータと情報を交換します。
スケジューラを使用すると、ジョブを実行するデータベース・サービスを指定できます(サービス・アフィニティ)。この結果、インスタンス・アフィニティより可用性が向上します。これは、インスタンスが停止した場合に、そのサービスに他のノードが動的に割り当てられることが保証されるためです。インスタンス・アフィニティにはこの機能がないため、インスタンスが停止したときに、そのインスタンスに対するアフィニティを持つジョブはいずれも、インスタンスが回復するまで実行できません。図26-5は、サービスとインスタンスの典型的な使用例です。
図26-5では、サービスのプロパティが変更可能で、その変更はスケジューラによって自動的に認識されます。
各ジョブ・クラスで、データベース・サービスを指定できます。サービスの指定がない場合、このジョブ・クラスは、起動しているすべてのインスタンスへのマッピングが保証されている内部サービスに属します。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|