【Oracle】ジョブの確認方法(DBA_SCHEDULER_JOBS / DBA_JOBS)

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運用の基本です。新旧のスケジューラの違いを理解し、実行状態・履歴・エラーを適切に確認できるようになりましょう。