【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

よくある質問

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を確認

あわせて読みたい