Oracle 如何停止正在運行的 Job
先了解是dbms_job 還是 dbms_scheduler,再確定操作命令。
一 使用 DBMS_JOB 包停止作業(適用于舊版 Job)
1.1 查看正在運行的 Job
SELECT job, what, this_date, this_sec, failures, broken
FROM user_jobs
WHERE running = 1;
1.2 停止正在運行的 Job
-- 方法1:將作業標記為 broken 狀態
BEGINDBMS_JOB.BROKEN(job_id, TRUE);COMMIT;
END;
/-- 方法2:直接刪除作業
BEGINDBMS_JOB.REMOVE(job_id);COMMIT;
END;
/
二 使用 DBMS_SCHEDULER 包停止作業(推薦用于新版 Scheduler Job)
2.1 查看正在運行的 Scheduler Job
SELECT job_name, status, elapsed_time
FROM user_scheduler_running_jobs;
2.2 停止正在運行的 Scheduler Job
-- 方法1:停止單個作業
BEGINDBMS_SCHEDULER.STOP_JOB(job_name => 'YOUR_JOB_NAME', force => TRUE);
END;
/-- 方法2:停止所有運行中的作業(謹慎使用)
BEGINFOR r IN (SELECT job_name FROM user_scheduler_running_jobs) LOOPDBMS_SCHEDULER.STOP_JOB(r.job_name, force => TRUE);END LOOP;
END;
/
三 通過會話級別終止 Job
3.1 查找 Job 對應的會話
SELECT s.sid, s.serial#, s.username, s.program, j.job, j.what
FROM v$session s, dba_jobs_running jr, dba_jobs j
WHERE s.sid = jr.sid
AND jr.job = j.job;
3.2 終止會話
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
四 注意事項
-
強制停止 vs 正常停止:
force => FALSE
(默認):等待當前操作完成force => TRUE
:立即中斷
-
狀態檢查:
-- 檢查作業狀態 SELECT job_name, state FROM user_scheduler_jobs;-- 檢查作業運行歷史 SELECT * FROM user_scheduler_job_run_details ORDER BY log_date DESC;
-
自動重試:停止作業不會自動禁用,如需永久禁用:
BEGINDBMS_SCHEDULER.DISABLE('YOUR_JOB_NAME'); END; /
-
依賴關系:停止鏈式作業(chain job)時可能需要停止整個鏈
五 最佳實踐
-
先檢查后停止:
-- 檢查作業詳情 SELECT job_name, enabled, state, run_count, failure_count FROM user_scheduler_jobs WHERE job_name = 'YOUR_JOB_NAME';
-
記錄操作:
-- 記錄停止作業的操作 INSERT INTO job_control_log VALUES('YOUR_JOB_NAME', 'STOPPED', SYSDATE, USER); COMMIT;
-
后續處理:
- 停止后可能需要手動清理殘留數據
- 對于重要作業,停止后應考慮重新調度
更詳細的內容請查看官方文檔:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_JOB.html#GUID-8C62D808-D7A3-4D21-B87F-A229B7CE1956
謹記:心存敬畏,行有所止。