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

谨记:心存敬畏,行有所止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值