Oracleで索引の同期を定期的に実行[DBMS_JOB]

メモ:  Category:oracle

Oracleに用意されているスケジュールに従ってジョブを実行してくれるDBMS_JOBパッケージについて確認していきます。Oracle10g以降は、DBMS_SCHEDULERを使うことを薦められています。

ここでは、DBMS_JOBを使用して定期的にCTX_DDL.SYNC_INDEXを実行します。

確認環境:Oracle9i[Release 9.2.0.1.0]

DBMS_JOBを使って索引を同期する

DBMS_JOBには、次の関数が用意されています。

関数名 概要
SUBMIT ジョブの登録します。
REMOVE ジョブキューからジョブを削除します。
CHANGE 登録済みジョブの設定(日時、間隔等)を変更します。
WHAT 実行するジョブ(ストアドプロシージャ)を変更します。
NEXT_DATE 登録済みジョブの次回の実行時間を変更します。
INSTANCE ジョブを実行できるインスタンス等を変更します。
INTERVAL 登録済みジョブの実行間隔を変更します。
BROKEN 登録済みジョブに中断フラグを設定します。
RUN 強制的にジョブを実行します。
USER_EXPORT -

ジョブの登録には、DBM_JOB.SUBMITを使用します。DBM_JOB.SUBMITを使って索引の同期を行うには次のように実行します。

DECLARE
    JOB NUMBER;
BEGIN
    -- 180分 間隔で実行
    DBMS_JOB.SUBMIT(JOB,'CTX_DDL.SYNC_INDEX('ITS_IDX');',
                    INTERVAL=>'SYSDATE+180/1440');
    COMMIT;
END;

上記スクリプトは、Oracleのホームディレクトリにあるctx\sample\script\drjobdml.sqlに用意されています。

実行間隔の設定例

-- 毎日 12:10 [計算例:12 * 3600 + 10 * 60 = 43800]
TRUNC(SYSDATE)+1+(43800/86400),

-- 毎週日曜日の 1:00
NEXT_DAY(TRUNC(SYSDATE),'日曜日')+(1/24)

登録済みジョブの確認

DBMS_JOBで登録されたジョブを確認するには、次のようなSELECT文を実行します。

SELECT * FROM USER_JOBS;

ジョブの削除

登録済みのジョブを削除するには、DBMS_JOB.REMOVEを使用します。DBMS_JOB.REMOVEには登録時に取得したジョブ番号を指定して削除します。

ジョブ番号は、SELECT * FROM USER_JOBS;でも確認できます。

BEGIN
    DBMS_JOB.REMOVE(3);
END;

bluenote by BBB