我们使用在 Oracle 上运行的基于 Web 的服务。他们严格地只允许 SELECT-only ODBC 访问。我们所做的一些报告并没有被公司提供的视图很好地解释,因此我们使用 Oracle 11g 的快速版设置了一个 db_link,并使用刷新将一些更重要的查询重写为物化视图:指定设置以每小时重新运行查询,这对于我们的目的来说已经足够了。到目前为止一切都很好。
我注意到一些 MV 会停止刷新,背后没有真正的模式。进一步调查,它不时发现外部数据库(我们通过 db_link 连接的那个)不时完成查询,刷新过程耐心等待事件“SQL*Net more data”从 dblink' 无限期地。
这是我运行的查询,以获取有关卡住的刷新会话和似乎卡住刷新语句的三个会话的数据:
select a.username, a.osuser, a.sid, a.serial#, b.spid, a.seconds_in_wait,
a.event, a.state, a.wait_class
from v$session a, v$process b
where a.paddr = b.addr
and a.seconds_in_wait > 500 and a.username is not null;
USERNAME OSUSER SID SERIAL# SPID SECONDS_IN_WAIT EVENT STATE WAIT_CLASS
KIPP_NWK SYSTEM 27 7904 2704 161991 SQL*Net more data from dblink WAITING Network
KIPP_NWK SYSTEM 35 2469 3880 139489 SQL*Net more data from dblink WAITING Network
KIPP_NWK SYSTEM 37 6051 1408 40860 SQL*Net more data from dblink WAITING Network
因此,我认为我的问题是“关于脚本的任何建议,该脚本将定期(例如,每小时)扫描事件类型“来自 dblink 的更多数据”的卡住会话并终止它们?对我来说,期望的行为是这种刷新更有弹性——如果超时,我希望它重新开始并尝试,再试一次......
我不认为弄清楚为什么外部数据库停止执行这些查询会很有成效——提供者提供了选择权限,但很清楚不想支持/解决出现的任何问题。
我在 sqlnet.ora 文件中阅读了有关设置 idle_time 和更改设置 SQLNET.EXPIRE_TIME 的信息 - 但我不认为这是正确的方法,因为连接不是空闲的,它们是活动的但无限期等待,以及这些会话由数据库本身发起的复杂因素。
如何使此刷新更具弹性/自动终止这些等待已久的刷新?