核心參數
| 參數 | 說明 | 範圍 | 對應進程 |
| JOB_QUEUE_PROCESSES | 並發 JOB 執行進程數 | 0~36 (0=停用) | 9i 前 SNPn,9i 後 CJQn |
| JOB_QUEUE_INTERVAL | 喚醒間隔 (秒) | 1~3600 | 定期掃描待執行 JOB |
-- 檢查實際運行進程
SELECT * FROM v$bgprocess WHERE paddr IS NOT NULL; -- 空閒
SELECT * FROM v$bgprocess WHERE paddr IS NULL; -- 忙碌
分級排查流程
- 參數確認:
JOB_QUEUE_PROCESSES > 0、Interval 合理 (建議 60~300 秒)。
- JOB 狀態檢視:
SELECT job, broken, last_date, next_date, what FROM dba_jobs;
BROKEN = 'Y' 或 NEXT_DATE = 4000-01-01 → 需修復:EXEC DBMS_JOB.BROKEN(job_id, FALSE);
LAST_DATE 正常但 NEXT_DATE 錯誤 → 檢查 INTERVAL 運算式。
- 運行中 JOB 檢查:
SELECT * FROM dba_jobs_running;
長時間 Running → 查 V$ACCESS、V$LOCKED_OBJECT 找阻塞源,殺死阻塞 Session 或 JOB 自身 Session 後重試。
- 重啟 JOB 進程 (疑似進程掛死):
ALTER SYSTEM SET job_queue_processes = 0;
-- 等待 5-10 秒
ALTER SYSTEM SET job_queue_processes = 原值;
- 9i 已知 Bug:運行 497 天計數器溢位歸零導致停止排程,需重啟資料庫 (10g+ 已修復)。
- 手工測試:
EXEC DBMS_JOB.RUN(job_id);
觀察錯誤堆疊,排查程式邏輯/資料量/網路問題。
常用排程頻率運算式速查
| 需求 | INTERVAL 運算式 |
| 每天固定 08:10 | TRUNC(SYSDATE+1) + (8*60+10)/(24*60) |
| 每天午夜 | TRUNC(SYSDATE+1) |
| 每週 | TRUNC(SYSDATE+7) |
| 每月 | TRUNC(SYSDATE+30) (近似) |
| 每週日 | NEXT_DAY(TRUNC(SYSDATE), 'SUNDAY') |
| 每天 06:00 | TRUNC(SYSDATE+1) + 6/24 |
| 每 30 分鐘 | SYSDATE + 30/1440 |
| 每小時第 15 分 (08:15, 09:15...) | TRUNC(SYSDATE,'HH') + 75/1440 (注意:+15/1440 會落在上一小時) |
最佳實踐建議
- 生產庫
JOB_QUEUE_PROCESSES 設 5~10,視並發度調整。
- 關鍵 JOB 設
BROKEN=FALSE 並監控 LAST_DATE。
- 長時間 JOB 拆分為鏈式 JOB 或改用
DBMS_SCHEDULER (10g+ 功能更強)。
- 定期清理
DBA_JOBS 中失效/測試 JOB。