すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_JOB

最終更新日:Jun 05, 2024

PolarDBは、スケジュールされたジョブをスケジュールおよび管理するために使用されるDBMS_JOBパッケージを提供します。 このトピックでは、スケジュールされたジョブを作成、管理、および削除する方法について説明します。

前提条件

  • DBMS_JOBパッケージを手動で有効にするには、次の手順を実行します。
    1. PolarDBコンソールにログインし、DBMS_JOBパッケージを有効にするクラスターの名前をクリックします。
    2. 左側のナビゲーションペインで、設定と管理 > パラメーター を選択します。
    3. shared_preload_librariesパラメーターの拡張子リストにdbms_jobを追加します。
  • PolarDBクラスターのカーネルバージョンは1.1.7以降です。 カーネルのバージョンを確認する方法の詳細については、「リリースノート」をご参照ください。

Usage

  • 特権アカウントのみがDBMS_JOBパッケージを使用できます。 特権アカウントの作成方法の詳細については、「データベースアカウントの作成」をご参照ください。
  • セキュリティ上の理由から、dbms_job拡張子を手動で作成することはできません。 dbms_job拡張子を作成するには、Quota Centerに移動します。 polardb_pg_dbms_jobに対応する [操作] 列で [適用] をクリックします。
  • 既存のdbms_job拡張子がある場合は、このトピックで説明されている手順に従って削除して再インストールします。 次の構文を使用して、拡張機能を削除できます。
    警告 拡張子を削除すると、拡張子に関連するスケジュール済みジョブが削除されます。 拡張機能を削除する前に、データをバックアップします。
    drop extension dbms_job;
  • dbms_job拡張子は、postgresデータベースにのみ作成できます。 他のデータベースのスケジュール済みジョブを構成する場合は、postgresデータベースでクロスデータベースのスケジュール済みジョブを構成します。 詳細については、「データベース間でのスケジュールされたジョブの実行」をご参照ください。

テストデータの準備

説明 テストデータは、このトピックで提供されている例にのみ適用されます。
次の例に示すように、テスト用にjobrunという名前のテーブルを作成します。

    idシリアルNOT NULL PRIMARYキー、
    ランタイムVARCHAR2(40)
); 
次の例に示すように、job_procという名前のストアドプロシージャを作成します。

IS
開始
    INSERT INTO jobrun(runtime) VALUES ('job_proc run at '| | TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss));
エンド; 

DBMS_JOBパッケージの削除

警告 DBMS_JOBパッケージを削除すると、DBMS_JOBパッケージに関連するすべての既存のユーザージョブが削除されます。
次の構文を使用して、DBMS_JOBパッケージを削除できます。
DROP EXTENSION dbms_job CASCADE;

スケジュールされたジョブの作成

構文
送信 (ジョブOUT BINARY_INTEGER、何VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]]) 
表1. パラメーター
パラメーター説明
仕事 渡すjobid値。 jobid値を渡すと、送信されたジョブのIDが返されます。 ジョブIDは自動的に生成され、ジョブごとに一意です。
呼び出すストアドプロシージャの名前。 このパラメーターを指定する必要があります。 このトピックの例では、job_procストアドプロシージャを使用しています。
next_dateスケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。
intervalスケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。
表2. インターバルの説明
実行間隔
毎分
TRUNC(sysdate、'mi') + 1/(24*60)
毎日システムは毎日01:00:00にジョブを実行します:
TRUNC(sysdate) + 1 + 1/(24)
毎週システムは毎週月曜日の01:00:00にジョブを実行します:
TRUNC(next_day(sysdate,'monday')) + 1/24
毎月システムは毎月1日の01:00:00にジョブを実行します:
TRUNC(LAST_DAY(SYSDATE)) + 1 + 1/24
四半期ごとシステムは、四半期ごとの初日の01:00:00にジョブを実行します。
TRUNC(ADD_MONTHS(SYSDATE、3) 、'Q') + 1/24
毎年システムは毎年1月1日の01:00:00にジョブを実行します:
ADD_MONTHS(trunc(sysdate, 'yyy'), 12) + 1/24
定点インタイム システムは毎朝08:10:00にジョブを実行します:
Trunc(Sysdate + 1) + (8*60 + 10)/24*60
固定間隔システムは、08:15:00、09:15:00、10:15:00など、1時間の15分にジョブを実行します。
Trunc(sysdate,'hh') + (60 + 15)/(24 * 60)
次の例に示すように、job_procストアドプロシージャを呼び出して、スケジュールされたジョブを作成します
。
   jobid INTEGER;
開始
   DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24*60)');
エンド; 
説明 スケジュールされたジョブの作成時に単一引用符を使用すると、ステートメントにネストされた引用符が作成されます。 これにより、構文エラーが発生する可能性があります。 次のサンプルステートメントは、例を提供します。
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'TRUNC(sysdate,'mi') + 1/(24*60)');

次の例に示すように、このエラーを防ぐには、対応するパラメーター値を $$ 記号で囲む必要があります。

DBMS_JOB.SUBMIT(jobid、'job_proc;'、SYSDATE、$$TRUNC(sysdate、'mi') + 1/(24*60)$);

スケジュールされたジョブの内容、開始時刻、実行間隔の変更

構文
CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)
表3. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
呼び出すストアドプロシージャの名前。
説明 現在の値を使用する場合は、このパラメーターをNULLに設定します。
next_dateスケジュールされたジョブの開始時刻。
説明 現在の値を使用する場合は、このパラメーターをNULLに設定します。
intervalスケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。
説明 現在の値を使用する場合は、このパラメーターをNULLに設定します。
ストアドプロシージャを変更せずに、ジョブIDが1のスケジュール済みジョブを変更するとします。 また、スケジュールされたジョブの開始時間を2020年12月29日に変更し、1時間の15分にジョブを実行する必要があります。 次のサンプルステートメントの例を示します。

    DBMS_JOB.CHANGE(1、NULL、TO_DATE('29-DEC-20 '、'DD-MON-YY')) 、$$ Trunc(sysdate、'hh') + (60 + 15)/(24*60)$);
エンド; 

スケジュールされたジョブの実行間隔の変更

構文
INTERVAL(job BINARY_INTEGER, interval VARCHAR2)
表4. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
intervalスケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。
ジョブIDが1のスケジュールジョブを変更するとします。 毎日01:00:00にジョブを実行する間隔を設定します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.INTERVAL(1、'TRUNC(sysdate) + 1 + 1/(24)');
エンド; 

スケジュールされたジョブの開始時刻の変更

構文
NEXT_DATE(job BINARY_INTEGER, next_date DATE)
表5. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
next_dateスケジュールされたジョブの開始時刻。
ジョブIDが1のスケジュールジョブを変更するとします。 スケジュールされたジョブの開始時刻を2020年12月30日に設定します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20 ','DD-MON-YY'));
エンド; 

スケジュールされたジョブの内容を変更する

構文
何 (job BINARY_INTEGER, WHAT VARCHAR2)
表6. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
呼び出すストアドプロシージャの名前。
ジョブIDが1のスケジュールジョブを変更するとします。 ストアドプロシージャをjob_proc2に変更します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.WHAT(1、'job_proc2');
エンド; 

スケジュールされたジョブの停止と開始

構文
BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])
表7. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
壊れたスケジュールされたジョブの状態。 有効な値:
  • true: スケジュールされたジョブの状態が異常です。 スケジュールジョブの状態が異常である場合、スケジュールジョブは停止される。 dbms_job.runコマンドを実行すると、状態が異常なスケジュールジョブを強制的に実行できます。
  • false: スケジュールされたジョブの状態が正常です。
next_dateスケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。
ジョブIDが1のスケジュールジョブの状態を異常として指定します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.BROKEN(1,true);
END; 
ジョブIDが1のスケジュールジョブの状態を正常として指定します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.BROKEN(1、false);
エンド; 

スケジュールされたジョブを強制的に実行する

構文
RUN(job BINARY_INTEGER)
表8. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
ジョブIDが1のスケジュールジョブを強制的に実行します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.RUN(1);
エンド; 

スケジュール済みタスクの削除

構文
REMOVE(job BINARY_INTEGER)
表9. パラメーター
パラメーター説明
仕事ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。
ジョブIDが1の予定ジョブを削除します。 次のサンプルステートメントの例を示します。

    DBMS_JOB.REMOVE(1);
エンド; 

スケジュールされたジョブの照会

次のステートメントを実行して、現在のユーザーが作成したスケジュール済みジョブのリストを照会できます。
select * fro m sys.us er_jobs;

スケジュールされたジョブの実行レコードの照会

次のステートメントを実行して、スケジュールされたジョブの実行レコードを照会できます。
select * from dbmsjob.pga_joblog;

データベース間でスケジュールされたジョブを実行する

DBMS_JOBパッケージは、postgresデータベースにのみ適用されます。 他のデータベースのスケジュール済みジョブを構成する場合は、postgresデータベースでクロスデータベースのスケジュール済みジョブを構成します。

例を使用して、データベース間でスケジュールされたジョブを構成する方法を説明します。 この例では、DBMS_JOBパッケージはpostgresデータベースで構成されています。 スケジュールされたジョブは、testという名前のデータベースで実行されるように構成されます。 この例では、testデータベースのテーブルに1分あたり1つのデータレコードを挿入します。 データベースの作成方法の詳細については、「データベースの作成」をご参照ください。

  1. jobrunという名前のテーブルとjob_procという名前のストアドプロシージャをtestデータベースに作成します。
    • 次のステートメントを実行して、jobrunという名前のテーブルを作成します。
      create table public.jobrun ()
          idシリアルNOT NULL PRIMARYキー、
          ランタイムVARCHAR2(40)
      ); 
    • 次のステートメントを実行して、job_procという名前のストアドプロシージャを作成します。
      create procedure public.job_proc
      IS
      開始
          INSERT INTO jobrun(runtime) VALUES ('job_proc run at '| | TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss));
      エンド; 
  2. postgresデータベースにスケジュールされたジョブを作成します。

    スケジュールされたジョブを実行するデータベースをDBMS_JOB.SUBMIT() 関数に追加する必要があります。 この例では、スケジュールされたジョブが実行されるデータベースの名前はtestです。 その他のパラメーターの詳細については、「スケジュールされたジョブの作成」をご参照ください。

    次のサンプルステートメントの例を示します。
    
       jobid INTEGER;
    開始
       DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24*60)','test');
    エンド; 
  3. postgresデータベース内のスケジュールされたジョブの状態と実行レコードを照会します。
    • スケジュールされたジョブを照会する:
      select * fro m sys.us er_jobs;
      次の出力が返されます:
      job | jobloguser | job_user | データベース | job_created | job_changed | last_date | last_sec | next_date | next_sec | total_time | interval | 障害 | what | instance
      ---- ------------ ---------------------- ---------------------------------- ---------------------------------- ---------------------------------- -------------------------------- ----------------- -----------------------
         1 | DBUSER | postgres | 29-OCT-20 02:38:49.478494 + 00:00 | BE-OCT-20 02:38:49.478494 + 00:00 | 29-OCT-20 02:51:12.025001 + 00:00 | 02:51:12 | 29-Ojms_END SELE_00:00 | GIdb_00:00 /N; GIobs_243224 * N ''、''test'');' ; END | 0 
    • 実行レコードのクエリ:
      select * from dbmsjob.pga_joblog;
      次の出力が返されます:
      jlgid | jlgjobid | jlgstatus | jlgstart | jlgduration
      ------- --------- --------------- ---------------------------------- -----------------
           1 | 1 | s | 29-OCT-20 02:38:49.762995 + 00:00 | 00:00:00.017495
           2 | 1 | s | 29-OCT-20 02:39:50.061113 + 00:00 | 00:00:00.016463
           3 | 1 | s | 29-OCT-20 02:40:50.062331 + 00:00 | 00:00:00.016244 
  4. testデータベースのjobrunテーブルのデータを照会します。

    実行するステートメントは、次のとおりです。

    select * from jobrun;
    次の出力が返されます:
    id | runtime
    ---- + -------------------------------------
      1 | job_procは2020-10-29 02:38:50で実行します
      2 | job_procは2020-10-29 02:39:50で実行します
      3 | job_procは2020-10-29 02:40:50
    で実行
説明 クロスデータベーススケジュールジョブに関する情報を変更する場合は、関数を変更するときに、スケジュールジョブを実行するデータベースの名前を追加する必要があります。 たとえば、実行間隔を前の例の1分ごとから2分ごとに変更する場合は、次のステートメント
を実行します。
    DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24*30)','test');
エンド;