如何停止 Oracle dbms_job
Posted
技术标签:
【中文标题】如何停止 Oracle dbms_job【英文标题】:How to stop Oracle dbms_job 【发布时间】:2016-12-06 07:22:23 【问题描述】:我的 dbms_job 已经运行了将近三十天。
总时间不断增加,但我找不到正在运行的作业的任何信息。
当我执行“select * from dba_jobs;”的sql时,结果显示没有作业在运行。
我将它设置为损坏,但它不起作用。
如何安全地停止这个 dbms_job?
【问题讨论】:
您使用古老的 dbms_job 而不是 dbms_scheduler 有什么具体原因吗? dbms_scheduler 更易于维护、更易于使用并且总体而言更出色,恕我直言。 【参考方案1】:DBA_JOBS
列出了在数据库中创建的所有作业。您可以使用DBA_JOBS_RUNNING
视图列出当前在实例中运行的所有作业。
当我执行“select * from dba_jobs;”的sql时,结果显示没有作业在运行。
这显示了使用DBMS_JOBS
包创建的所有作业。该作业可能是使用 DBMS_SCHEDULER
包创建的。
SQL> select job from user_jobs;
JOB
----------
99
我只使用名为99
的DBMS_JOB
package 创建了一份工作。
其他是使用DBMS_SCHEDULER
package 创建的,可以使用:
SQL> select job_name from user_scheduler_jobs;
根据文档-
停止工作
请注意,一旦作业启动并运行,就没有简单的方法来停止作业。
停止工作并不容易。
不知道您使用的是哪个版本的 Oracle 数据库。但是从 Oracle 10g 开始,您可以使用以下查询来列出计划的作业。
SQL>select * from all_scheduler_jobs;
ALL_SCHEDULER_JOBS
ALL_SCHEDULER_JOBS 显示有关当前用户可访问的调度程序作业的信息。More...
使用以下查询查找当前正在运行的作业。
SQL>select job_name, session_id, running_instance, elapsed_time, cpu_used
from user_scheduler_running_jobs;
然后停止-
SQL>EXEC DBMS_SCHEDULER.STOP_JOB (job_name => 'JOB_NAME');
【讨论】:
xxx_JOBS
和 xxx_SCHEDULER_JOBS
是两个完全不同的野兽。前者已经存在多年,已经过时,后者是继任者。
如果优雅停止不起作用,您也可以尝试使用 force 参数立即停止它:EXEC DBMS_SCHEDULER.STOP_JOB (job_name => 'JOBNAME', force => TRUE);
。【参考方案2】:
没有终止会话,你运气不好。
来自Documentation:
请注意,一旦作业启动并运行,就没有简单的方法来停止作业。
这就是您不应再使用dbms_job
的众多原因之一。请改用dbms_scheduler
。
【讨论】:
其实我不知道为什么要使用dbms_job,它以前存在。我想知道为什么当我执行“select * from dba_jobs;”时我没有得到任何结果。我如何获得会话并杀死它? 作业是否存在于 DBA_JOBS_RUNNING 中?如果是,您可以从那里获取 SID。 不,该作业不在 DBA_JOBS_RUNNING 中。【参考方案3】:在“select * from DBA_JOBS_RUNNNG”中签出 SID 那是会话ID 杀死该会话,并且它的更改将被回滚,因此如果批量更新已完成 90%,则中止可能需要“更多”时间而不是让它完成......
【讨论】:
以上是关于如何停止 Oracle dbms_job的主要内容,如果未能解决你的问题,请参考以下文章