如何停止 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

我只使用名为99DBMS_JOBpackage 创建了一份工作。 其他是使用DBMS_SCHEDULERpackage 创建的,可以使用:

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_JOBSxxx_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的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE DG 日志传输的停止与恢复

Oracle_本地计算机上的OracleOraDb11g_home1TNSListener 服务启动后停止

Oracle服务启动不了

oracle如何查询和停止正在运行的job?

linux下如何启动和停止sybase的服务

ORACLE如何停止一个JOB