我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
背景介绍
Oracle 的 ASH(Active Session History,活动会话历史)功能可以说是数据库领域的标杆,许多其他数据库都在模仿,但始终未能超越。ASH 对于分析数据库历史故障和性能瓶颈有着极其重要的作用,已经成为 Oracle DBA 日常工作中不可或缺的工具。
然而,Oracle 默认提供的 ASH 可视化界面过于简单,面对复杂的故障排查和性能分析时,往往难以满足实际需求。为此,本文分享一个本人常用的 ASH 分析脚本。该脚本可以根据 wait_class 的值,快速定位会话的 event、SQL 语句以及正在访问的 object_id,并统计每个时间间隔内 event、sql、object_id 出现的次数,并按次数排序,帮助你迅速锁定数据库的热点和瓶颈。
本次分享的脚本还做了重要的迭代优化。起因是一位兄弟在使用过程中,遇到 CPU 使用率很高的情况,但 ASH 的 wait_class 中并没有 CPU 相关的等待事件,导致原脚本查询结果为空。新版脚本修复了这个问题:当输入 ON CPU 时,会自动关联 session_state 字段,确保能够正确统计 CPU 使用情况,满足实际分析需求。
脚本作用
该脚本的主要目的是提升 ASH 数据分析的效率,帮助 DBA 快速定位数据库的性能瓶颈或故障点。需要注意的是,脚本本身只是工具,最终的故障和性能分析还需结合自身的知识积累和其他辅助脚本共同完成。
脚本获取
关注公众号,回复 ash_object_by_waitclass 获取脚本源码。
目前正在考虑建一个微信群或者通过其它什么方式共享脚本,这样方便大家获取。
脚本参数说明
- begin_hours:查询 ASH 记录的起始时间,距离当前时间多少小时(默认2小时)。
- interval_hours:需要查询的时间区间长度,单位为小时(默认2小时)。
- waitclass:session.wait_class 的值,也可以输入 ON CPU(默认 User I/O)。
- display_time:结果中每个时间段的间隔,单位为分钟(默认10分钟)。
示例参数输入代码如下:
plain_text
ACCEPT begin_hours prompt 'Enter Search Hours Ago (i.e. 2(default)) : ' default '2'
ACCEPT interval_hours prompt 'Enter How Interval Hours (i.e. 2(default)) : ' default '2'
ACCEPT waitclass prompt 'Enter Search Wait Class (i.e. User I/O(default) Or ON CPU) : ' default 'User I/O'
ACCEPT display_time prompt 'Enter How Display Interval Minute (i.e. 10(default)) : ' default '10'
variable begin_hours number;
variable interval_hours number;
variable time number;
variable waitclass varchar2(200);
begin
:begin_hours:=&begin_hours;
:interval_hours:=&interval_hours;
:time:=&display_time;
:waitclass:='&waitclass';
end;
/
脚本使用案例
1. ON CPU 的案例
当数据库 CPU 使用率较高时,可以通过输入 ON CPU
,快速定位消耗 CPU 资源最多的 SQL 和对象:
plain_text
www.htz.pw > @ash_object_by_waitclass
Enter Search Hours Ago (i.e. 2(default)) :
Enter How Interval Hours (i.e. 2(default)) :
Enter Search Wait Class (i.e. User I/O(default)) : ON CPU
Enter How Display Interval Minute (i.e. 10(default)) :
PL/SQL procedure successfully completed.
EVENT
EVENT SQLID
EVENT SQLID OBJECT
TIME EVENT ROWS SQL_ID ROWS OBJECT_ID ROWS
----------------- ---------------------------------------- ---------- ------------------ --------- ---------- ---------
20250717 18 50-60 ON CPU 17 6 -1 6
75ajb6njq3124 11 9165 11
20250717 19 0-10 ON CPU 30 bjck50zs3nc95 1 -1 1
c179sut1vgpc8 1 9201 1
28 -1 28
20250717 19 10-20 ON CPU 9 9 -1 9
20250717 19 20-30 ON CPU 9 1kb56hd6c73bv 1 -1 1
8 -1 8
20250717 19 30-40 ON CPU 30 8jdqkyxggndcw 11 -1 11
18 -1 18
20250717 19 40-50 ON CPU 5 5 -1 5
20250717 19 50-60 ON CPU 9 22356bkgsdcnh 1 -1 1
3kqrku32p6sfn 1 -1 1
7 9165 1
-1 6
20250717 20 0-10 ON CPU 4 4 -1 4
20250717 20 10-20 ON CPU 8 8 -1 8
20250717 20 20-30 ON CPU 16 772s25v1y0x8k 1 -1 1
3kqrku32p6sfn 1 -1 1
14 -1 14
20250717 20 30-40 ON CPU 9 9 -1 9
20250717 20 40-50 ON CPU 6 fs9wrcc7k8f3k 2 -1 2
3 -1 3
23 rows selected.
SQL>
2. Concurrency 的案例
分析并发相关的等待事件,快速定位热点 SQL 和对象:
plain_text
www.htz.pw > @ash_object_by_waitclass.sql
Enter Search Hours Ago (i.e. 2(default)) : 80
Enter How Interval Hours (i.e. 2(default)) : 80
Enter Search Wait Class (i.e. User I/O(default)) : Concurrency
Enter How Display Interval Minute (i.e. 10(default)) :
PL/SQL procedure successfully completed.
EVENT
EVENT SQLID
EVENT SQLID OBJECT
TIME EVENT ROWS SQL_ID ROWS OBJECT_ID ROWS
----------------- ---------------------------------------- ---------- ------------------ --------- ---------- ---------
20180913 18 10-20 buffer busy waits 10 7ytmm161fqh7v 10 173776 10
row cache lock 20 8kjczmwr880g7 10 -1 10
ffmu1hmx015xp 10 -1 10
20180913 18 30-40 row cache lock 10 fayj2tt0raq1y 10 -1 10
20180913 19 20-30 row cache lock 10 g95n7p77a7wf1 10 -1 10
20180913 20 50-60 os thread startup 10 10 -1 10
20180913 22 0-10 os thread startup 10 10 -1 10
library cache lock 1130 6g7kr8p1khd7j 270 -1 270
b6usrg82hwsa3 560 185 40
28057 520
20180913 22 10-20 cursor: pin S wait on X 970 2dd14pvvq1dtd 390 -1 170
111549 210
7bmv0x3jk3s4m 580 143758 580
library cache lock 3060 b6usrg82hwsa3 580 -1 210
28057 370
6g7kr8p1khd7j 990 -1 990
20180913 22 20-30 library cache lock 1620 b6usrg82hwsa3 590 -1 590
2dd14pvvq1dtd 1030 -1 440
111549 590
cursor: pin S wait on X 5650 2dd14pvvq1dtd 5650 -1 960
111549 2740
20180913 22 30-40 library cache lock 270 b6usrg82hwsa3 90 -1 90
2dd14pvvq1dtd 180 111549 90
-1 90
cursor: pin S wait on X 1170 2dd14pvvq1dtd 1170 -1 180
0 180
111549 630
20180914 00 0-10 os thread startup 10 g9b1kcgyr8ryx 10 -1 10
20180914 00 20-30 os thread startup 10 g9b1kcgyr8ryx 10 -1 10
20180914 00 50-60 os thread startup 10 10 -1 10
20180914 01 10-20 os thread startup 10 10 -1 10
20180914 03 10-20 os thread startup 10 10 -1 10
20180914 05 0-10 os thread startup 10 10 288 10
20180914 06 50-60 os thread startup 10 10 -1 10
20180914 08 10-20 enq: TX - index contention 10 7ytmm161fqh7v 10 173775 10
20180914 10 30-40 enq: TX - index contention 10 7ytmm161fqh7v 10 173776 10
20180914 11 10-20 row cache lock 10 ffmu1hmx015xp 10 -1 10
20180914 11 20-30 row cache lock 10 1jj49r1jt4t4y 10 -1 10
20180914 11 30-40 enq: TX - index contention 10 7ytmm161fqh7v 10 173776 10
20180914 12 30-40 os thread startup 10 10 -1 10
20180914 12 40-50 row cache lock 20 fayj2tt0raq1y 10 -1 10
96j8cy524bfqb 10 -1 10
20180914 13 40-50 row cache lock 10 fayj2tt0raq1y 10 -1 10
20180914 13 50-60 row cache lock 10 ffmu1hmx015xp 10 -1 10
20180914 14 50-60 row cache lock 10 96j8cy524bfqb 10 -1 10
20180914 15 0-10 buffer busy waits 10 7ytmm161fqh7v 10 173776 10
3. Cluster 的案例
分析集群相关的等待事件,定位分布式环境下的热点 SQL 和对象:
plain_text
SQL> @ash_object_by_waitclass.sql
Enter Search Hours Ago (i.e. 2(default)) : 25
Enter How Interval Hours (i.e. 2(default)) : 5
Enter Search Wait Class (i.e. User I/O(default)) : Cluster
Enter How Display Interval Minute (i.e. 10(default)) :
EVENT
EVENT SQLID
EVENT SQLID OBJECT
TIME EVENT ROWS SQL Id ROWS OBJECT_ID ROWS
----------------- ---------------------------------------- ---------- ------------------ --------- ---------- ---------
20180427 13 40-50 gc cr multi block request 1050 1ka1qdn7q0p31 50 60302 50
3nbv4gnswqm56 50 60303 50
27hzdsfkrxw23 100 66094 100
gc buffer busy acquire 1050 gmvgp65fqsh8b 410 60317 410
0kyq1wwhfnap9 420 60261 420
gc cr grant congested 1110 27hzdsfkrxw23 130 69526 60
66094 70
cyxcv5dry802q 140 68617 40
66080 100
20180427 13 50-60 gc buffer busy acquire 12570 0kyq1wwhfnap9 4420 60261 4420
gmvgp65fqsh8b 4590 60317 4590
gc cr multi block request 13600 gmvgp65fqsh8b 550 60317 550
27hzdsfkrxw23 1290 66094 1290
20180427 14 0-10 gc cr grant congested 13330 bxhqmzrr9scrs 1650 66089 410
69493 450
27hzdsfkrxw23 1650 69526 520
66094 1130
cyxcv5dry802q 2050 68617 620
66080 1430
gc cr multi block request 14840 27hzdsfkrxw23 1020 66094 1020
5483m8kvctdqr 1050 62092 1050
20180427 14 10-20 gc cr grant congested 12590 27hzdsfkrxw23 1660 69526 500
66094 1160
cyxcv5dry802q 1940 68617 630
66080 1310
gc cr multi block request 12690 27hzdsfkrxw23 1000 66094 1000
5483m8kvctdqr 1080 62092 1080
20180427 14 20-30 gc buffer busy acquire 12630 0kyq1wwhfnap9 4540 60261 4540
gmvgp65fqsh8b 4640 60317 4640
gc cr multi block request 15260 27hzdsfkrxw23 1000 66094 1000
5483m8kvctdqr 1130 62092 1130
20180427 14 30-40 gc cr grant congested 14110 27hzdsfkrxw23 2110 69526 580
66094 1530
cyxcv5dry802q 2250 68617 740
66080 1510
gc cr multi block request 15010 27hzdsfkrxw23 1080 66094 1080
5483m8kvctdqr 1110 62092 1110
20180427 14 40-50 gc buffer busy acquire 12050 gmvgp65fqsh8b 4360 60317 4360
0kyq1wwhfnap9 4470 60261 4470
gc cr multi block request 13500 5483m8kvctdqr 1030 62092 1030
27hzdsfkrxw23 1050 66094 1050
20180427 14 50-60 gc cr multi block request 5620 27hzdsfkrxw23 400 66094 400
5483m8kvctdqr 640 62092 640
gc buffer busy acquire 7030 gmvgp65fqsh8b 1430 60317 1430
0kyq1wwhfnap9 4090 60261 4090
20180427 15 0-10 gc cr multi block request 1580 0baxsbcdg6wz9 280 66089 280
0kyq1wwhfnap9 280 60261 280
c7pfrkpmwsh1g 320 66079 320
gc buffer busy acquire 4300 d7xh377d3sc7d 400 66089 400
0kyq1wwhfnap9 3510 60261 3510
20180427 15 10-20 gc cr grant 2-way 340 cyxcv5dry802q 40 68617 10
66080 30
01mhyzkpv1rvz 60 66094 20
69525 40
gc cr multi block request 620 3x44s9jnkrtc7 110 62080 110
5483m8kvctdqr 230 62092 230
总结
通过本脚本,DBA 可以在指定时间区间内,按等待类(如 User I/O、ON CPU、Concurrency、Cluster 等)统计 Oracle 活动会话历史,分层次(事件、SQL、对象)展示每层 Top N 的热点,极大提升了故障定位和性能分析的效率。希望这个脚本能为你的日常运维和故障排查带来帮助!
如有疑问或建议,欢迎留言交流!
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)