杀死 Oracle 作业。 10g特定
Posted
技术标签:
【中文标题】杀死 Oracle 作业。 10g特定【英文标题】:Killing an Oracle job. 10g specific 【发布时间】:2009-10-06 13:51:32 【问题描述】:我们正在使用在 DBMS_JOB 之上运行的作业调度系统。它使用主作业来创建一次性作业。我们为所有客户端部署相同的作业集,但可以指定哪些作业应仅在某些客户端上运行。
我们偶尔会遇到由作业挂起运行的进程的问题。造成这种情况的主要原因是 UTL_TCP 在得到预期响应时没有超时。我希望能够杀死这些作业,以便它们可以再次运行。
我正在考虑创建一项新作业,以终止运行时间超过特定时间的一次性作业中的任何一个。
我们暂时还停留在 Oracle 10g 上,所以我的能力有限。
有一篇文章似乎涵盖了大部分内容
http://it.toolbox.com/blogs/database-solutions/killing-the-oracle-dbms_job-6498
我觉得这不会涵盖所有可能发生的情况,包括:
-
我们可以作为多个不同用户运行作业,并且用户只能中断/删除他们创建的作业。我相信我可以使用 DBMS_IJOB 来解决这个问题,但我需要让 DBA 让我执行它。
我们有 Oracle RAC 系统。我了解 10g 将 ALTER SYSTEM KILL SESSION 限制为终止当前实例上的会话。我可以安排所有作业在同一个实例上运行,但我还没有尝试过。
还有什么我应该考虑的吗? Stack Overflow 需要一个明确的答案。
【问题讨论】:
您的陈述“但我需要让 DBA 让我执行它”听起来好像您还没有通过 DBA 解决问题?这是 DBA 类别中的一个严重问题,我(作为 DBA 发言)建议您在过于努力地开发程序化解决方案之前直接与您的 DBA 打交道。 我赞成 Rob 的评论,并补充说我会调查设置资源限制以处理这种情况。根据我的经验,正如链接的文章所提到的,您有时需要主机操作系统访问权限和权限来终止运行作业的 ora_qnnn 进程以有效地终止作业,因此您可能无论如何都无法完全停止使用数据库程序的事情. +1 @rob。在我看来,这是对问题 +1 @dpbradley 提到操作系统端活动的可能性的建设性回答 我正在从我们的 DBA 那里获得关于我应该如何执行此操作的帮助,但我们希望在客户端系统上运行它来自动杀死失控的工作,这样我们的 DBA 就不必离开了在那里并每次修复它。无论如何,这种情况非常罕见。 【参考方案1】:您可以从作业表中获取 PID,并通过正常的操作系统命令杀死卡住的进程。
您可以终止任何实例上的作业。在 10g 上,您需要知道卡住的作业在哪个实例上运行,并连接到该实例:
获取您的实例和 pid:
select inst_id, process from gv$session where ...
连接到特定实例:
sqplus admin@node3 as sysdba
alter system kill session ...
【讨论】:
【参考方案2】:在 oracle 上有更多方法可以终止会话。取决于你的平台。在 unix 会话上运行(也是后台作业)由进程表示。终止进程,终止会话。在 Windows 上,会话由线程表示。使用orakill 终止线程会终止会话。进程(或线程)id存储在gv$process中。
【讨论】:
UTL_TCP 上的 Oracle 文档说写操作没有实现超时。 11g 还没有。如果他们解决了这个问题,那么我可能不需要杀死工作。以上是关于杀死 Oracle 作业。 10g特定的主要内容,如果未能解决你的问题,请参考以下文章
linux 系统下oracle 10G perl进程cpu占用100% ,这个进程有啥用?能关掉吗?会不会有啥影响?