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
谨记:心存敬畏,行有所止。