PolarDB は、タスクのスケジュールと管理を行うための DBMS_JOB パッケージを提供します。このトピックでは、定期タスクの作成、管理、削除方法について説明します。セキュリティイベントのため、このプラグインはデータベースカーネルバージョン 2.0.14.19.39.1 以降ではデフォルトで無効になっていることにご注意ください。定期タスクを管理するための、より安全で効率的な代替手段として pg_cron を使用することを推奨します。
テストデータの準備
このセクションのテストデータは、このトピックの例にのみ適用されます。
テスト用に jobrun という名前のテーブルを作成します。以下に例を示します。
CREATE TABLE jobrun (
id serial NOT NULL PRIMARY KEY,
runtime VARCHAR2(40)
);job_proc という名前のストアドプロシージャを作成します。以下に例を示します。
CREATE PROCEDURE job_proc
IS
BEGIN
INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
END;定期タスクの作成
構文
SUBMIT(job OUT BINARY_INTEGER, what VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]])表 1. パラメーターの説明
パラメーター | 説明 |
| 送信されたタスクの ID を返すために |
| 呼び出すストアドプロシージャの名前。このパラメーターは空にできません。このトピックでは、 |
| 定期タスクの開始時刻。このパラメーターを指定しない場合、デフォルトで現在の時刻が使用されます。 |
| 定期タスクの実行間隔。詳細については、「INTERVAL リファレンス」をご参照ください。 |
表 2. INTERVAL リファレンス
実行間隔 | 例 |
毎分実行 | |
毎日特定の時刻に実行 | 毎日 01:00 に実行: |
毎週特定の時刻に実行 | 毎週月曜日の 01:00 に実行: |
毎月特定の時刻に実行 | 毎月 1 日の 01:00 に実行: |
四半期ごとに特定の時刻に実行 | 四半期ごとの 1 日目の 01:00 に実行: |
毎年特定の時刻に実行 | 毎年 1 月 1 日の 01:00 に実行: |
固定時刻に実行 | 毎朝 08:10 に実行: |
固定間隔で実行 | 毎時 15 分に実行 (例:08:15、09:15、10:15)。 |
job_proc ストアドプロシージャを呼び出して、定期タスクを作成します。以下に例を示します。
DECLARE
jobid INTEGER;
BEGIN
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)');
END;定期タスクの時刻に単一引用符を使用すると、ネストされた引用符が構文エラーを引き起こします。次の文は、誤った構文の例です。
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 の表示方法については、「定期タスクの表示」をご参照ください。 |
| 呼び出すストアドプロシージャの名前。 説明 現在の値を変更しない場合は、このパラメーターを |
| 定期タスクの開始時刻。 説明 現在の値を変更しない場合は、このパラメーターを |
| 定期タスクの実行間隔。詳細については、「INTERVAL リファレンス」をご参照ください。 説明 現在の値を変更しない場合は、このパラメーターを |
タスク ID 1 の定期タスクを変更します。呼び出されるストアドプロシージャは変更しません。開始時刻を 2020年12月29日 に変更し、実行間隔を毎時 15 分に設定します。以下に例を示します。
BEGIN
DBMS_JOB.CHANGE(1,NULL,TO_DATE('29-DEC-20','DD-MON-YY'),$$Trunc(sysdate,'hh') + (60+15)/(24*60)$$);
END;定期タスクの実行間隔の変更
構文
INTERVAL(job BINARY_INTEGER, interval VARCHAR2)表 4. パラメーターの説明
パラメーター | 説明 |
| タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。 |
| 定期タスクの実行間隔。詳細については、「INTERVAL リファレンス」をご参照ください。 |
タスク ID 1 の定期タスクを変更します。実行間隔を毎日 01:00 に変更します。以下に例を示します。
BEGIN
DBMS_JOB.INTERVAL(1,'TRUNC(sysdate) + 1 + 1/(24)');
END;定期タスクの実行時刻の変更
構文
NEXT_DATE(job BINARY_INTEGER, next_date DATE)表 5. パラメーターの説明
パラメーター | 説明 |
| タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。 |
| 定期タスクの開始時刻。 |
タスク ID 1 の定期タスクを変更し、開始時刻を 2020年12月30日 に設定します。以下に例を示します。
BEGIN
DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20','DD-MON-YY'));
END;定期タスクの内容の変更
構文
WHAT(job BINARY_INTEGER, what VARCHAR2)表 6. パラメーターの説明
パラメーター | 説明 |
| タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。 |
| 呼び出されるストアドプロシージャの名前。 |
タスク ID 1 の定期タスクを変更します。呼び出されるストアドプロシージャを job_proc2 に変更します。以下に例を示します。
BEGIN
DBMS_JOB.WHAT(1,'job_proc2');
END;定期タスクの停止と開始
構文
BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])表 7. パラメーターの説明
パラメーター | 説明 |
| タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。 |
| 定期タスクの状態。有効値:
|
| 定期タスクの開始時刻。このパラメーターを指定しない場合、デフォルトで現在の時刻が使用されます。 |
タスク ID 1 の定期タスクの状態を broken に設定します。以下に例を示します。
BEGIN
DBMS_JOB.BROKEN(1,true);
END;タスク ID 1 の定期タスクの状態を normal に設定します。以下に例を示します。
BEGIN
DBMS_JOB.BROKEN(1,false);
END;定期タスクの強制開始
構文
RUN(job BINARY_INTEGER)表 8. パラメーターの説明
パラメーター | 説明 |
| タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。 |
タスク ID 1 の定期タスクを強制的に開始します。以下に例を示します。
BEGIN
DBMS_JOB.RUN(1);
END;定期タスクの削除
構文
REMOVE(job BINARY_INTEGER)表 9. パラメーターの説明
パラメーター | 説明 |
| タスク ID。タスク ID の表示方法については、「定期タスクの表示」をご参照ください。 |
タスク ID 1 の定期タスクを削除します。以下に例を示します。
BEGIN
DBMS_JOB.REMOVE(1);
END;定期タスクの表示
次の文を実行して、現在のユーザーが作成した定期タスクのリストを表示します。
SELECT * FROM sys.user_jobs;タスク実行レコードの表示
次の文を実行して、定期タスクの実行レコードを表示します。
SELECT * FROM all_scheduler_job_run_details;データベース間の定期タスクの実行
DBMS_JOB エクステンションは postgres データベースでのみ設定できます。他のデータベースに定期タスクを設定するには、データベース間のタスクを設定する必要があります。
次の例では、DBMS_JOB エクステンションは postgres データベースで設定され、test データベースで実行されます。このタスクは、test データベースのテーブルに 1 分ごとに 1 つのデータレコードを挿入します。データベースの作成方法の詳細については、「データベース管理」をご参照ください。
testデータベースで、jobrunという名前のテーブルとjob_procという名前のストアドプロシージャを作成します。jobrunという名前のテーブルを作成します。以下にコマンドの例を示します。CREATE TABLE public.jobrun ( id serial NOT NULL PRIMARY KEY, runtime VARCHAR2(40) );job_procという名前のストアドプロシージャを作成します。以下にコマンドの例を示します。CREATE PROCEDURE public.job_proc IS BEGIN INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); END;
postgresデータベースに切り替えて、定期タスクを作成します。DBMS_JOB.SUBMIT()関数にターゲットデータベースを追加する必要があります。この例では、ターゲットデータベースはtestです。他のパラメーターの詳細については、「定期タスクの作成」をご参照ください。例:
DECLARE jobid INTEGER; BEGIN DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)', false, 'test'); END;postgresデータベースで、定期タスクの状態と実行レコードを表示できます。定期タスクの表示:
SELECT * FROM sys.user_jobs;コマンドは次の結果を返します。
job | jobloguser | job_user | database | job_created | job_changed | last_date | last_sec | next_date | next_sec | total_time | broken | interval | failures | what | instance -----+------------+----------+----------+----------------------------------+----------------------------------+----------------------------------+----------+---------------------------+----------+-----------------+--------+------------------------------------------+----------+-----------------------------------------------------------------------------------------------------------------+---------- 1 | DBUSER | dbuser | postgres | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:51:12.025001 +00:00 | 02:51:12 | 29-OCT-20 02:53:12 +00:00 | 02:53:12 | 00:00:00.243224 | N | BEGIN return SYSDATE + 1/(24 * 30); END; | 0 | BEGIN EXECUTE IMMEDIATE 'SELECT dbmsjob.dbms_job_internal_job_link(''BEGIN job_proc; END;'', ''test'');' ; END | 0実行レコードの表示:
SELECT * FROM all_scheduler_job_run_details;コマンドは次の結果を返します。
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データベースに切り替えて、テーブル内のデータをクエリします。以下はクエリコマンドです。
SELECT * FROM jobrun;コマンドは次の結果を返します。
id | runtime ----+------------------------------------- 1 | job_proc run at 2020-10-29 02:38:50 2 | job_proc run at 2020-10-29 02:39:50 3 | job_proc run at 2020-10-29 02:40:50
データベース間のタスクを変更するには、関数を変更するときに対応するデータベース名を指定する必要があります。たとえば、実行間隔を毎分から 2 分ごとに変更するには、次のコードを使用します。
BEGIN
DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24 * 30)','test');
END;