Oracle 调度程序 AQ 作业挂起

时间:2021-01-27 05:13:51

标签: oracle callback scheduler queueing

大家好!

Environment: Oracle 12.2 64-bit under Windows.
Parameters:
Job_queue_processes = 4000
Aq_tm_processes = 1

通过回调对入队和出队进行了一些实验后,我决定放弃队列。它成功了。 PL/SQL 回调包的注销也成功。 但是我不能删除 PL/SQL 包本身。 因为有一些消息,卡在AQ_SRVNTFN_TABLE_Q中,甚至在掉队和注销回调后,PLSQL_NTFN作业试图将这些消息投递到不存在的队列中,并锁定包。

还有更奇怪的事情发生……

比如说,我的旧队列被命名为 OLD_QUEUE。

我创建了新队列(名为 NEW_QUEUE)并注册了一个新回调。我在这个新的回调中包含了日志记录。顺便说一句,日志记录也包含在旧回调中。 当我将消息出列到 NEW_QUEUE 时,它们不会出列。

与此相反,Oracle 为 OLD_QUEUE 调用 OLD CALLBACK 并以异常“队列 OLD_QUEUE 不存在”结束。

当然不存在!

同时我的新回调从未被调用。所有消息都保持 NEW_QUEUE 的“就绪”状态。

奇怪的是只有当我在 NEW_QUEUE 中排队消息时才会调用 OLD CALLBACK。 问题是:我无权停止调度程序作业,我无权终止用户 SYS 的会话。

请告诉我: 可能只是清除 AQ_SRVNTFN_TABLE_Q 就足以阻止无数 Oracle 尝试用不存在的队列和不存在的注册来做事?

如果这还不够:有没有办法清除一些 Oracle 全局视图,我相信旧注册挂起的地方?

如果没有这样的视图,我可以确定,重启 EMON 会解决问题(无需重启实例)?

任何帮助将不胜感激。

TIA, 安德鲁。

0 个答案:

没有答案