3

我们正在使用在 DBMS_JOB 之上运行的作业调度系统。它使用主作业来创建一次性作业。我们为所有客户端部署相同的作业集,但可以指定哪些作业应仅在某些客户端上运行。

我们偶尔会遇到由作业挂起运行的进程的问题。造成这种情况的主要原因是 UTL_TCP 在得到预期响应时没有超时。我希望能够杀死这些工作,以便它们可以再次运行。

我正在考虑创建一项新工作,以杀死任何运行时间超过特定时间的一次性工作。

我们被 Oracle 10g 困住了一段时间,所以我仅限于它可以做什么。

有一篇文章似乎涵盖了大部分内容

http://it.toolbox.com/blogs/database-solutions/killing-the-oracle-dbms_job-6498

我有一种感觉,这不会涵盖所有可能发生的情况,包括:

  1. 我们可以作为几个不同的用户运行作业,并且用户只能中断/删除他们创建的作业。我相信我可以使用 DBMS_IJOB 来解决这个问题,但我需要让 DBA 让我执行它。
  2. 我们有 Oracle RAC 系统。我了解 10g 将 ALTER SYSTEM KILL SESSION 限制为在当前实例上终止会话。我可以安排所有作业在同一个实例上运行,但我还没有尝试过。

还有什么我应该考虑的吗?Stack Overflow 需要一个明确的答案。

4

2 回答 2

1
  • 您可以从作业表中获取 PID,并通过正常的操作系统命令杀死卡住的进程。

  • 您可以终止任何实例上的作业。在 10g 上,您需要知道卡住的作业在哪个实例上运行,并连接到该实例:

要获取您的实例和 pid:

select inst_id, process from gv$session where ...

连接到特定实例:

sqplus admin@node3 as sysdba
alter system kill session ...
于 2009-10-07T01:47:54.810 回答
1

在 oracle 上有更多方法可以终止会话。取决于你的平台。在 unix 会话上运行(也是后台作业)由进程表示。终止进程,终止会话。在 Windows 上,会话由线程表示。使用orakill 终止线程,终止会话。进程(或线程)id 存储在gv$process 中

于 2009-10-07T15:11:25.243 回答