4.3 デーモン・ジョブのスケジューリング

このデーモンの動作は、スケジュールするジョブを定義するYAML構成ファイルによって制御されます。

このYAMLファイルまたはスケジュール・ファイルの名前はscheduler.yamlです。SQLclデーモンによってこのファイルが読み取られて、ジョブがロードされスケジュールされます。

スケジュール・ファイルの場所、その構造、およびジョブをリロードするためにこのファイルをデーモンでアクティブにモニターする方法について学習します。

4.3.1 スケジュール・ファイルの場所

データベース・ツール(dbtools)のホーム・ディレクトリにスケジュール・ファイルが含まれています。

スケジュール・ファイルの場所は次のとおりです:

${HOME}/.dbtools/schedules/scheduler.yaml

このデーモンが初めて起動されたときに、それにより、この場所に、スケジュール・ファイル(コメントアウトされたサンプル・ジョブが含まれている)が自動的に作成されます。

初回実行時のデフォルト・コンテンツ:

cat ~/.dbtools/schedules/scheduler.yaml                                                                                                                       
jobs:
# - name: job-example
#   cron: 0/2 * * * * ? *
#   connection: named-conn-example
#   payload: "@/path/to/script.sql arg1 arg2 arg3"

4.3.2 スケジュール・ファイルの構造

scheduler.yamlファイルには、ジョブ定義のリストを指すトップ・レベル・キー(jobs)が含まれています。

jobsリスト内の各ジョブ・エントリは、次のキーがあるオブジェクトです:
  • name (必須): そのジョブの一意の識別子。この名前は、そのジョブのログ・ファイルにも使用されます。
  • cron (必須): そのスケジュールを定義する7つのフィールド(秒から年まで)がある、Quartz互換のcron式。
  • connection (オプション): 保存されているSQLcl接続(たとえば、conn -save <name> -savepwdを使用して作成された接続)。

    保存されている接続を使用すると、対話形式のパスワード・プロンプトなしでそのジョブを実行できるようになります。省略した場合は、ジョブはデフォルトの接続(/ as sysdba)を使用して実行されます。

  • payload (必須): デーモンによって実行される有効なSQL、PL/SQL、またはSQLcl固有のコマンドまたはスクリプト。
    ペイロードの例:
    • インラインSQLまたはSQLclコマンド: 単純な単一行の操作に役立ちます。
      payload: desc employees
    • 引数を指定したスクリプト・ファイル: 複数のユースケースにわたる再利用性と柔軟性を高めるために役立ちます。
      payload: "@/path/to/generate_report.sql 2024 Q1"

      @で始まる文字列を引用符で囲むことに注意してください。この文字列を引用符なしで使用すると構文エラーが発生します。@文字はYAML仕様に準じて将来使用するために予約されていることが原因です。

    • YAMLリテラル・ブロックを使用した複数行ペイロード: YAMLで直接定義されている長いSQLまたはPL/SQLスクリプトに最適です。
      payload: |
        BEGIN
          DBMS_OUTPUT.PUT_LINE('Job started');
          -- Add more PL/SQL logic here
        END;
        /

4.3.3 ジョブのライブ・リロード

このデーモンでは、変更点があるかどうかscheduler.yamlファイルがアクティブにモニターされます。

このファイルが変更され保存されると、このデーモンにより、再起動の必要なく次のアクションが実行されます:
  • 各ジョブ定義のチェックサムを計算して変更点を検出します。
  • 新規ジョブがある場合はそれを追加します。
  • 変更されたジョブを再スケジュールします。
  • 削除されたジョブをスケジュール解除します。
  • 変更されていないジョブをそのまま残します。