Oracleデータベースで「ジョブの一覧や実行状況を確認したい」と思ったことはありませんか?
定期バッチや自動処理の管理において、ジョブの確認は欠かせない作業です。
この記事では、DBA_SCHEDULER_JOBS(新スケジューラ)とDBA_JOBS(旧DBMS_JOB)の違いから、実行履歴・エラーログの確認方法、ジョブが動かないときのトラブルシューティングまで、実務で必要なSQLをすべて解説します。
新旧2つのジョブスケジューラ
Oracleには2種類のジョブスケジューラがあります。Oracle 10g以降は新しい DBMS_SCHEDULER が推奨されていますが、旧 DBMS_JOB が使われているシステムも多く存在します。
| 項目 | DBMS_SCHEDULER(新) | DBMS_JOB(旧) |
|---|---|---|
| 導入バージョン | Oracle 10g〜 | Oracle 8i〜 |
| 管理ビュー | DBA_SCHEDULER_JOBS |
DBA_JOBS |
| 実行履歴 | DBA_SCHEDULER_JOB_RUN_DETAILS |
なし(独自実装が必要) |
| スケジュール定義 | カレンダー式・繰り返し構文 | 日付の計算式 |
| チェーン(依存関係) | 対応 | 非対応 |
DBA_SCHEDULER_JOBS:ジョブ一覧の確認
新スケジューラ(DBMS_SCHEDULER)で作成されたジョブの一覧を確認します。
-- ジョブ一覧(基本情報)
SELECT job_name,
owner,
enabled,
state,
last_start_date,
next_run_date
FROM dba_scheduler_jobs
ORDER BY job_name;
各カラムの意味
| カラム | 説明 |
|---|---|
job_name |
ジョブの名前 |
owner |
ジョブの所有者(スキーマ) |
enabled |
有効(TRUE)/ 無効(FALSE) |
state |
状態(SCHEDULED / RUNNING / SUCCEEDED / FAILED / DISABLED) |
last_start_date |
最後に実行開始した日時 |
next_run_date |
次回実行予定日時 |
有効なジョブだけに絞り込む
-- 有効なジョブのみ表示 SELECT job_name, state, next_run_date FROM dba_scheduler_jobs WHERE enabled = 'TRUE' ORDER BY next_run_date;
ジョブの詳細情報(実行内容を含む)
-- ジョブの実行アクション・スケジュールも確認
SELECT job_name,
job_type,
job_action,
repeat_interval,
enabled,
state
FROM dba_scheduler_jobs
WHERE owner = 'スキーマ名';
DBA_JOBS:旧ジョブの確認
旧スケジューラ(DBMS_JOB)で作成されたジョブを確認します。レガシーシステムではこちらが使われていることが多いです。
-- 旧ジョブの一覧
SELECT job,
schema_user,
what,
last_date,
this_date,
next_date,
broken,
failures
FROM dba_jobs
ORDER BY job;
各カラムの意味
| カラム | 説明 |
|---|---|
job |
ジョブID(数値) |
schema_user |
ジョブの所有スキーマ |
what |
実行する PL/SQL ブロック |
last_date |
最後に正常完了した日時 |
this_date |
現在実行中の場合、その開始日時(NULLなら実行中でない) |
next_date |
次回実行予定日時 |
broken |
Y: 壊れている / N: 正常 |
failures |
連続失敗回数(16回で自動的にbrokenになる) |
壊れたジョブ(broken)を検出する
-- brokenになっているジョブを検索 SELECT job, schema_user, what, failures, broken FROM dba_jobs WHERE broken = 'Y';
実行中のジョブを確認する
現在実行中のジョブをリアルタイムで確認する方法です。
新スケジューラの場合
-- 現在実行中のスケジューラジョブ SELECT job_name, owner, session_id, elapsed_time FROM dba_scheduler_running_jobs;
旧DBMS_JOBの場合
-- 現在実行中の旧ジョブ SELECT j.job, j.schema_user, j.what, r.sid FROM dba_jobs j JOIN dba_jobs_running r ON j.job = r.job;
ジョブの実行履歴・ログを確認する
新スケジューラでは、ジョブの実行履歴が自動的に記録されます。
最近の実行履歴
-- 直近の実行履歴(新しい順に20件)
SELECT job_name,
status,
actual_start_date,
run_duration,
error#,
additional_info
FROM dba_scheduler_job_run_details
ORDER BY actual_start_date DESC
FETCH FIRST 20 ROWS ONLY;
特定ジョブの実行履歴
-- 特定ジョブの履歴を確認
SELECT status,
actual_start_date,
run_duration,
error#,
additional_info
FROM dba_scheduler_job_run_details
WHERE job_name = 'ジョブ名'
ORDER BY actual_start_date DESC;
失敗したジョブだけを抽出
-- 失敗した実行のみ表示
SELECT job_name,
actual_start_date,
error#,
additional_info
FROM dba_scheduler_job_run_details
WHERE status = 'FAILED'
ORDER BY actual_start_date DESC;
ジョブが動かないときのトラブルシューティング
1. ジョブが無効(DISABLED)になっている
-- 状態を確認
SELECT job_name, enabled, state
FROM dba_scheduler_jobs
WHERE job_name = 'ジョブ名';
-- 有効にする
BEGIN
DBMS_SCHEDULER.ENABLE('ジョブ名');
END;
/
2. 旧ジョブがbrokenになっている
16回連続で失敗すると自動的に broken = Y になります。
-- brokenを解除する BEGIN DBMS_JOB.BROKEN(ジョブID, FALSE); COMMIT; END; /
3. ジョブキュープロセスが停止している
旧DBMS_JOBの場合、JOB_QUEUE_PROCESSES パラメータが0だとジョブが実行されません。
-- 設定を確認 SHOW PARAMETER job_queue_processes; -- 0の場合は変更(例: 最大10プロセス) ALTER SYSTEM SET job_queue_processes = 10;
自分のジョブだけを確認する(DBA権限がない場合)
DBA権限がなくても、自分のジョブは以下のビューで確認できます。
-- 新スケジューラ: 自分のジョブ SELECT job_name, enabled, state, next_run_date FROM user_scheduler_jobs; -- 旧DBMS_JOB: 自分のジョブ SELECT job, what, next_date, broken FROM user_jobs;
よく使うクエリまとめ
| やりたいこと | SQL |
|---|---|
| 全ジョブ一覧(新) | SELECT * FROM dba_scheduler_jobs |
| 全ジョブ一覧(旧) | SELECT * FROM dba_jobs |
| 実行中のジョブ | SELECT * FROM dba_scheduler_running_jobs |
| 実行履歴 | SELECT * FROM dba_scheduler_job_run_details |
| 失敗ログ | WHERE status = 'FAILED' で絞り込み |
| 壊れたジョブ | SELECT * FROM dba_jobs WHERE broken = 'Y' |
| 自分のジョブ | user_scheduler_jobs / user_jobs |
よくある質問
Q. DBA_SCHEDULER_JOBS と DBA_JOBS の違いは何ですか?
A.
DBA_SCHEDULER_JOBS は Oracle 10g 以降の新スケジューラ(DBMS_SCHEDULER)で作成されたジョブの管理ビューです。実行履歴・カレンダー式・チェーンなど高機能です。DBA_JOBS は旧スケジューラ(DBMS_JOB)用で、Oracle 8i 以前から使われているレガシーな仕組みです。新規開発では DBMS_SCHEDULER を使うことが推奨されています。Q. DBA権限がなくてもジョブを確認できますか?
A. はい、自分のジョブであれば
USER_SCHEDULER_JOBS(新)または USER_JOBS(旧)で確認できます。他のユーザーのジョブを確認するには DBA 権限または SELECT ANY DICTIONARY 権限が必要です。Q. ジョブが BROKEN になった場合、どうすればいいですか?
A. 旧スケジューラ(
DBMS_JOB)では16回連続失敗で broken = Y になります。DBMS_JOB.BROKEN(ジョブID, FALSE) で解除できます。エラーの原因(実行する PL/SQL ブロックのバグ・権限不足など)を修正してから BROKEN 解除してください。新スケジューラでは DBMS_SCHEDULER.ENABLE('ジョブ名') で再有効化できます。Q. ジョブの実行履歴はどれくらい保持されますか?
A.
DBA_SCHEDULER_JOB_RUN_DETAILS の保持期間は DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('log_history', '30') で日数を設定できます。デフォルトは30日です。旧スケジューラ(DBA_JOBS)には実行履歴ビューがないため、独自にログテーブルを実装する必要があります。Q. ジョブの次回実行日時を変更したいのですが?
A. 新スケジューラでは
DBMS_SCHEDULER.SET_ATTRIBUTE('ジョブ名', 'start_date', SYSTIMESTAMP) で変更できます。旧スケジューラでは DBMS_JOB.NEXT_DATE(ジョブID, SYSDATE) で次回実行日時を変更できます。すぐに実行したい場合は DBMS_SCHEDULER.RUN_JOB('ジョブ名') で手動実行も可能です。まとめ
Oracle ジョブ確認のポイント
- 新スケジューラ:
DBA_SCHEDULER_JOBS(一覧)+DBA_SCHEDULER_JOB_RUN_DETAILS(実行履歴) - 旧スケジューラ:
DBA_JOBS(一覧)+broken/failuresで障害検知 - 実行中の確認:
DBA_SCHEDULER_RUNNING_JOBS/DBA_JOBS_RUNNING - DBA権限なしの場合:
USER_SCHEDULER_JOBS/USER_JOBSを使う - ジョブが動かない → 無効化(DISABLED)・BROKEN・JOB_QUEUE_PROCESSESを確認