Oracleで索引の同期を定期的に実行[DBMS_JOB]
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;