李的的 發表於 2025-9-18 09:06:59

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">Oracle 如何停止正在运行的 Job</a></li><li><a href="#_label1">一 使用 DBMS_JOB 包停止作业(适用于旧版 Job)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.1 查看正在运行的 Job</a></li><li><a href="#_lab2_1_1">1.2 停止正在运行的 Job</a></li></ul><li><a href="#_label2">二 使用 DBMS_SCHEDULER 包停止作业(推荐用于新版 Scheduler Job)</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">2.1 查看正在运行的 Scheduler Job</a></li><li><a href="#_lab2_2_3">2.2 停止正在运行的 Scheduler Job</a></li></ul><li><a href="#_label3">三 通过会话级别终止 Job</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_4">3.1 查找 Job 对应的会话</a></li><li><a href="#_lab2_3_5">3.2 终止会话</a></li></ul><li><a href="#_label4">四 注意事项</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">五 最佳实践</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>Oracle 如何停止正在运行的 Job</h2>
<p>先了解是<strong>dbms_job</strong> 还是 <strong>dbms_scheduler</strong>,再确定操作命令。</p>
<p class="maodian"><a name="_label1"></a></p><h2>一 使用 DBMS_JOB 包停止作业(适用于旧版 Job)</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.1 查看正在运行的 Job</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT job, what, this_date, this_sec, failures, broken
FROM user_jobs
WHERE running = 1;
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1.2 停止正在运行的 Job</h3>
<div class="jb51code"><pre class="brush:sql;">-- 方法1:将作业标记为 broken 状态
BEGIN
DBMS_JOB.BROKEN(job_id, TRUE);
COMMIT;
END;
/

-- 方法2:直接删除作业
BEGIN
DBMS_JOB.REMOVE(job_id);
COMMIT;
END;
/
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>二 使用 DBMS_SCHEDULER 包停止作业(推荐用于新版 Scheduler Job)</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>2.1 查看正在运行的 Scheduler Job</h3>
<div class="jb51code"><pre class="brush:sql;">SELECT job_name, status, elapsed_time
FROM user_scheduler_running_jobs;
</pre></div>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>2.2 停止正在运行的 Scheduler Job</h3>
<div class="jb51code"><pre class="brush:sql;">-- 方法1:停止单个作业
BEGIN
DBMS_SCHEDULER.STOP_JOB(job_name =&gt; 'YOUR_JOB_NAME', force =&gt; TRUE);
END;
/

-- 方法2:停止所有运行中的作业(谨慎使用)
BEGIN
FOR r IN (SELECT job_name FROM user_scheduler_running_jobs) LOOP
    DBMS_SCHEDULER.STOP_JOB(r.job_name, force =&gt; TRUE);
END LOOP;
END;
/
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>三 通过会话级别终止 Job</h2>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>3.1 查找 Job 对应的会话</h3>
<div class="jb51code"><pre class="brush:sql;">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;
</pre></div>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>3.2 终止会话</h3>
<div class="jb51code"><pre class="brush:sql;">ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>四 注意事项</h2>
<ol><li><p><strong>强制停止 vs 正常停止</strong>:</p>
<ul><li><code>force =&gt; FALSE</code>(默认):等待当前操作完成</li><li><code>force =&gt; TRUE</code>:立即中断</li></ul></li><li><p><strong>状态检查</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">-- 检查作业状态
SELECT job_name, state FROM user_scheduler_jobs;

-- 检查作业运行历史
SELECT * FROM user_scheduler_job_run_details
ORDER BY log_date DESC;
</pre></div></li><li><p><strong>自动重试</strong>:停止作业不会自动禁用,如需永久禁用:</p>
<div class="jb51code"><pre class="brush:sql;">BEGIN
DBMS_SCHEDULER.DISABLE('YOUR_JOB_NAME');
END;
/
</pre></div></li><li><p><strong>依赖关系</strong>:停止链式作业(chain job)时可能需要停止整个链</p></li></ol>
<p class="maodian"><a name="_label5"></a></p><h2>五 最佳实践</h2>
<ol><li><p><strong>先检查后停止</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">-- 检查作业详情
SELECT job_name, enabled, state, run_count, failure_count
FROM user_scheduler_jobs
WHERE job_name = 'YOUR_JOB_NAME';
</pre></div></li><li><p><strong>记录操作</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">-- 记录停止作业的操作
INSERT INTO job_control_log
VALUES('YOUR_JOB_NAME', 'STOPPED', SYSDATE, USER);
COMMIT;
</pre></div></li><li><p><strong>后续处理</strong>:</p>
<ul><li>停止后可能需要手动清理残留数据</li><li>对于重要作业,停止后应考虑重新调度</li></ul></li></ol>
<p>更详细的内容请查看官方文档:</p>
<div class="jb51code"><pre class="brush:sql;">https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_JOB.html#GUID-8C62D808-D7A3-4D21-B87F-A229B7CE1956
</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>总结</h2>
頁: [1]
查看完整版本: 一文详解Oracle如何停止正在运行的Job