GWu*_*GWu 11 oracle oracle-11g-r2 oracle-10g
编辑/前言: 此问题已从 SO 迁移,因为我对有关数据库链接查询超时的问题特别感兴趣。SO提供的解决方法有点OK,但我对问题本身很感兴趣。
动机:
我有一个使用数据库链接的查询“永远”运行(超过 2 天,直到我终止会话)。问题似乎是远程数据库变得不可用,并且由于某些未知的原因没有ORA-02068
提出(这里不讨论)并且查询只是等待和等待。
(该查询由 dbms_scheduler 作业发出,该作业执行 PL/SQL 包中的一个过程。因此,该作业也被卡住了。但这对于这个问题的核心并不是特别感兴趣)
我通过将我的一个测试数据库置于静默模式并通过数据库链接对其进行查询来模拟这种情况。正如预期的那样,查询一直在等待,直到手动取消或远程数据库取消停顿。
问题:
我无法控制远程数据库的行为和正常运行时间,因此我正在寻找某种可能性来为使用数据库链接的查询设置超时。
我已经研究了配置文件(CPU_PER_CALL
等),sqlnet.ora
参数,将本地命名参数直接添加到连接字符串中(例如添加(connect_timeout=10)
到数据库链接定义),使用 运行命令... for update wait 1
,但它们适用于繁忙或空闲会话,但不适用于对于等待中的会话。
所以我在数据库链接的“本地”端寻找一些选项,它为数据库链接的查询设置超时。
一些解决方案喜欢alter session set xyz
或select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)
将不胜感激,因为我对这些特定的数据库没有 DBA 权限。
我目前在 10gR2 上,但几周后升级到 11gR2,因此对这些版本中的任何一个的想法都会很有用。
小智 4
由于您使用的是 dbms_scheduler,因此您可以将作业的max_run_duration 属性设置为某个限制,然后让调度程序在引发该事件时向您发送电子邮件。Oracle 在幕后使用排队表(如果您想采取额外的步骤来围绕响应实现更多自动化,它可以让您创建在引发事件时触发的作业)。但基本上任何运行超过您设置的 max_run_duration 的作业都会引发事件类型:JOB_OVER_MAX_DUR
该电子邮件片段是在 11gr2 中构建的,请参阅此处以获得良好的文章。
希望有帮助。