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 |
まとめ
| 項目 | 内容 |
|---|---|
| 新スケジューラ | DBA_SCHEDULER_JOBS でジョブ一覧、DBA_SCHEDULER_JOB_RUN_DETAILS で実行履歴 |
| 旧スケジューラ | DBA_JOBS でジョブ一覧、broken / failures で障害を検知 |
| 実行中の確認 | DBA_SCHEDULER_RUNNING_JOBS / DBA_JOBS_RUNNING |
| 権限なしの場合 | USER_SCHEDULER_JOBS / USER_JOBS を使う |
ジョブの確認はOracle運用の基本です。新旧のスケジューラの違いを理解し、実行状態・履歴・エラーを適切に確認できるようになりましょう。