oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle停止正在运行的Job

一文详解Oracle如何停止正在运行的Job

作者:文牧之

Oracle Job是Oracle数据库中的一个核心特性,用于在预定义的时间执行特定的数据库任务,比如运行SQL脚本、数据备份、维护或性能监控等,这篇文章主要介绍了Oracle如何停止正在运行Job的相关资料,需要的朋友可以参考下

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 状态
BEGIN
  DBMS_JOB.BROKEN(job_id, TRUE);
  COMMIT;
END;
/

-- 方法2:直接删除作业
BEGIN
  DBMS_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:停止单个作业
BEGIN
  DBMS_SCHEDULER.STOP_JOB(job_name => 'YOUR_JOB_NAME', force => TRUE);
END;
/

-- 方法2:停止所有运行中的作业(谨慎使用)
BEGIN
  FOR r IN (SELECT job_name FROM user_scheduler_running_jobs) LOOP
    DBMS_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;

四 注意事项

  1. 强制停止 vs 正常停止

    • force => FALSE(默认):等待当前操作完成
    • force => TRUE:立即中断
  2. 状态检查

    -- 检查作业状态
    SELECT job_name, state FROM user_scheduler_jobs;
    
    -- 检查作业运行历史
    SELECT * FROM user_scheduler_job_run_details 
    ORDER BY log_date DESC;
    
  3. 自动重试:停止作业不会自动禁用,如需永久禁用:

    BEGIN
      DBMS_SCHEDULER.DISABLE('YOUR_JOB_NAME');
    END;
    /
    
  4. 依赖关系:停止链式作业(chain job)时可能需要停止整个链

五 最佳实践

  1. 先检查后停止

    -- 检查作业详情
    SELECT job_name, enabled, state, run_count, failure_count
    FROM user_scheduler_jobs
    WHERE job_name = 'YOUR_JOB_NAME';
    
  2. 记录操作

    -- 记录停止作业的操作
    INSERT INTO job_control_log 
    VALUES('YOUR_JOB_NAME', 'STOPPED', SYSDATE, USER);
    COMMIT;
    
  3. 后续处理

    • 停止后可能需要手动清理残留数据
    • 对于重要作业,停止后应考虑重新调度

更详细的内容请查看官方文档:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_JOB.html#GUID-8C62D808-D7A3-4D21-B87F-A229B7CE1956

总结

到此这篇关于Oracle如何停止正在运行的Job的文章就介绍到这了,更多相关Oracle停止正在运行的Job内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文