通过数据库链接查询是否超时?


11

编辑/前言: 该问题已从SO迁移过来,因为我对DB链接查询超时问题特别感兴趣。SO所提供的解决方法是可以的,但是我对这个问题本身很感兴趣。

动机:
我有一个查询“永远”运行(超过2天,直到终止会话),它使用数据库链接。问题似乎是远程数据库变得不可用,并且由于某些未知原因ORA-02068(没有在这里讨论)而没有提出(查询在此等待)。

(该查询是由dbms_scheduler作业发出的,该作业在PL / SQL程序包中执行一个过程。因此,该作业也被卡住了。但这对于此问题的核心没有特别的兴趣)

我已经通过将我的一个测试数据库置于静默模式并通过数据库链接对其进行查询来模拟这种情况。如预期的那样,查询一直在等待,直到手动取消或取消取消远程DB。

问题:
我无法控制远程数据库的行为和正常运行时间,因此我正在寻找某种可能性来设置使用数据库链接的查询的超时时间。

我已经研究过配置文件(CPU_PER_CALL等),sqlnet.ora参数,将本地命名参数直接添加到连接字符串中(例如添加(connect_timeout=10)到数据库链接定义中),使用运行命令... for update wait 1,但是它们对于繁忙或空闲会话均有效,但不适用于等待中的会话。

因此,我正在数据库链接的“本地”侧搜索某些选项,该选项为通过数据库链接的查询设置超时。由于我对这些特定的DB没有DBA权限,因此
喜欢alter session set xyz或喜欢一些解决方案select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)

我目前使用的是10gR2,但将在几周内升级到11gR2,因此使用这些版本中的任何一个都将很有用。


查询如何使用?较大过程/程序包的一部分,用于mat视图的基础SQL,是从外部应用程序运行的,...?我不知道简单的“ wait xxx”语法,您的解决方案可能需要成为更大程序的一部分,具体取决于您的用法。

该查询是由dbms_scheduler作业发出的,该作业在PL / SQL程序包中执行一个过程。(有关此问题的最新信息)
GWu 2012年

Answers:


4

由于您使用的是dbms_scheduler,因此可以将作业的max_run_duration 属性设置为某个限制,然后在发生该事件时让调度程序通过电子邮件发送给您。在幕后,Oracle使用排队表(如果您想采取额外的步骤来围绕响应进行更多的自动化,它可以使您创建在引发事件时触发的作业)。但是基本上任何在您设置的max_run_duration之上运行的作业都会引发事件类型:JOB_OVER_MAX_DUR

该电子邮件是内置于11gr2中的,请参阅此处以获得良好的撰写。

希望能有所帮助。


好主意,谢谢!这并不是对数据库链接超时特定问题的确切答案,但我想它还是可以解决我的第一个问题,所以+1 :-)。我不知道max_run_duration,并从这个我刚刚找到如何停止拖放挂起的工作开始(forums.oracle.com/forums/thread.jspa?threadID=521939#2002982
GWU

由于某种原因,我无法max_run_duration提出该事件,因此我在这里
-GGW

0

我并不是说我有解决方案,但我也想就如何控制dblink超时进行更多讨论。我想可以编写触发事件或等待TNS超时事件然后执行的代码:

ALTER SESSION CLOSE DATABASE LINK dblink;

当然,您可以使用以下方法轮询远程服务器:

select * from dual@dblink

检查它是否可用,但这不能解决代码在远程上运行时间过长的问题。错误的远程代码会触发等待事件,因此我认为这些事件可能会被捕获(即使在12c中的类级别)。这仍然不能为我们提供一种强制dblink会话超时的优雅解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.