大家好!
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, 安德鲁。