[Oracle] ジョブキューを利用したタスクのスケジューリング | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

定期的にアナライズやバックアップなどを行いたい場合、OSやサードパーティー製のジョブ管理ソフトなどを利用してSQLスクリプトを実行するというのが一般的なやり方だと思いますが、Oracleのジョブキューを使えばすべてOracleの世界だけで完結させることができます。


Oracleのジョブキューを利用するにはまず、JOB_QUEUE_PROCESSES初期化パラメータを1以上に設定します。


たったこれだけです。


ジョブの管理には、DBMS_JOBパッケージを利用します。


DBMS_JOBパッケージにはジョブの登録・変更・削除などを行うためのプロシージャが用意されており、ユーザーが必要に応じて実行します。


例えば、毎日3時にSCOTTスキーマをアナライズするジョブを登録する場合、以下のようにプロシージャを実行します。

variable jobno number;
BEGIN
  DBMS_JOB.SUBMIT( :jobno, 'DBMS_UTILITY.ANALYZE_SCHEMA( ''SCOTT'', ''COMPUTE'' );', 
    TO_DATE( '2004/11/20 03:00:00', 'YYYY/MM/DD HH24:MI:SS' ), 'SYSDATE+1' );
END;
/


1つ目の引数はジョブ番号を返す出力パラメータ。
2つ目の引数は実行するSQL。
3つ目の引数は実行時刻。
4つ目の引数は実行間隔。

登録したジョブはDBA_JOBS、USER_JOBS、ALL_JOBSを検索することによって確認できます。


なお、ジョブの登録では以下のような点に注意が必要です。

ジョブの実行ユーザーの権限について
ジョブの実行ユーザーはジョブを登録したユーザーとなるので、権限についてはあらかじめ確認しておいた方がいいでしょう。

ジョブの実行開始時刻の遅延について
Oracleが稼働中であればジョブは指定した実行時刻に実行されますが、指定した実行時刻にOracleが稼働していなかった場合はそれ以降にはじめてOracleが起動された直後に実行されます。
運用環境であれば無停止稼働であることがほとんどなので問題ないと思いますが、開発・テスト環境、特に個人のPC環境などの場合は注意が必要です。
また、無停止稼働していたとしても数ミリ秒~数秒程度の遅延は生じるので秒単位の精度が求められるようなジョブの実行には向いていません。

次回実行時刻について
実行間隔は指定した実行時刻からの間隔ではなく、実際にジョブが起動された時刻からの間隔となります。
したがって、前述のような事情で実行時刻がずれてしまった場合は次回の実行時刻もずれてしまうことになります。
そのため、実行間隔は実行時刻の遅延も考慮に入れて設定する必要があります。
例えば、実行時刻が24時間以上遅延することはないという前提で1週間後の午前0時に実行したいのであれば、'TRUNC(SYSDATE) + 7'というような計算式を設定しておきます。

フロー制御など、ちょっと複雑なことをやろうと思うと役不足ではありますが、上記の点さえクリアすれば、ちょっとしたジョブのスケジューリングなどには十分に使えます。


WindowsのATコマンドみたいなものって感じでしょうか。