如何通过Oracle ASH判断应用是否存在未提交事务挂起问题

风强酱_9469

风强酱_9469

2026-09-21

737人浏览

原创

挂起事务最典型ash特征是sql*net message from client状态伴随零星on cpu样本,表明应用已发完sql但未提交,需结合v$transaction中used_ublk是否持续高位来确认。

如何通过oracle ash判断应用是否存在未提交事务挂起问题

查 ASH 里 SQL*Net message from client + 长时间 ON CPU 的组合

未提交事务挂起最典型的 ASH 特征,不是锁等待,而是会话长时间处于 SQL*Net message from client 状态,同时伴随零星但持续的 ON CPU 样本(非等待事件)。这说明应用端已发完 SQL、断开连接或卡在业务逻辑里,但数据库侧事务仍 open,后台进程仍在维护 undo 段或清理缓冲区。

实操建议:

  • 运行:SELECT session_id, sql_id, sql_opname, event, COUNT(*) FROM v$active_session_history WHERE sample_time > SYSDATE - 1/1440 AND (event = 'SQL*Net message from client' OR session_state = 'ON CPU') GROUP BY session_id, sql_id, sql_opname, event ORDER BY COUNT(*) DESC
  • 重点关注 sql_opname IN ('INSERT', 'UPDATE', 'DELETE')event = 'SQL*Net message from client' 占比超 80% 的会话——它大概率已发完 DML,但没发 COMMIT/ROLLBACK
  • 若同一 session_id 在过去 1 分钟内反复出现 ON CPU + 空 event + sql_id = '0000000000000000',说明 undo 分配或回滚段维护正在后台持续消耗 CPU,事务仍未结束

关联 v$transaction 看 used_ublk 是否持续增长

ASH 只是快照,真正确认事务是否“挂起”,得看 v$transaction 中的 used_ublk 是否稳定不降。一个已挂起但未提交的事务,used_ublk 会保持高位(甚至缓慢上涨),而正常短事务该值会在几秒内归零。

实操建议:

  • 立刻执行:SELECT s.sid, s.serial#, s.username, s.program, s.status, t.used_ublk, t.start_time FROM v$session s JOIN v$transaction t ON s.taddr = t.addr WHERE t.used_ublk > 5000 ORDER BY t.used_ublk DESC
  • used_ublk > 5000(约 40MB)就值得警惕;若 status = 'INACTIVE'username 为空,基本可判定是客户端异常断开后残留的挂起事务
  • 对这类会话,不要只查 sql_id——它往往已是 '0000000000000000' 或空,应直接 ALTER SYSTEM KILL SESSION 'sid,serial#' 清理

注意 RAC 环境下 blocking_instance 为空却仍有挂起事务

在 RAC 中,一个会话可能在实例 A 上挂起事务,但因网络抖动或客户端静默,v$session.blocking_session 显示为空,blocking_instance 也为空。此时不能误判为“无阻塞”,而要主动查 GV$ACTIVE_SESSION_HISTORY 全局视图,过滤 sql_opname IN ('INSERT','UPDATE','DELETE')event = 'SQL*Net message from client' 的跨实例高频样本。

Agent Git Oracle
Agent Git Oracle

高级仓库分析与重构指南。基于AI推理识别技术债务与架构反模式。

下载

实操建议:

  • 运行:SELECT inst_id, session_id, sql_opname, COUNT(*) FROM gv$active_session_history WHERE sample_time > SYSDATE - 1/720 AND event = 'SQL*Net message from client' AND sql_opname IN ('INSERT','UPDATE','DELETE') GROUP BY inst_id, session_id, sql_opname HAVING COUNT(*) > 10
  • 若某 inst_id 下多个 session_id 同时满足条件,且对应 v$session.status = 'INACTIVE',说明该实例存在批量挂起事务风险
  • 别依赖 DBA_HIST_ACTIVE_SESS_HISTORY 回溯——死锁或挂起事务常在 10 秒内发生并消失,历史表采样间隔太粗,容易漏掉关键窗口

避免把长查询误判为挂起事务

大范围 UPDATEDELETE 执行数分钟是正常的,不能单凭 used_ublk 高或 ON CPU 时间长就 kill。关键区别在于:真实挂起事务的会话,v$session.event 会长期停留在 SQL*Net message from client,而长查询会持续显示 db file sequential readdirect path write 等实际 I/O 或 CPU 活动事件。

实操建议:

  • 对高 used_ublk 会话,先查 v$session.eventseconds_in_wait:若 event = 'SQL*Net message from client'seconds_in_wait > 300,才属可疑挂起
  • v$sql 查其 sql_id 对应的语句:含 FOR UPDATE 或明显缺少 COMMIT 调用链(如 PL/SQL 包中无异常处理块)的,挂起概率更高
  • 检查应用日志——很多挂起事务源于应用层 try/catch 后忘记 rollback,或连接池配置了 auto-commit=false 却未显式控制事务边界

真实挂起事务最难识别的点,是它既不报错、也不阻塞别人(初期),只安静地吃 undo 空间和 PGA 内存;等 DBA 发现 ORA-30036 或内存告警时,往往已有十几个事务在后台空转。所以必须把 ASH 查询和 v$transaction 检查做成自动化巡检项,而不是等报警才动手。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

801

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

2173

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

2210

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1289

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

1853

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

2389

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

3989

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

237

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

606

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程