PolarDBは、スケジュールされたジョブのスケジュールと管理に使用されるDBMS_JOB拡張機能を提供します。 このトピックでは、スケジュールされたジョブを作成、管理、および削除する方法について説明します。
前提条件
PolarDBクラスターのカーネルバージョンは1.1.7以降です。リリースノート。
説明次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを照会できます。
SHOW polar_version;セキュリティ上の理由から、DBMS_JOB拡張機能を手動で作成することはできません。 DBMS_JOB拡張機能を作成するには、お問い合わせください。
使用上の注意
特権アカウントのみがDBMS_JOB拡張機能を使用できます。 特権アカウントの作成方法の詳細については、「データベースアカウントの作成」をご参照ください。
dbms_job拡張子は、
postgresデータベースにのみ作成できます。 他のデータベースのスケジュール済みジョブを構成する場合は、postgresデータベースでクロスデータベースのスケジュール済みジョブを構成します。 詳細については、「データベース間でのスケジュールされたジョブの実行」をご参照ください。
テストデータの準備
テストデータは、このトピックで提供されている例にのみ適用されます。
次の例に示すように、テスト用に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;DBMS_JOB拡張子の削除
DBMS_JOB拡張子を削除すると、DBMS_JOB拡張子に関連する既存のユーザージョブがすべて削除されます。
次の構文を使用して、DBMS_JOB拡張を削除できます。
DROP EXTENSION dbms_job CASCADE;スケジュールされたジョブの作成
構文
SUBMIT(job OUT BINARY_INTEGER, what VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]])表 1. Parameters
パラメーター | 説明 |
| 渡す |
| 呼び出すストアドプロシージャの名前。 このパラメーターを指定する必要があります。 このトピックの例では、 |
| スケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。 |
| スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。 |
表 2. インターバルの説明
実行間隔 | 例 |
毎分 | |
毎日 | システムは毎日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ストアドプロシージャを呼び出して、スケジュールされたジョブを作成します。
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)$$);スケジュールされたジョブの照会
次のステートメントを実行して、現在のユーザーが作成したスケジュール済みジョブを照会できます。
SELECT * FROM sys.user_jobs;スケジュールされたジョブの内容、開始時刻、実行間隔の変更
構文
CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)表 3. Parameters
パラメーター | 説明 |
| ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
| 呼び出すストアドプロシージャの名前。 説明 現在の値を使用する場合は、このパラメーターを |
| スケジュールされたジョブの開始時刻。 説明 現在の値を使用する場合は、このパラメーターを |
| スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。 説明 現在の値を使用する場合は、このパラメーターを |
ストアドプロシージャを変更せずに、ジョブIDが1のスケジュール済みジョブを変更するとします。 また、スケジュールされたジョブの開始時間を2020年12月29日に変更し、1時間の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. Parameters
パラメーター | 説明 |
| ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
| スケジュールされたジョブの実行間隔。 詳細は、「間隔の説明」をご参照ください。 |
ジョブIDが1のスケジュールジョブを変更するとします。 毎日01:00:00にジョブを実行する間隔を設定します。 次のサンプル文は例を示します。
BEGIN
DBMS_JOB.INTERVAL(1,'TRUNC(sysdate) + 1 + 1/(24)');
END;スケジュールされたジョブの開始時刻の変更
構文
NEXT_DATE(job BINARY_INTEGER, next_date DATE)表 5. Parameters
パラメーター | 説明 |
| ジョブ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. Parameters
パラメーター | 説明 |
| ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
| 呼び出すストアドプロシージャの名前。 |
ジョブIDが1のスケジュールジョブを変更するとします。 ストアドプロシージャをjob_proc2に変更します。 次のサンプル文は例を示します。
BEGIN
DBMS_JOB.WHAT(1,'job_proc2');
END;スケジュールされたジョブの停止と開始
構文
BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])表7. Parameters
パラメーター | 説明 |
| ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
| スケジュールされたジョブの状態。 有効な値:
|
| スケジュールされたジョブの開始時刻。 このパラメーターを指定しない場合、現在の時刻が自動的に使用されます。 |
ジョブIDが1のスケジュールジョブの状態を異常として指定します。 次のサンプル文は例を示します。
BEGIN
DBMS_JOB.BROKEN(1,true);
END;ジョブIDが1のスケジュールジョブの状態を通常通り指定します。 次のサンプル文は例を示します。
BEGIN
DBMS_JOB.BROKEN(1,false);
END;スケジュールされたジョブを強制的に実行する
構文
RUN(job BINARY_INTEGER)表8. Parameters
パラメーター | 説明 |
| ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
ジョブIDが1のスケジュールジョブを強制的に実行します。 次のサンプル文は例を示します。
BEGIN
DBMS_JOB.RUN(1);
END;クライアントツールを使用してデータベースに接続し、前述のステートメントを実行した後に、次のようなエラーメッセージが返された場合、クライアントツールはサポートされていません。 代わりにPolarDB-Toolsを使用します。 詳細については、「PolarDB-Tools」をご参照ください。
ERROR: syntax error at end of input
CONTEXT: polar-spl function dbms_job._run_job(integer,boolean) line 151 at RAISE line 547 of package bodyスケジュール済みタスクの削除
構文
REMOVE(job BINARY_INTEGER)表9. Parameters
パラメーター | 説明 |
| ジョブID。 ジョブIDを確認する方法の詳細については、「スケジュール済みジョブのクエリ」をご参照ください。 |
ジョブIDが1の予定ジョブを削除します。 次のサンプル文は例を示します。
BEGIN
DBMS_JOB.REMOVE(1);
END;スケジュールされたジョブの実行レコードの照会
次のステートメントを実行して、スケジュールされたジョブの実行レコードを照会できます。
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 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)','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 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 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
データベース間でスケジュールされたジョブに関する情報を変更する場合は、関数を変更するときに、スケジュールされたジョブを実行するpostgresデータベースの名前を追加する必要があります。 たとえば、実行間隔を前の例の1分ごとから2分ごとに変更する場合は、次のステートメントを実行します。
BEGIN
DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24 * 30)','test');
END;