PolarDBは、スケジュールされたジョブをスケジュールおよび管理するために使用されるDBMS_JOBパッケージを提供します。 このトピックでは、スケジュールされたジョブを作成、管理、および削除する方法について説明します。
前提条件
- DBMS_JOBパッケージを手動で有効にするには、次の手順を実行します。
- PolarDBコンソールにログインし、DBMS_JOBパッケージを有効にするクラスターの名前をクリックします。
- 左側のナビゲーションペインで、 を選択します。
- 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 ]])
パラメーター | 説明 |
仕事 | 渡すjobid 値。 jobid値を渡すと、送信されたジョブのIDが返されます。 ジョブIDは自動的に生成され、ジョブごとに一意です。 |
何 | 呼び出すストアドプロシージャの名前。 このパラメーターを指定する必要があります。 このトピックの例では、job_proc ストアドプロシージャを使用しています。 |
next_date | スケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。 |
interval | スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。 |
実行間隔 | 例 |
毎分 |
|
毎日 | システムは毎日01:00:00にジョブを実行します:
|
毎週 | システムは毎週月曜日の01:00:00にジョブを実行します:
|
毎月 | システムは毎月1日の01:00:00にジョブを実行します:
|
四半期ごと | システムは、四半期ごとの初日の01:00:00にジョブを実行します。
|
毎年 | システムは毎年1月1日の01:00:00にジョブを実行します:
|
定点インタイム | システムは毎朝08:10:00にジョブを実行します:
|
固定間隔 | システムは、08:15:00、09:15:00、10:15:00など、1時間の15分にジョブを実行します。
|
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)$);
スケジュールされたジョブの内容、開始時刻、実行間隔の変更
構文
ストアドプロシージャを変更せずに、ジョブIDが1のスケジュール済みジョブを変更するとします。 また、スケジュールされたジョブの開始時間を2020年12月29日に変更し、1時間の15分にジョブを実行する必要があります。 次のサンプルステートメントの例を示します。
CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
何 | 呼び出すストアドプロシージャの名前。 説明 現在の値を使用する場合は、このパラメーターを NULL に設定します。 |
next_date | スケジュールされたジョブの開始時刻。 説明 現在の値を使用する場合は、このパラメーターを NULL に設定します。 |
interval | スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。 説明 現在の値を使用する場合は、このパラメーターを NULL に設定します。 |
DBMS_JOB.CHANGE(1、NULL、TO_DATE('29-DEC-20 '、'DD-MON-YY')) 、$$ Trunc(sysdate、'hh') + (60 + 15)/(24*60)$);
エンド;
スケジュールされたジョブの実行間隔の変更
構文
ジョブIDが1のスケジュールジョブを変更するとします。 毎日01:00:00にジョブを実行する間隔を設定します。 次のサンプルステートメントの例を示します。
INTERVAL(job BINARY_INTEGER, interval VARCHAR2)
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
interval | スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。 |
DBMS_JOB.INTERVAL(1、'TRUNC(sysdate) + 1 + 1/(24)');
エンド;
スケジュールされたジョブの開始時刻の変更
構文
ジョブIDが1のスケジュールジョブを変更するとします。 スケジュールされたジョブの開始時刻を2020年12月30日に設定します。 次のサンプルステートメントの例を示します。
NEXT_DATE(job BINARY_INTEGER, next_date DATE)
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
next_date | スケジュールされたジョブの開始時刻。 |
DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20 ','DD-MON-YY'));
エンド;
スケジュールされたジョブの内容を変更する
構文
ジョブIDが1のスケジュールジョブを変更するとします。 ストアドプロシージャを
何 (job BINARY_INTEGER, WHAT VARCHAR2)
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
何 | 呼び出すストアドプロシージャの名前。 |
job_proc2
に変更します。 次のサンプルステートメントの例を示します。
DBMS_JOB.WHAT(1、'job_proc2');
エンド;
スケジュールされたジョブの停止と開始
構文
ジョブIDが1のスケジュールジョブの状態を異常として指定します。 次のサンプルステートメントの例を示します。
BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
壊れた | スケジュールされたジョブの状態。 有効な値:
|
next_date | スケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。 |
DBMS_JOB.BROKEN(1,true);
END;
ジョブIDが1のスケジュールジョブの状態を正常として指定します。 次のサンプルステートメントの例を示します。
DBMS_JOB.BROKEN(1、false);
エンド;
スケジュールされたジョブを強制的に実行する
構文
ジョブIDが1のスケジュールジョブを強制的に実行します。 次のサンプルステートメントの例を示します。
RUN(job BINARY_INTEGER)
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
DBMS_JOB.RUN(1);
エンド;
スケジュール済みタスクの削除
構文
ジョブIDが1の予定ジョブを削除します。 次のサンプルステートメントの例を示します。
REMOVE(job BINARY_INTEGER)
パラメーター | 説明 |
仕事 | ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
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つのデータレコードを挿入します。 データベースの作成方法の詳細については、「データベースの作成」をご参照ください。
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)); エンド;
- 次のステートメントを実行して、
postgres
データベースにスケジュールされたジョブを作成します。スケジュールされたジョブを実行するデータベースを
DBMS_JOB.SUBMIT()
関数に追加する必要があります。 この例では、スケジュールされたジョブが実行されるデータベースの名前はtest
です。 その他のパラメーターの詳細については、「スケジュールされたジョブの作成」をご参照ください。次のサンプルステートメントの例を示します。jobid INTEGER; 開始 DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24*60)','test'); エンド;
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
- スケジュールされたジョブを照会する:
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');
エンド;