ヘッダーをスキップ
Oracle® Database管理者ガイド
11gリリース2 (11.2)
B56301-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

30 Oracle Schedulerの管理

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


注意:

この章では、DBMS_SCHEDULERパッケージを使用してOracle Schedulerを管理する方法について説明します。同じ多数の作業をOracle Enterprise Managerを使用して実行できます。

DBMS_SCHEDULERの詳細は『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を、Oracle Schedulerの各ページの詳細はOracle Enterprise Managerのオンライン・ヘルプを参照してください。


Oracle Schedulerの構成

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

Oracle Schedulerの権限の構成

Oracle Schedulerのすべての管理タスクを実行するには、SCHEDULER_ADMINロールが必要です。通常、データベース管理者(DBA)は、DBAロールの一部として、ADMINオプション付きでこのロールをすでに持っています。たとえば、ユーザーSYSおよびSYSTEMには、DBAロールが付与されます。このロールは、次の文を発行して別の管理者に付与できます。

GRANT SCHEDULER_ADMIN TO username;

SCHEDULER_ADMINロールは、権限を付与されたユーザーがコードを任意のユーザーとして実行できる強力なロールであるため、かわりにスケジューラの個々のシステム権限を付与することを考慮してください。オブジェクト権限とシステム権限は、標準的なSQL権限付与構文を使用して付与されます。例として、データベース管理者が次の文を発行したとします。

GRANT CREATE JOB TO scott;

この文が実行されると、scottは、自分のスキーマ内にジョブ、スケジュール、プログラム、File Watcherおよび資格証明を作成できます。別の例として、データベース管理者が次の文を発行したとします。

GRANT MANAGE SCHEDULER TO adam;

この文が実行されると、adamは、ウィンドウ、ジョブ・クラスまたはウィンドウ・グループを、作成、変更または削除できます。また、スケジューラ属性の設定と検索、およびスケジューラ・ログのパージもできます。

チェーンの各権限の設定

スケジューラ・チェーンでは、基礎となるOracle Streamsルール・エンジン・オブジェクトと、それに関連する権限を使用します。ユーザーが自分のスキーマにチェーンを作成するには、自分のスキーマにルール、ルール・セットおよび評価コンテキストを作成するためのルール・エンジン権限に加え、CREATE JOB権限が必要です。これらの権限は、次の文を発行することで付与できます。

GRANT CREATE RULE, CREATE RULE SET, CREATE EVALUATION CONTEXT TO user;

ユーザーが、別のスキーマにチェーンを作成するには、自分のスキーマ以外のスキーマにルール、ルール・セットおよび評価コンテキストを作成するためのルール・エンジン権限に加え、CREATE ANY JOB権限が必要です。これらの権限は、次の文を発行することで付与できます。

GRANT CREATE ANY RULE, CREATE ANY RULE SET, 
   CREATE ANY EVALUATION CONTEXT TO user;

各自のスキーマ以外のスキーマのチェーンを変更または削除するには、ルール、ルール・セットおよび評価コンテキストについて、対応する各システムのルール・エンジン権限が必要です。


関連項目:

チェーンの権限の詳細は、「チェーンのタスクとそのプロシージャ」を参照してください。

スケジューラのプリファレンスの設定

システム全体にわたる設定可能なスケジューラのプリファレンスがいくつかあります。SET_SCHEDULER_ATTRIBUTEプロシージャでスケジューラの属性を設定することにより、これらのプリファレンスを設定できます。これらの属性を設定するには、MANAGE SCHEDULER権限が必要です。属性は次のとおりです。

  • default_timezone

    この属性を設定することは非常に重要です。カレンダ構文式を使用する繰返しジョブおよびウィンドウには、繰返し間隔に使用するタイムゾーンに関する情報が必要です。「スケジューラのカレンダ指定構文の使用方法」を参照してください。通常は、start_dateからタイムゾーンを取得しますが、start_dateが指定されていない場合(珍しいことではありません)は、default_timezone Scheduler属性から取得します。

    スケジューラは、default_timezoneの値をオペレーティング・システム環境から導出します。オペレーティング・システムから互換性のある値を検出できない場合、スケジューラはdefault_timezoneNULLに設定します。

    default_timezoneが正しく設定されていることを確認することは非常に重要であり、そうでない場合は正しく設定してください。これを確認するには、次の問合せを実行します。

    SELECT DBMS_SCHEDULER.STIME FROM DUAL;
     
    STIME
    ---------------------------------------------------------------------------
    14-OCT-04 02.56.03.206273000 PM US/PACIFIC
    

    確実に夏時間が適用されるようにするには、default_timezoneを、'-8:00'のような絶対タイム・ゾーン・オフセットではなく、リージョン名に設定することをお薦めします。たとえば、データベースが米国フロリダ州のマイアミにある場合は、次の文を発行します。

    DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone','US/Eastern');
    

    同様に、データベースがパリにある場合は、この属性を'Europe/Warsaw'に設定します。有効なリージョン名のリストを表示するには、次の問合せを実行します。

    SELECT DISTINCT TZNAME FROM V$TIMEZONE_NAMES;
    

    default_timezone属性を適切に設定しないと、繰返しジョブや繰返しウィンドウに使用されるデフォルトのタイム・ゾーンは、SYSTIMESTAMPから取り出される絶対オフセット(データベースのオペレーティング・システム環境のタイム・ゾーン)となります。これは、start_dateが設定されていない繰返しジョブや繰返しウィンドウでは、夏時間調整が適用されないことになります。

  • email_server

    この属性には、ジョブの状態イベントに対する電子メール通知を送信するためにスケジューラで使用されるSMTPサーバーのアドレスを指定します。書式は次のとおりです。

    host[:port]
    

    説明:

    • hostは、SMTPサーバーのホスト名またはIPアドレスです。

    • portは、SMTPサーバーがリスニングするTCPポートです。指定しない場合は、デフォルト・ポート25が使用されます。

    この属性が指定されていないか、NULLまたは無効なSMTPサーバー・アドレスに設定されていると、ジョブの状態に関する電子メール通知をスケジューラで送信できません。

  • email_sender

    この属性には、ジョブ状態の電子メール通知の送信者のデフォルト電子メール・アドレスを指定します。有効な電子メール・アドレスを指定する必要があります。この属性が設定されていないか、NULLに設定されている場合、送信者アドレスが指定されていないジョブ状態の電子メール通知では、電子メール・ヘッダーのFROMアドレスが指定されません。

  • email_server_credential

    この属性は、既存の資格証明オブジェクトのスキーマおよび名前を指定します。デフォルトはNULLです。

    電子メール通知が送信されると、スケジューラはemail_server_credentialが指している資格証明オブジェクトを確認して、SYSがEXECUTEオブジェクト権限を持つ有効な資格証明オブジェクトであるかどうかを判断します。email_server属性に指定されているSMTPサーバーが認証を必要とする場合、スケジューラは指定された資格証明オブジェクトに格納されているユーザー名とパスワードを使用して電子メール・サーバーで認証します。

    email_server_credentialを指定している場合、email_server属性には認証を必要とするSMTPサーバーを指定する必要があります。

    email_server_credentialを指定していない場合、スケジューラでは認証が構成されていないSMTPサーバーを介して通知電子メールを送信できます。


    注意:

    この機能は、Oracle Database 11g リリース2(11.2.0.2)から使用できるようになりました。

  • email_server_encryption

    この属性は、このSMTPサーバー接続で暗号化が有効であるかどうかを示し、有効である場合には暗号化を開始する時点と使用するプロトコルも示します。

    email_server_encryptionの値は、次のとおりです。

    NONE: デフォルト値で、暗号化が有効でないことを示します。

    SSL_TLS: 接続が確立された当初からSSLまたはTLSが使用されることを示します。両側から、どのプロトコルが最も安全であるかが判断されます。これが、このパラメータに最もよく使用される設定です。

    STARTTLS: 暗号化なしで接続を開始するものの、STARTTLSコマンドの指示があると、電子メール・サーバーがTLSを使用して暗号化を開始することを示します。


    注意:

    この機能は、Oracle Database 11g リリース2(11.2.0.2)から使用できるようになりました。

  • event_expiry_time

    この属性を使用すると、スケジューラが生成したジョブの状態イベントが終了する(自動的にスケジューラ・イベント・キューからパージされる)までの時間(秒)を設定できます。NULLに設定すると、ジョブの状態イベントは24時間後に期限切れになります。

  • log_history

    この属性は、ジョブ・ログとウィンドウ・ログの両方のログ・エントリが保持される日数を制御します。これにより、ログが無制限に大きくなるのを防ぐことができます。有効値の範囲は、0から1000000です。0に設定すると、履歴は保持されません。デフォルト値は30です。ジョブ・クラスのlog_history属性に値を設定することにより、ジョブ・クラス・レベルでこの値をオーバーライドできます。

SET_SCHEDULER_ATTRIBUTEプロシージャの構文は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

Oracle Scheduler Agentを使用したリモート・ジョブの実行

Oracle Scheduler Agentを使用して、スケジューラは次の2種類のリモート・ジョブをスケジュールおよび実行できます。

  • リモート・データベース・ジョブ: リモート・データベース・ジョブはOracle Scheduler Agentを介して実行する必要があります。リモート・データベースと同じホストにエージェントをインストールすることをお薦めします。

    リモート・データベース・ジョブを実行する場合は、リリース11.2以降のスケジューラ・エージェントが必要です。

  • リモート外部ジョブ: リモート外部ジョブは、スケジューラ・エージェントがインストールされているのと同じホストで実行されます。

    リモート外部ジョブのみを実行する場合は、リリース11.1のスケジューラ・エージェントで十分です。

リモート外部ジョブが実行されるすべてのホストにスケジューラ・エージェントをインストールする必要があります。リモート・データベース・ジョブが実行されるリモート・データベースが動作するすべてのホストにスケジューラ・エージェントをインストールする必要があります。

リモート・ジョブが実行される各データベースでは、「リモート・ジョブを実行するためのデータベースの設定」の説明に従って、データベースとリモート・スケジューラ・エージェントの間のセキュアな通信を有効にするための初期設定を行う必要があります。

リモート・ジョブの有効化には、次の手順が含まれます。

  1. リモート・ジョブを実行するためのデータベースの設定の有効化と無効化

  2. リモート・ホストでのスケジューラ・エージェントのインストールと構成

  3. スケジューラ・エージェントによるタスクの実行


関連項目:


リモート・ジョブを実行するためのデータベースの設定の有効化と無効化

この項の項目は次のとおりです。

リモート・ジョブを実行するためのデータベースの設定

データベースでリモートのスケジューラ・エージェントを使用してジョブを実行するには、その前に、データベースを正しく構成し、そのエージェントをデータベースに登録しておく必要があります。この項では、データベースに必要なエージェント登録パスワードなどの構成について説明します。「スケジューラ・エージェントのデータベースへの登録」に示されているように、後でデータベースを登録します。

登録できるスケジューラ・エージェントの数を制限して、パスワードの有効期限を設定できます。

リモート・ジョブを作成および実行するデータベースごとに1回、次のすべての手順を実行します。

リモート・ジョブを作成および実行するデータベースを設定する手順は、次のとおりです。

  1. 共有サーバーが使用可能であることを確認します。

    「共有サーバーの使用可能化」を参照してください。

  2. SQL*Plusを使用して、SYSユーザーとしてデータベースに接続します。

  3. 次のコマンドを入力して、XML DBオプションがインストールされていることを確認します。

    SQL> DESC RESOURCE_VIEW
    

    XML DBがインストールされていない場合は、このコマンドで「オブジェクトが存在しません。」エラーが戻ります。


    注意:

    XML DBがインストールされていない場合は、先に進む前にXML DBをインストールする必要があります。

  4. 次のように、データベースへのHTTP接続を有効にします。

    1. Oracle XML DBM HTTPサーバーが有効であるかどうかを判断します。

      次のコマンドを発行します。

      SQL> SELECT DBMS_XDB.GETHTTPPORT() FROM DUAL;
      

      この文が0を返した場合、Oracle XML DBM HTTPサーバーは無効になっています。

    2. 0(ゼロ)以外のポートでOracle XML DB HTTPサーバーを有効にするには、SYSとしてログインし、次のコマンドを発行します。

      SQL> EXEC DBMS_XDB.SETHTTPPORT (port);
      SQL> COMMIT;
      

      portは、データベースがHTTP接続をリスニングするTCPポート番号です。

      portには1から65536の整数を指定しますが、UNIXおよびLinuxの場合は、1023より大きな値にします。まだ使用されていないポート番号を選択します。


      注意:

      これにより、Oracle Real Application ClustersデータベースのすべてのインスタンスでHTTP接続が使用可能になります。

  5. 次のコマンドを使用して、スクリプトprvtrsch.plbを実行します。

    SQL> @?/rdbms/admin/prvtrsch.plb
    
  6. SET_AGENT_REGISTRATION_PASSプロシージャを使用して、スケジューラ・エージェントの登録パスワードを設定します。

    次の例では、エージェント登録パスワードをmypasswordに設定します。

    BEGIN
      DBMS_SCHEDULER.SET_AGENT_REGISTRATION_PASS('mypassword');
    END;
    /
    

    注意:

    エージェント登録パスワードを設定するには、MANAGE SCHEDULER権限が必要です。SET_AGENT_REGISTRATION_PASSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

    実際の登録は、「スケジューラ・エージェントのデータベースへの登録」で行います。

リモート・ジョブの無効化

データベースのリモート・ジョブは、REMOTE_SCHEDULER_AGENTユーザーを削除することで、無効にできます。

リモート・ジョブを無効にする手順は、次のとおりです。

  • 次のSQL文を発行します。

    DROP USER REMOTE_SCHEDULER_AGENT CASCADE;
    

新規スケジューラ・エージェントの登録とリモート・ジョブの実行は、prvtrsch.plbを再度実行するまで無効(使用禁止)になります。

リモート・ホストでのスケジューラ・エージェントのインストールと構成

特定のホストでリモート・ジョブを実行する前に、この項の説明に従って、そのホスト上にスケジューラ・エージェントをインストールおよび構成し、「スケジューラ・エージェントによるタスクの実行」の説明に従って、スケジューラ・エージェントをホストで登録および起動しておく必要があります。スケジューラ・エージェントも、独自のOracleホームにインストールする必要があります。

スケジューラ・エージェントをリモート・ホストにインストールおよび構成するには、次の手順を実行します。

  1. スケジューラ・エージェント・ソフトウェアをダウンロードまたは入手します。このソフトウェアはOracle Databaseクライアントのインストール・メディア(Databaseのインストール・メディア)に収録されており、次のサイトからオンラインで入手することもできます。

    http://www.oracle.com/technology/software/products/database

  2. 最初に、エージェントを登録するデータベースが正しく設定されていることを確認します。

    手順は、「リモート・ジョブを実行するためのデータベースの設定の有効化と無効化」を参照してください。

  3. スケジューラ・エージェントをインストールするホストにログインします。このホストがリモート・ジョブを実行します。

    • Windowsの場合は、管理者としてログインします。

    • UNIXおよびLinuxの場合は、スケジューラ・エージェントを実行する予定のユーザーとしてログインします。このユーザーに特別な権限は必要ありません。

  4. Oracle Databaseクライアント製品のインストール・メディアからOracle Universal Installer(OUI)を実行します。

    • Windowsの場合は、setup.exeを実行します。

    • UNIXおよびLinuxの場合は、次のコマンドを使用します。

      /directory_path/runInstaller
      

    directory_pathは、Oracle Databaseクライアント製品のインストール・メディアへのパスです。

  5. 「インストール・タイプの選択」ページで、「カスタム」を選択して、「次へ」をクリックします。

  6. 「製品言語の選択」ページで、対象の言語を選択して、「次へ」をクリックします。

  7. 「インストール場所の指定」ページで、エージェントの新しいOracleホームのパスを入力して、「次へ」をクリックします。

  8. 「使用可能な製品コンポーネント」ページで、「Oracle Scheduler Agent」を選択して、「次へ」をクリックします。

  9. 「Oracle Database Scheduler Agent」ページで、次の手順を実行します。

    1. 「Scheduler Agentのホスト名」フィールドに、スケジューラ・エージェントをインストールするコンピュータのホスト名を入力します。

    2. 「Scheduler Agentのポート番号」フィールドに、スケジューラ・エージェントが接続をリスニングするTCPポート番号を入力するか、デフォルトを使用して、「次へ」をクリックします。

      1から65535の整数を選択します。UNIXおよびLinuxの場合は、1023より大きい値にする必要があります。選択するポート番号がまだ使用されていないことを確認します。

      OUIで、一連の前提条件チェックが実行されます。前提条件チェックが失敗した場合は、問題を解決してから「次へ」をクリックします。

  10. 「サマリー」ページで「終了」をクリックします。

  11. (UNIXおよびLinuxのみ)OUIがスクリプトroot.shの実行を求めるプロンプトを表示したら、rootユーザーとして次のコマンドを入力します。

    script_path/root.sh
    

    このスクリプトは、エージェントのインストール用に選択したディレクトリに格納されています。

    スクリプトが完了したら、「構成スクリプトの実行」ダイアログ・ボックスで「OK」をクリックします。

  12. インストールが完了したら、「閉じる」をクリックしてOUIを終了します。

  13. テキスト・エディタを使用して、スケジューラ・エージェントのホーム・ディレクトリにあるエージェント構成パラメータ・ファイルschagent.confPORT=ディレクティブのポート番号を確認します。

  14. リモート・ホスト上のファイアウォール・ソフトウェア、またはそのホストを保護する他のファイアウォールに、スケジューラ・エージェントに対応するための例外があることを確認します。

スケジューラ・エージェントによるタスクの実行

スケジューラ・エージェントは、外部ジョブとデータベース・ジョブをリモート・ホストでスケジュールおよび実行できるようにするスタンドアロン・プログラムです。スケジューラ・エージェントの起動と停止には、UNIXおよびLinuxではschagentユーティリティを使用し、WindowsではOracleSchedulerExecutionAgentサービスを使用します。

この項の項目は次のとおりです。

schagentユーティリティについて

実行可能ユーティリティschagentは、表30-1のオプションの指定に従って、Windows、UNIXおよびLinuxのエージェントに対する特定のタスクを実行します。

次の適切な構文およびオプションを指定して、schagentを使用します。

次に例を示します。

UNIXおよびLinux: AGENT_HOME/bin/schagent -status

Windows: AGENT_HOME/bin/schagent.exe -status

表30-1 schagentのオプション

オプション 説明

-start

スケジューラ・エージェントを開始します。

UNIXとLinuxのみ

-stop

スケジューラ・エージェントに現在実行中のすべてのジョブを停止するようにプロンプトを表示してから、実行を正常に停止します。

UNIXとLinuxのみ

-abort

最初にジョブを停止せずに、スケジューラ・エージェントを強制的に停止します。Oracle Database 11gリリース2以降。

UNIXとLinuxのみ

-status

ローカルに実行中のスケジューラ・エージェントに関する、バージョン、稼働時間、エージェントの起動以降に実行されたジョブの合計数、現在実行中のジョブの数およびその説明を返します。

-registerdatabase

エージェントのホスト・コンピュータでリモート・ジョブを実行する予定の基本データベースまたは追加データベースにスケジューラ・エージェントを登録します。

-unregisterdatabase

データベースからエージェントを登録解除します。


Windowsでのスケジューラ・エージェントの使用

Windowsのスケジューラ・エージェント・サービスは、インストール時に自動的に作成および起動されます。サービス名の末尾は、OracleSchedulerExecutionAgentになっています。


注意:

Oracle DatabaseがインストールされているWindowsコンピュータ上で実行され、資格証明なしのローカル外部ジョブの実行を管理するOracleJobSchedulerサービスと、このサービスを混同しないでください。

スケジューラ・エージェントの起動

次のコマンドを使用してスケジューラ・エージェントを起動します。

スケジューラ・エージェントを起動するには、次の手順を実行します。

  • 次のいずれかを実行します。

    • UNIXおよびLinuxの場合は、次のコマンドを実行します。

      AGENT_HOME/bin/schagent -start
      
    • Windowsの場合は、OracleSchedulerExecutionAgentで終わる名前のサービスを起動します。

スケジューラ・エージェントの停止

スケジューラ・エージェントを停止すると、スケジューラ・エージェントがあるホストでリモート・ジョブを実行できなくなります。

スケジューラ・エージェントを停止する手順は、次のとおりです。

  • 次のいずれかを実行します。

    • UNIXおよびLinuxでは、表30-1に説明されている-stopまたは-abortオプションのどちらかを指定してschagentユーティリティを実行します。

      AGENT_HOME/bin/schagent -stop
      
    • Windowsでは、OracleSchedulerExecutionAgentで終わる名前のサービスを停止します。これは-abortオプションに相当します。

スケジューラ・エージェントのデータベースへの登録

スケジューラ・エージェントの構成が終わるとすぐに、リモート・ジョブを実行する予定の1つ以上のデータベースでエージェントを登録できます。後でログインして、追加のデータベースにエージェントを登録することもできます。

  1. すでにログアウトしている場合は、次の方法で、スケジューラ・エージェントを実行しているホストにログインします。

    • Windowsの場合は、管理者としてログインします。

    • UNIXおよびLinuxの場合は、スケジューラ・エージェントをインストールしたユーザーとしてログインします。

  2. スケジューラ・エージェントを登録するデータベースごとに、次のコマンドを使用します。

    • UNIXおよびLinuxの場合は、次のコマンドを実行します。

      AGENT_HOME/bin/schagent -registerdatabase db_host db_http_port
      
    • Windowsの場合は、次のコマンドを実行します。

      AGENT_HOME/bin/schagent.exe -registerdatabase db_host db_http_port
      

    説明:

    • db_hostは、データベースがあるホストのホスト名またはIPアドレスです。Oracle Real Application Clusters環境では、任意のノードを指定できます。

    • db_http_portは、データベースがリスニングするポート番号です(HTTP接続用)。このパラメータは、「リモート・ジョブを実行するためのデータベースの設定の有効化と無効化」で事前に設定しました。次のSQL文をデータベースに発行することにより、ポート番号を確認できます。

      SELECT DBMS_XDB.GETHTTPPORT() FROM DUAL;
      

      ポート番号が0のときは、HTTP接続が無効になっています。

    「リモート・ジョブを実行するためのデータベースの設定の有効化と無効化」で設定したエージェント登録パスワードの入力を求めるプロンプトが表示されます。

  3. エージェントのホストでリモート・ジョブを実行する追加データベースがある場合は、前の手順を繰り返します。

スケジューラの監視と管理

次の項では、スケジューラを監視および管理する方法について説明します。

現在アクティブなウィンドウとリソース・プランの表示

現在アクティブなウィンドウとそのウィンドウに関連付けられているプランを表示するには、次の文を発行します。

SELECT WINDOW_NAME, RESOURCE_PLAN FROM DBA_SCHEDULER_WINDOWS
WHERE ACTIVE='TRUE';

WINDOW_NAME                    RESOURCE_PLAN
------------------------------ --------------------------
MY_WINDOW10                    MY_RESOURCEPLAN1

アクティブなウィンドウがない場合は、次の文を発行するとアクティブなリソース・プランを表示できます。

SELECT * FROM V$RSRC_PLAN;

現在実行中のジョブに関する情報の検索

ジョブの状態を確認するには、次の文を発行します。

SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS
WHERE JOB_NAME = 'MY_EMP_JOB1';

JOB_NAME                       STATE
------------------------------ ---------
MY_EMP_JOB1                    DISABLED

この場合は、ENABLEプロシージャを使用してジョブを使用可能にできます。表30-2に、ジョブの状態に関する有効値を示します。

表30-2 ジョブの状態

ジョブの状態 説明

disabled

ジョブは使用禁止です。

scheduled

ジョブは実行するようにスケジュールされています。

running

ジョブは現在実行中です。

completed

ジョブは完了しており、次回の実行はスケジュールされていません。

stopped

ジョブは1回実行するようにスケジュールされましたが、実行中に停止しました。

broken

ジョブは中断されました。

failed

ジョブは1回実行するようにスケジュールされ、失敗しました。

retry scheduled

ジョブは1回以上失敗し、再試行の実行がスケジュールされました。

succeeded

ジョブは1回実行するようにスケジュールされ、正常に完了しました。

chain_stalled

ジョブのタイプがチェーンで、実行されているステップ、実行がスケジュールされているステップおよびイベント待ちのイベント・ステップがなく、チェーンのevaluation_intervalNULLに設定されています。手動で操作を行わないかぎり、チェーンは続行されません。


現在実行中のジョブの進行状況を確認するには、次の文を発行します。

SELECT * FROM ALL_SCHEDULER_RUNNING_JOBS;

CPU_USED列に有効なデータを表示するには、RESOURCE_LIMIT初期化パラメータをtrueに設定する必要があります。

リモートおよびローカルのすべての宛先ですべてのジョブの状態を確認するには、次の文を発行します。

SELECT * FROM DBA_SCHEDULER_JOB_DESTS;

実行中のチェーンの一部のジョブに関する情報を得るには、次の文を発行します。

SELECT * FROM ALL_SCHEDULER_RUNNING_CHAINS WHERE JOB_NAME='MY_JOB1';

cjqNNNの形式のプロセスを検索すると、ジョブ・コーディネータが実行中かどうかをチェックできます。


関連項目:

  • *_SCHEDULER_RUNNING_JOBSおよびDBA_SCHEDULER_JOBSビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • 「複数の宛先のジョブ」


ウィンドウ・ログおよびジョブ・ログの監視と管理

スケジューラは、ジョブ・ログとウィンドウ・ログという2種類のログをサポートしています。

ジョブ・ログ

ジョブの実行、状態変化および失敗について、ジョブ・ログ内の情報を表示できます。ジョブ・ログは、次の2つのデータ・ディクショナリ・ビューとして実装されます。

  • *_SCHEDULER_JOB_LOG

  • *_SCHEDULER_JOB_RUN_DETAILS

スケジューラがジョブに関して実行するロギングの量は、ジョブ・クラス・レベルと個別ジョブ・レベルの両方で制御できます。通常、クラス内のジョブに関するロギングを厳密に制御できるため、ロギングをクラス・レベルで制御します。

各種ロギング・レベルの定義と、ジョブとジョブ・クラスの間のロギング・レベルの優先度については、「ジョブ・ログの表示」を参照してください。デフォルトでは、ジョブ・クラスのロギング・レベルはLOGGING_RUNSで、すべてのジョブの実行がログに記録されます。

ジョブ・クラスを作成する際にlogging_level属性を設定するか、SET_ATTRIBUTEプロシージャを使用すると、後でロギング・レベルを変更できます。次の例では、myclass1ジョブ・クラスのジョブのロギング・レベルを、失敗した実行のみがログに記録されるLOGGING_FAILED_RUNSに設定しています。すべてのジョブ・クラスはSYSスキーマにあることに注意してください。

BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE (
   'sys.myclass1', 'logging_level', DBMS_SCHEDULER.LOGGING_FAILED_RUNS);
END;
/

ジョブ・クラスのロギング・レベルを設定するには、MANAGE SCHEDULER権限が付与されている必要があります。


関連項目:

  • ジョブ・ログの詳細と、ジョブ・ログ・ビューに対する問合せ例については、「ジョブ・ログの表示」を参照してください。

  • ジョブ・ログ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • CREATE_JOB_CLASSおよびSET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

  • ログ・エントリの保存期間の設定については、「スケジューラのプリファレンスの設定」を参照してください。


ウィンドウ・ログ

スケジューラでは、次の操作が実行されるたびにウィンドウ・ログにエントリが1つ記録されます。

  • ウィンドウの作成または削除

  • ウィンドウのオープン

  • ウィンドウのクローズ

  • ウィンドウの重複

  • ウィンドウの使用可能化または使用禁止

ウィンドウ・アクティビティのロギングには、ロギング・レベルはありません。

ウィンドウ・ログの内容を調べるには、DBA_SCHEDULER_WINDOW_LOGビューを問い合せます。次の文は、このビューの出力例を示しています。

SELECT log_id, to_char(log_date, 'DD-MON-YY HH24:MI:SS') timestamp,
   window_name, operation FROM DBA_SCHEDULER_WINDOW_LOG;

    LOG_ID TIMESTAMP            WINDOW_NAME       OPERATION
---------- -------------------- ----------------- --------
         4 10/01/2004 15:29:23  WEEKEND_WINDOW    CREATE
         5 10/01/2004 15:33:01  WEEKEND_WINDOW    UPDATE
        22 10/06/2004 22:02:48  WEEKNIGHT_WINDOW  OPEN
        25 10/07/2004 06:59:37  WEEKNIGHT_WINDOW  CLOSE
        26 10/07/2004 22:01:37  WEEKNIGHT_WINDOW  OPEN
        29 10/08/2004 06:59:51  WEEKNIGHT_WINDOW  CLOSE

DBA_SCHEDULER_WINDOWS_DETAILSビューは、以前はアクティブで現在はクローズ(完了)されているすべてのウィンドウに関する情報を提供します。次の文は、このビューの出力例を示しています。

SELECT LOG_ID, WINDOW_NAME, ACTUAL_START_DATE, ACTUAL_DURATION
  FROM DBA_SCHEDULER_WINDOW_DETAILS;

    LOG_ID WINDOW_NAME      ACTUAL_START_DATE                    ACTUAL_DURATION
---------- ---------------- ------------------------------------ ---------------
        25 WEEKNIGHT_WINDOW 06-OCT-04 10:02.48.832438 PM PST8PDT +000 01:02:32
        29 WEEKNIGHT_WINDOW 07-OCT-04 10.01.37.025704 PM PST8PDT +000 03:02:00

これらのビューの両方でログIDが対応しており、この例では、DBA_SCHEDULER_WINDOWS_DETAILSビューの行がDBA_SCHEDULER_WINDOW_LOGビューのCLOSE操作に対応しています。


関連項目:

  • ウィンドウ・ログ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。


ログのパージ

ジョブ・ログおよびウィンドウ・ログが無計画に大きくならないように、SET_SCHEDULER_ATTRIBUTEプロシージャを使用して、保持する履歴の量(日数)を指定します。1日に1回、スケジューラは、指定した履歴期間より古いすべてのログ・エントリをジョブ・ログとウィンドウ・ログから自動的にパージします。デフォルトの履歴期間は30日です。たとえば、履歴期間を90日に変更する場合は、次の文を発行します。

DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('log_history','90');

一部のジョブ・クラスは他より重要です。そのため、クラス固有の設定を使用して、このグローバルな履歴設定をオーバーライドできます。たとえば、3つのジョブ・クラス(class1class2およびclass3)があり、class1class3に対しては10日間のウィンドウ・ログの履歴を保存し、class2に対しては30日間保存するとします。これを実現するには、次の文を発行します。

DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('log_history','10');
DBMS_SCHEDULER.SET_ATTRIBUTE('class2','log_history','30');

ジョブ・クラスの作成時には、クラス別の履歴を設定することもできます。

チェーン実行のステップに関連したログ・エントリは、メインのチェーン・ジョブのエントリがパージされるまでパージされません。

手動でのログのパージ

PURGE_LOGプロシージャを使用して、ログを手動でパージできます。例として、ジョブ・ログとウィンドウ・ログの両方からすべてのエントリをパージする文を示します。

DBMS_SCHEDULER.PURGE_LOG();

別の例として、3日前より古いすべてのエントリをジョブ・ログからパージする文を示します。ウィンドウ・ログはこの文の影響を受けません。

DBMS_SCHEDULER.PURGE_LOG(log_history => 3, which_log => 'JOB_LOG');

次の文では、10日前より古いすべてのウィンドウ・ログ・エントリと、job1およびclass2内のジョブに関連する10日前より古いすべてのジョブ・ログ・エントリがパージされます。

DBMS_SCHEDULER.PURGE_LOG(log_history => 10, job_name => 'job1, sys.class2');

スケジューラ・セキュリティの管理

ジョブのスケジュールと実行にスケジューラを使用する必要がある通常のユーザーに対しては、CREATE JOBシステム権限を付与してください。システム・リソースを管理する必要があるデータベース管理者には、MANAGE SCHEDULERを付与してください。スケジューラに関するその他のシステム権限またはロールを付与するときは、十分に注意してください。特に、CREATE ANY JOBシステム権限と、この権限が含まれるSCHEDULER_ADMINロールは、コードを任意のユーザーで実行できるため、非常に強力です。これらの権限とロールの付与は、非常に強力な権限を持つロールまたはユーザーに限定してください。

セキュリティに関して特に重要な問題は、外部ジョブの処理です。外部ジョブの処理は、データベース外でジョブを実行する必要があるユーザーにのみ実行を許可してください。それらのユーザーには、CREATE EXTERNAL JOBシステム権限を付与する必要があります。スケジューラに関するセキュリティには、他に特別な要件はありません。セキュリティの詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。


注意:

Oracle Database 10g リリース1から10g リリース2以降にアップグレードすると、CREATE EXTERNAL JOBCREATE JOB権限を持つすべてのユーザーとロールに対して自動的に付与されます。必要のないユーザーに対してはこの権限を取り消すことをお薦めします。

スケジューラのインポート/エクスポート

スケジューラ・オブジェクトをエクスポートするには、データ・ポンプ・ユーティリティ(impdpおよびexpdp)を使用します。スケジューラでは、以前のインポートおよびエクスポート・ユーティリティ(IMPおよびEXP)は使用できません。また、スケジューラ・オブジェクトは、データベースが読取り専用モードの間はエクスポートできません。

エクスポートでは、スケジューラ・オブジェクトの作成に使用されたDDLが生成されます。すべての属性がエクスポートされます。インポートが実行されると、すべてのデータベース・オブジェクトが新規データベースに再作成されます。すべてのスケジュールは、それぞれのタイム・ゾーンで格納され、新規データベース内で保持されます。たとえば、「サンフランシスコにあるデータベースの月曜日午後1時(太平洋沿岸標準時)」というスケジュールは、エクスポートされドイツでデータベースにインポートされた場合でも同じです。

スケジューラの資格証明はエクスポートされますが、セキュリティ上の理由で、これらの資格証明のパスワードはエクスポートされません。スケジューラの資格証明をインポートした後は、DBMS_SCHEDULERパッケージのSET_ATTRIBUTEプロシージャを使用してパスワードを再設定する必要があります。


関連項目:

データ・ポンプの詳細は、『Oracle Databaseユーティリティ』を参照してください。

スケジューラのトラブルシューティング

ここでは、トラブルシューティングに関する情報を提供します。この項の内容は、次のとおりです。

ジョブが実行されない

ジョブはいくつかの理由で実行に失敗する場合があります。実行されなかった可能性のあるジョブのトラブルシューティングを開始するには、次の文を発行して、ジョブの状態を確認します。

SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS;

標準的な出力は次のようになります。

JOB_NAME                       STATE
------------------------------ ---------
MY_EMP_JOB                     DISABLED
MY_EMP_JOB1                    FAILED
MY_NEW_JOB1                    DISABLED
MY_NEW_JOB2                    BROKEN
MY_NEW_JOB3                    COMPLETED

ジョブの状態の概要

ジョブが実行されない場合、次の4つの状態があります。

失敗したジョブ

ジョブ表内のジョブのステータスがFAILEDの場合、そのジョブは実行がスケジュールされたが実行に失敗したことを示します。ジョブが再起動可能として指定されていた場合は、すべての再試行に失敗しています。

実行の途中でジョブが失敗すると、最後のトランザクションのみがロールバックされます。複数のトランザクションを実行するジョブの場合は、restartableTRUEに設定するときに注意する必要があります。失敗したジョブを問い合せるには、*_SCHEDULER_JOB_RUN_DETAILSビューを問い合せます。

中断されたジョブ

中断されたジョブとは、特定の失敗数を超えたジョブです。この数はmax_failuresで設定され、変更できます。中断されたジョブは、ジョブ全体が中断されており、修正されるまで実行されません。デバッグとテストには、RUN_JOBプロシージャを使用できます。

中断されたジョブを問い合せるには、*_SCHEDULER_JOBSおよび*_SCHEDULER_JOB_LOGビューを問い合せます。

使用禁止のジョブ

ジョブは次の理由で使用禁止になる場合があります。

  • 手動で使用禁止にされた場合

  • ジョブが属しているジョブ・クラスが削除された場合

  • ジョブが指し示しているプログラム、チェーンまたはスケジュールが削除された場合

  • ウィンドウまたはウィンドウ・グループがジョブのスケジュールとなっているときに、そのウィンドウまたはウィンドウ・グループが削除された場合

完了したジョブ

ジョブは、end_dateまたはmax_runsに達すると完了します。(最近正常に完了したジョブが再度実行するようにスケジュールされると、ジョブの状態はSCHEDULEDになります。)

ジョブ・ログの表示

ジョブ・ログは、重要なトラブルシューティング・ツールです。詳細および手順は、「ジョブ・ログの表示」を参照してください。

リモート・ジョブのトラブルシューティング

リモート・ジョブは、リモート・ホスト上のスケジューラ・エージェントと正常にやり取りする必要があります。リモート・ジョブが実行されない場合は、まずDBA_SCHEDULER_JOBSビューとジョブ・ログを確認してください。次に、次の手順を実行します。

  1. nslookuppingなどのツールを使用して、リモート・システムがネットワーク上で到達可能であることを確認します。

  2. GET_AGENT_VERSIONパッケージ・プロシージャをコールして、リモート・ホストでスケジューラ・エージェントの状態を確認します。

    DECLARE 
      versionnum VARCHAR2(30);
    BEGIN
      versionnum := DBMS_SCHEDULER.GET_AGENT_VERSION('remote_host.example.com');
      DBMS_OUTPUT.PUT_LINE(versionnum);
    END;
    /
    

    エラーが生成された場合、エージェントがインストールされていないか、ローカル・データベースで登録されていない可能性があります。スケジューラ・エージェントのインストール、登録および起動手順は、「リモート・ジョブを実行するためのデータベースの設定の有効化と無効化」を参照してください。

障害後のジョブ・リカバリの概要

スケジューラは、次の場合に中断されたジョブのリカバリを試行します。

  • データベースが異常停止した場合

  • ジョブ・スレーブ・プロセスが強制終了したか、失敗した場合

  • 外部ジョブの場合に、実行可能ファイルまたはスクリプトを起動する外部ジョブ・プロセスが強制終了したか、失敗した場合(UNIXでは、外部ジョブ・プロセスはextjobです。Windowsでは、外部ジョブ・サービスです。)

  • 外部ジョブの場合に、エンド・ユーザーの実行可能ファイルまたはスクリプトを起動するプロセスが強制終了したか、失敗した場合。

ジョブ・リカバリは次のように実行されます。

  • スケジューラにより、障害が発生したときに実行されていたジョブのインスタンスについて、ジョブ・ログにエントリが追加されます。ログ・エントリでは、OPERATIONRUNSTATUSSTOPPEDになっており、ADDITIONAL_INFOには次のいずれかが挿入されます。

    • REASON=ジョブ・スレーブ・プロセスは終了しました

    • REASON=ORA-01014: Oracleのシャットダウン処理中です。

  • そのジョブのrestartableTRUEに設定されている場合は、ジョブが再開されます。

  • restartableFALSEに設定されている場合は、次のようになります。

    • ジョブが1回のみ実行されるジョブであり、auto_dropTRUEに設定されている場合は、ジョブの実行が完了するとそのジョブは削除されます。

    • ジョブが1回のみ実行されるジョブであり、auto_dropFALSEに設定されている場合は、ジョブが使用禁止になり、そのジョブの状態stateSTOPPEDに設定されます。

    • ジョブが繰返しジョブの場合、スケジューラは次回のジョブの実行をスケジュールし、そのジョブの状態stateSCHEDULEDに設定されます。

このリカバリ・プロセスの結果、ジョブが再開されると、新規実行はRECOVERY_RUN操作としてジョブ・ログに記録されます。

プログラムが無効化される

プログラムは、プログラム引数が削除された場合やnumber_of_argumentsの変更ですべての引数を定義できなくなった場合に使用禁止になります。

プログラムの詳細は、「ジョブを定義するためのプログラムの作成および管理」を参照してください。

ウィンドウの有効化に失敗する

ウィンドウは、次の場合に有効化できません。

  • スケジュールの終了時にウィンドウが使用禁止にされた場合

  • すでに存在しないスケジュールを指すウィンドウが使用禁止にされた場合

ウィンドウの詳細は、「ウィンドウを使用したジョブ・スケジューリングとジョブ優先度の管理」を参照してください。

スケジューラの使用例

このセクションのトピックは次のとおりです:

ジョブ・クラスの作成例

この項では、ジョブ・クラスの作成例をいくつか示します。ジョブ・クラスを作成するには、CREATE_JOB_CLASSプロシージャを使用します。

例30-1 ジョブ・クラスの作成

次の文ではジョブ・クラスが作成されます。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB_CLASS (
   job_class_name              =>  'my_class1',
   service                     =>  'my_service1', 
   comments                    =>  'This is my first job class');
END;
/

これにより、my_class1SYSに作成されます。ここでは、my_service1というサービスが使用されています。ジョブ・クラスが作成されたことを確認するには、次の文を発行します。

SELECT JOB_CLASS_NAME FROM DBA_SCHEDULER_JOB_CLASSES
WHERE JOB_CLASS_NAME = 'MY_CLASS1';

JOB_CLASS_NAME
------------------------------
MY_CLASS1

例30-2 ジョブ・クラスの作成

次の文ではジョブ・クラスが作成されます。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB_CLASS (
   job_class_name             =>  'finance_jobs', 
   resource_consumer_group    =>  'finance_group',
   service                    =>  'accounting',
   comments                   =>  'All finance jobs');
END;
/

これにより、finance_jobsSYSに作成されます。finance_groupというリソース・コンシューマ・グループが割り当てられ、accountingサービス用のサービス・アフィニティが指定されています。accountingサービスがfinance_group以外のリソース・コンシューマ・グループにマップされている場合は、resource_consumer_group属性が優先されるので、このクラスのジョブはfinance_groupコンシューマ・グループで実行されることに注意してください。


関連項目:

CREATE_JOB_CLASSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。詳細は、「ジョブ・クラスの作成」を参照してください。

属性の設定例

この項では、属性の設定例をいくつか示します。属性を設定するには、SET_ATTRIBUTEおよびSET_SCHEDULER_ATTRIBUTEプロシージャを使用します。

例30-3 繰返し間隔属性の設定

次の例では、my_emp_job1が日次で実行されるように頻度が再設定されます。

BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE (
   name           =>   'my_emp_job1',
   attribute      =>   'repeat_interval',
   value          =>   'FREQ=DAILY');
END;
/

変更されたことを確認するには、次の文を発行します。

SELECT JOB_NAME, REPEAT_INTERVAL FROM DBA_SCHEDULER_JOBS
WHERE JOB_NAME =  'MY_EMP_JOB1';

JOB_NAME             REPEAT_INTERVAL
----------------     ---------------
MY_EMP_JOB1          FREQ=DAILY

例30-4 一連のジョブに対する複数のジョブ属性の設定

次の例では、5つの各ジョブに4つの異なる属性が設定されます。

DECLARE
 newattr sys.jobattr;
 newattrarr sys.jobattr_array;
 j number;
BEGIN
 -- Create new JOBATTR array
 newattrarr := sys.jobattr_array();

 -- Allocate enough space in the array
 newattrarr.extend(20);
 j := 1;
 FOR i IN 1..5 LOOP
   -- Create and initialize a JOBATTR object type
   newattr := sys.jobattr(job_name => 'TESTJOB' || to_char(i),
                          attr_name => 'MAX_FAILURES',
                          attr_value => 5);
   -- Add it to the array.
   newattrarr(j) := newattr;
   j := j + 1;
   newattr := sys.jobattr(job_name => 'TESTJOB' || to_char(i),
                          attr_name => 'COMMENTS',
                          attr_value => 'Test job');
   newattrarr(j) := newattr;
   j := j + 1;
   newattr := sys.jobattr(job_name => 'TESTJOB' || to_char(i),
                          attr_name => 'END_DATE',
                          attr_value => systimestamp + interval '24' hour);
   newattrarr(j) := newattr;
   j := j + 1;
   newattr := sys.jobattr(job_name => 'TESTJOB' || to_char(i),
                          attr_name => 'SCHEDULE_LIMIT',
                          attr_value => interval '1' hour);
   newattrarr(j) := newattr;
   j := j + 1;
 END LOOP;

 -- Call SET_JOB_ATTRIBUTES to set all 20 set attributes in one transaction
 DBMS_SCHEDULER.SET_JOB_ATTRIBUTES(newattrarr, 'TRANSACTIONAL');
END;
/

関連項目:

SET_SCHEDULER_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。「スケジューラのプリファレンスの設定」を参照してください。

チェーンの作成例

この項では、チェーンの作成例を示します。チェーンを作成するには、CREATE_CHAINプロシージャを使用します。チェーンを作成した後、DEFINE_CHAIN_STEPまたはDEFINE_CHAIN_EVENT_STEPプロシージャを使用してチェーンにステップを追加し、DEFINE_CHAIN_RULEプロシージャを使用してルールを定義します。

例30-5 チェーンの作成

次の例では、my_program2およびmy_program3の前にmy_program1を実行するチェーンが作成されます。my_program1の完了後、my_program2およびmy_program3は、並行して実行されます。

この例のユーザーには、CREATE EVALUATION CONTEXTCREATE RULEおよびCREATE RULE SET権限が必要です。詳細は、「チェーンの各権限の設定」を参照してください。

BEGIN
  DBMS_SCHEDULER.CREATE_CHAIN (
   chain_name            =>  'my_chain1',
   rule_set_name         =>  NULL,
   evaluation_interval   =>  NULL,
   comments              =>  NULL);
END;
/
 
--- define three steps for this chain. Referenced programs must be enabled.
BEGIN
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('my_chain1', 'stepA', 'my_program1');
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('my_chain1', 'stepB', 'my_program2');
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('my_chain1', 'stepC', 'my_program3');
END;
/

--- define corresponding rules for the chain.
BEGIN
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE('my_chain1', 'TRUE', 'START stepA');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   'my_chain1', 'stepA COMPLETED', 'Start stepB, stepC');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   'my_chain1', 'stepB COMPLETED AND stepC COMPLETED', 'END');
END;
/

--- enable the chain
BEGIN
 DBMS_SCHEDULER.ENABLE('my_chain1');
END;
/

--- create a chain job to start the chain daily at 1:00 p.m.
BEGIN
 DBMS_SCHEDULER.CREATE_JOB (
   job_name        => 'chain_job_1',
   job_type        => 'CHAIN',
   job_action      => 'my_chain1',
   repeat_interval => 'freq=daily;byhour=13;byminute=0;bysecond=0',
   enabled         => TRUE);
END;
/

例30-6 チェーンの作成

次の例では、最初にmy_program1を実行してチェーンを作成します。正常に実行された場合はmy_program2、失敗した場合はmy_program3が実行されます。

BEGIN
 DBMS_SCHEDULER.CREATE_CHAIN (
   chain_name            => 'my_chain2',
   rule_set_name         => NULL,
   evaluation_interval   => NULL,
   comments              => NULL);
END;
/
 
--- define three steps for this chain.
BEGIN
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('my_chain2', 'step1', 'my_program1');
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('my_chain2', 'step2', 'my_program2');
 DBMS_SCHEDULER.DEFINE_CHAIN_STEP('my_chain2', 'step3', 'my_program3');
END;
/
 
--- define corresponding rules for the chain.
BEGIN
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('my_chain2', 'TRUE', 'START step1');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   'my_chain2', 'step1 SUCCEEDED', 'Start step2');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   'my_chain2', 'step1 COMPLETED AND step1 NOT SUCCEEDED', 'Start step3');
 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   'my_chain2', 'step2 COMPLETED OR step3 COMPLETED', 'END');
END;
/

関連項目:

CREATE_CHAINDEFINE_CHAIN_STEPおよびDEFINE_CHAIN_RULEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。「スケジューラのプリファレンスの設定」を参照してください。

イベントに基づくジョブとスケジュールの作成例

この項では、イベント・ベースのジョブおよびイベント・スケジュールの作成例を示します。イベント・ベースのジョブを作成するには、CREATE_JOBプロシージャを使用します。イベント・ベースのスケジュールを作成するには、CREATE_EVENT_SCHEDULEプロシージャを使用します。

これらの例では、アプリケーションでシステムにファイルが到着したことが検出されたときに、イベントをmy_events_qキューにエンキューするアプリケーションがあることを想定しています。

例30-7 イベント・ベースのスケジュールの作成

次の例では、午前9時前にファイルがシステムに到着したことを示すイベントをスケジューラが受信するたびに、ジョブの開始に使用可能なスケジュールを作成する方法を示しています。

BEGIN
  DBMS_SCHEDULER.CREATE_EVENT_SCHEDULE (
   schedule_name     =>  'scott.file_arrival',
   start_date        =>  systimestamp,
   event_condition   =>  'tab.user_data.object_owner = ''SCOTT'' 
      and tab.user_data.event_name = ''FILE_ARRIVAL'' 
      and extract hour from tab.user_data.event_timestamp < 9',
   queue_spec        =>  'my_events_q');
END;
/

例30-8 イベント・ベースのジョブの作成

次の例では、ファイルがシステムに到着したことを示すイベントをスケジューラが受信したときに開始されるジョブを作成しています。

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name            =>  my_job,
   program_name        =>  my_program,
   start_date          =>  '15-JUL-04 1.00.00AM US/Pacific',
   event_condition     =>  'tab.user_data.event_name = ''LOW_INVENTORY''',
   queue_spec          =>  'my_events_q'
   enabled             =>  TRUE,
   comments            =>  'my event-based job');
END;
/

関連項目:

CREATE_JOBおよびCREATE_EVENT_SCHEDULEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

Oracle Data Guard環境でのジョブの作成

Oracle Data Guard環境では、スケジューラには、2つのデータベース・ロール(プライマリとロジカル・スタンバイ)に対する追加のサポートが含まれています。データベースのロールがプライマリの場合のみ、またはデータベースのロールがロジカル・スタンバイの場合のみ、ジョブが実行されるように構成できます。そのためには、database_role属性を設定します。この例では、両方のデータベース・ロールでジョブを実行できるようにする方法を説明します。ジョブのコピーを2つ作成し、それぞれに異なるdatabase_roleを割り当てる方法を使用します。

デフォルトでは、ジョブが実行されるのは、データベースのロールがそのジョブの作成時と同じロールの場合です。両方のロールで同じジョブを実行する手順は、次のとおりです。

  1. ジョブをコピーします。

  2. 新しいジョブを使用可能にします。

  3. 新しいジョブのdatabase_role属性を必要なロールに変更します。

この例では、まずprimary_jobというジョブをプライマリ・データベースに作成しています。次に、このジョブのコピーを作成して、そのdatabase_role属性を「LOGICAL STANDBY」に設定しています。プライマリ・データベースがロジカル・スタンバイになった場合は、そのスケジュールに従ってジョブが引き続き実行されます。

ジョブをコピーした場合、新しいジョブは使用禁止になっているため、使用可能にする必要があります。

BEGIN DBMS_SCHEDULER.CREATE_JOB (
     job_name       => 'primary_job',
     program_name   => 'my_prog',
     schedule_name  => 'my_sched');

 DBMS_SCHEDULER.COPY_JOB('primary_job','standby_job');
 DBMS_SCHEDULER.ENABLE(name=>'standby_job', commit_semantics=>'ABSORB_ERRORS');
 DBMS_SCHEDULER.SET_ATTRIBUTE('standby_job','database_role','LOGICAL STANDBY');
END;
/

この例を実行すると、DBA_SCHEDULER_JOB_ROLESビューのデータは、次のようになります。

SELECT JOB_NAME, DATABASE_ROLE FROM DBA_SCHEDULER_JOB_ROLES
   WHERE JOB_NAME IN ('PRIMARY_JOB','STANDBY_JOB');

JOB_NAME               DATABASE_ROLE
--------               ----------------
PRIMARY_JOB            PRIMARY
STABDBY_JOB            LOGICAL STANDBY

注意:

フィジカル・スタンバイ・データベースの場合、スケジューラのオブジェクトに対する変更またはプライマリ・データベース上のスケジューラのジョブによるデータベースの変更は、他のデータベースの変更と同様にフィジカル・スタンバイに適用されます。

スケジューラの参照情報

この項には、Oracle Schedulerの参考情報が説明されています。内容は次のとおりです。

スケジューラ権限

表30-3「スケジューラのシステム権限」および表30-4「スケジューラのオブジェクト権限」に、スケジューラの様々な権限を説明します。

表30-3 スケジューラのシステム権限

権限名 許可されている操作

CREATE JOB

自分のスキーマ内にジョブ、チェーン、スケジュール、プログラム、File Watcher、資格証明、宛先およびグループを作成できます。CREATE JOB権限がなくても、自分のスキーマ内でのこれらのオブジェクトの変更および削除はいつでも可能です。この場合、CREATE ANY JOB権限を持つ別のユーザーによって、スキーマ内にそのオブジェクトが作成されます。

CREATE ANY JOB

SYS以外の任意のスキーマ内でジョブ、チェーン、スケジュール、プログラム、File Watcher、資格証明、宛先およびグループを作成、変更および削除できます。これは非常に強力な権限で、権限受領者は任意の他のデータベース・ユーザーでPL/SQLコードを実行できるため、慎重に使用してください。

CREATE EXTERNAL JOB

この権限はデータベース外で実行するジョブを作成する場合に必要です。EXECUTABLEタイプのジョブの所有者、またはEXECUTABLEタイプのプログラムを指し示すジョブの所有者にはこの権限が必要です。EXECUTABLEタイプのジョブを実行する場合は、この権限およびCREATE JOB権限が必要です。リモート・ホストからファイルを取得したり、1つ以上のリモート・ホストにファイルを保存する場合も、この権限が必要です。

EXECUTE ANY PROGRAM

自分のジョブに任意のスキーマのプログラムまたはチェーンを使用できます。

EXECUTE ANY CLASS

自分のジョブを任意のジョブ・クラスの下で実行できます。

MANAGE SCHEDULER

これはスケジューラを管理するための最も重要な権限です。ジョブ・クラス、ウィンドウおよびウィンドウ・グループの作成、変更および削除、forceオプションによるジョブの停止を行えます。スケジューラ属性の設定と取得、スケジューラ・ログのパージ、データベースのエージェント・パスワードの設定も行えます。


表30-4 スケジューラのオブジェクト権限

権限名 許可されている操作

SELECT

SELECTをグループに付与することによって、グループのオブジェクト権限を他のユーザーに付与できます。

EXECUTE

この権限はプログラム、チェーン、File Watcher、資格証明およびジョブ・クラスのみに付与できます。EXECUTE権限では、ジョブのオブジェクトを参照できます。オブジェクトが自分のスキーマで作成されたのではない場合に、オブジェクトを表示することもできます。

ALTER

権限付与されているオブジェクトを変更または削除できます。変更操作には、プログラム引数の使用可能化、使用禁止化、定義または削除、ジョブ引数値の設定または再設定、およびジョブの実行などの操作が含まれます。ジョブ・タイプEXECUTABLEのジョブの制限付きの特定の属性は、ALTERオブジェクト権限を使用して変更できません。これには、job_typejob_actionnumber_of_argumentsevent_spec、スケジュールとしてのPL/SQL日付関数の設定が含まれます。

プログラム、ジョブ、チェーン、File Watcherおよび資格証明の場合には、この権限により、これらのオブジェクトを所有しないスキーマを使用可能にして表示することもできます。この権限は、ジョブ、チェーン、プログラム、スケジュール、File Watcherおよび資格証明に対してのみ付与できます。他のタイプのスケジューラ・オブジェクトに対しては、MANAGE SCHEDULERシステム権限を付与する必要があります。

ALL

この権限では、指定したオブジェクトに対して他のすべてのオブジェクト権限で許可されている操作が可能です。これは、ジョブ、プログラム、チェーン、スケジュール、File Watcher、資格証明およびジョブ・クラスに付与できます。



注意:

別のユーザーによって作成された宛先オブジェクトを使用する場合に、オブジェクト権限は必要ありません。

SCHEDULER_ADMINロールは、表30-3に記載されているすべてのシステム権限付き(ADMINオプション付き)で作成されます。SCHEDULER_ADMINロールはDBA(ADMINオプション付き)に付与されます。

DBMS_SCHEDULERパッケージでは、ロールを通じてジョブやチェーンなどのSchedulerオブジェクトに対して付与される権限は無視されます。オブジェクト権限は、ユーザーに直接付与する必要があります。

SELECT ALL_SCHEDULER_*ビュー、SELECT USER_SCHEDULER_* ビュー、SELECT SYS.SCHEDULER$_JOBSUFFIX_S(ジョブ名生成用)、およびEXECUTE SYS.DEFAULT_JOB_CLASSの各オブジェクト権限が、PUBLICに付与されます。

スケジューラのデータ・ディクショナリ・ビュー

スケジューラの情報は、多数のビューで確認できます。次に、my_job1の完了したインスタンスに関する情報の表示例を示します。

SELECT JOB_NAME, STATUS, ERROR#
FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME = 'MY_JOB1';

JOB_NAME     STATUS           ERROR#
--------     --------------   ------
MY_JOB1      FAILURE           20000

表30-5に、スケジューラに関連付けられたビューを示します。*_SCHEDULER_JOBS*_SCHEDULER_SCHEDULES*_SCHEDULER_PROGRAMS*_SCHEDULER_RUNNING_JOBS*_SCHEDULER_JOB_LOGおよび *_SCHEDULER_JOB_RUN_DETAILSの各ビューは、ジョブの管理に特に役立ちます。スケジューラのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。


注意:

次の表のビュー名の先頭にあるアスタリスクは、DBAALLまたはUSERで置換されます。

表30-5 スケジューラのビュー

ビュー 説明
*_SCHEDULER_CHAIN_RULES

すべてのチェーンについて、すべてのルールが表示されます。

*_SCHEDULER_CHAIN_STEPS

すべてのチェーンについて、すべてのステップが表示されます。

*_SCHEDULER_CHAINS

すべてのチェーンが表示されます。

*_SCHEDULER_CREDENTIALS

すべての資格証明が表示されます。

*_SCHEDULER_DB_DESTS

すべてのデータベース宛先が表示されます。

*_SCHEDULER_DESTS

すべてのデータベース宛先と外部宛先が表示されます。

*_SCHEDULER_EXTERNAL_DESTS

すべての外部宛先が表示されます。

*_SCHEDULER_FILE_WATCHERS

すべてのFile Watcherが表示されます。

*_SCHEDULER_GLOBAL_ATTRIBUTE

スケジューラ属性の現行値が表示されます。

*_SCHEDULER_GROUP_MEMBERS

すべてのグループのすべてのグループ・メンバーが表示されます。

*_SCHEDULER_GROUPS

すべてのグループが表示されます。

*_SCHEDULER_JOB_ARGS

すべてのジョブについて、すべての引数の設定値が表示されます。

*_SCHEDULER_JOB_CLASSES

すべてのジョブ・クラスが表示されます。

*_SCHEDULER_JOB_DESTS

これらのビューには、複数の宛先のジョブの子ジョブを含む、ローカル・ジョブとリモート宛先のジョブの両方の状態が表示されます。これらのビューからジョブ宛先ID (job_dest_id)を取得します。

*_SCHEDULER_JOB_LOG

設定されているロギング・レベルに応じて、ジョブの実行と状態変化が表示されます。

*_SCHEDULER_JOB_ROLES

Oracle Data Guardデータベース・ロールによるすべてのジョブが表示されます。

*_SCHEDULER_JOB_RUN_DETAILS

完了(失敗または成功)したすべてのジョブ実行が表示されます。

*_SCHEDULER_JOBS

すべてのジョブ(使用可能なジョブと使用禁止のジョブ)が表示されます。

*_SCHEDULER_NOTIFICATIONS

すべてのジョブの状態の電子メール通知が表示されます。

*_SCHEDULER_PROGRAM_ARGS

すべてのプログラムに定義されているすべての引数が、デフォルト値(存在する場合)とともに表示されます。

*_SCHEDULER_PROGRAMS

すべてのプログラムが表示されます。

*_SCHEDULER_RUNNING_CHAINS

実行中のすべてのチェーンが表示されます。

*_SCHEDULER_RUNNING_JOBS

現在実行中のすべてのジョブに関する状態情報が表示されます。

*_SCHEDULER_SCHEDULES

すべてのスケジュールが表示されます。

*_SCHEDULER_WINDOW_DETAILS

完了したすべてのウィンドウの実行が表示されます。

*_SCHEDULER_WINDOW_GROUPS

すべてのウィンドウ・グループが表示されます。

*_SCHEDULER_WINDOW_LOG

ウィンドウに行われた変更の状態がすべて表示されます。

*_SCHEDULER_WINDOWS

すべてのウィンドウが表示されます。

*_SCHEDULER_WINGROUP_MEMBERS

すべてのウィンドウ・グループのメンバーが、グループ・メンバーごとに1行ずつ表示されます。