Oracle无统一查询超时配置,超时定位依赖ASH及历史视图;查v$active_session_history可捕获实时超时会话,但内存仅保留约1小时数据,需用dba_hist_active_sess_history查历史,注意采样粒度与AWR快照有效性。
oracle应用层没有统一的“查询超时”配置,超时行为实际由客户端驱动、网络层、数据库资源管理器(dbrm)或应用代码自身控制;直接查是定位“已发生超时”的最可靠方式——因为超时本质是会话在等待或执行中被中断,而 ash 恰好记录了每秒的活动快照。
查不到超时会话?先确认 ASH 数据是否覆盖目标时段
ASH 内存缓冲区默认只保留约 1 小时活跃数据(受 SGA 分配和系统负载影响),高负载下可能仅剩几分钟。若你查的是昨天下午 3 点的慢查询,
几乎肯定已覆盖,必须切到磁盘历史视图:
是唯一可查过去数天/周的来源,但采样粒度为 10 秒(
是 1 秒),丢失细节
执行前务必确认 AWR 快照已生成:运行
若目标时段无快照,
对应数据也为空——此时只能靠应用日志或数据库审计(
)反推
识别“疑似超时”的会话行为特征
Oracle 不记录“超时”标记,但超时前常伴随特定等待模式。重点看
和持续时间组合:
持续超 30 秒:客户端已断开,但会话未清理,常见于 JDBC
触发后服务端残留
+
超 60 秒:事务卡在锁等待,应用层 timeout(如 Spring
)很可能已生效
或
占比突增:硬解析风暴导致单条 SQL 执行延迟飙升,触发上层超时
同一
在
中连续出现多行,
逐次增大:说明执行未完成且未被 cancel,极可能是客户端超时后重试或连接池未 close
关联 SQL 文本与执行堆栈要绕过权限和缓存陷阱
直接 join
查
常失败,原因很实际:
oracle知识库
oracle知识库下载
下载
只保留共享池中当前存在的 SQL,超时 SQL 若已被 aged out,
对应行为空
普通用户默认无权查
,但可查
(需
)
更稳的方式是用
关联
,且加
过滤无效值
若需完整 SQL(含绑定变量值),必须启用 SQL Trace 或
,ASH 本身不存 bind values
别忽略 blocking_session 链式阻塞的隐性超时
一个会话超时,往往不是它自己慢,而是被上游阻塞。ASH 的
和
是关键线索:
执行
快速抓出正在传播阻塞的源头
注意
可能指向另一个已超时/僵死的会话,形成环状依赖(尤其在 PL/SQL 批处理中)
字段(Oracle 12c+)能直接输出阻塞链路,比手工递归查
更准
如果阻塞源头是
,说明 UNDO 不足,此时即使应用设了 30 秒 timeout,所有并发事务都会排队等 rollback segment,超时会集中爆发
真正难的不是查出哪条 SQL 超时,而是判断“超时”到底是客户端主动切断、数据库资源耗尽被动挂起、还是中间件连接池误判空闲连接——这三者在 ASH 里表现相似,但根因和修复路径完全不同。盯住
与
的差值变化节奏,再结合应用侧的 error log 时间戳,才能把“超时”从现象锚定到具体环节。
v$active_session_historyv$active_session_historydba_hist_active_sess_historyv$active_session_historySELECT MIN(snap_id), MAX(snap_id) FROM dba_hist_snapshot WHERE end_interval_time > SYSDATE - 1;dba_hist_active_sess_historyunified_audit_traileventSQL*Net message from clientsocketTimeoutenq: TX - row lock contentionsql_exec_start@Transactional(timeout=60)library cache lockrow cache locksql_idv$active_session_historysample_time - sql_exec_startv$sqlareasql_textv$sqlareasql_idv$sqlareadba_hist_sqltextSELECT_CATALOG_ROLEdba_hist_active_sess_historydba_hist_sqltextWHERE sql_id IS NOT NULL AND sql_id != '0000000000000000'DBMS_MONITOR.SESSION_TRACE_ENABLEblocking_sessionblocking_inst_idSELECT * FROM v$active_session_history WHERE blocking_session IS NOT NULL AND sample_time > SYSTIMESTAMP - INTERVAL '5' MINUTE;blocking_sessionblocking_hangchain_infov$sessionenq: US - contentionsample_timesql_exec_start