在 Oracle 数据库日常运维和故障排查中,AWR 和 ASH 是常用的性能分析工具。
很多时候我们会遇到这样的情况:
-
某个时间段系统突然变慢
-
用户反馈某个页面卡顿
-
数据库出现锁等待
-
某条 SQL 在特定时间段耗时异常
-
想知道数据库这一小时整体负载怎么样
这时候就需要根据问题类型,选择使用 AWR 或 ASH。
一、什么是 ASH?
ASH 全称:
Active Session History
中文一般称为:
活动会话历史
它会对数据库中的活跃会话进行采样,并记录当时会话正在做什么,比如:
执行哪条 SQL
等待什么事件
在哪个对象上工作
是否发生锁等待
哪个会话正在阻塞
当前处于 CPU 还是等待状态
因此,ASH 更适合分析:
某一个具体时间段内,数据库到底发生了什么。
例如:
15:30 ~ 16:30
用户反馈这个时间段 OA 很卡,那么 ASH 就非常适合。
二、什么是 AWR?
AWR 全称:
Automatic Workload Repository
AWR 会定期保存数据库的性能快照。
AWR 报告更偏向于分析数据库一段时间内的整体运行情况,例如:
DB Time
DB CPU
等待事件
SQL执行情况
逻辑读
物理读
Redo
解析次数
RAC等待
I/O性能
简单理解:
AWR 看整体,ASH 看细节。
三、ASH 和 AWR 的区别
可以简单记成下面这样:
| 对比项 | AWR | ASH |
|---|---|---|
| 分析范围 | 整体性能 | 活跃会话 |
| 时间粒度 | 较粗 | 较细 |
| 适合场景 | 数据库整体变慢 | 某个具体时间段卡顿 |
| SQL分析 | 可以 | 更直观 |
| 锁等待分析 | 可以发现 | 更适合定位 |
| 会话分析 | 较弱 | 很强 |
| 时间点分析 | 不够精确 | 非常适合 |
| Top SQL | 支持 | 支持 |
| Blocking Session | 一般 | 更直观 |
四、什么时候用 AWR?
如果你的问题是:
数据库为什么整体变慢?
CPU是不是很高?
磁盘I/O是不是有问题?
哪类等待事件最多?
这一小时有哪些高消耗SQL?
RAC有没有性能问题?
优先看:
AWR
比如:
15:00 ~ 16:00
数据库整体性能异常,可以先生成一份 AWR。
五、什么时候用 ASH?
如果你的问题是:
15:35为什么突然卡了?
16:20用户操作为什么很慢?
某个时间段有没有锁?
哪条SQL在当时占CPU?
哪个Session在阻塞?
更适合:
ASH
尤其是用户能明确提供故障时间时,ASH 非常有价值。
六、实际排障建议
在生产环境排查时,可以按下面的思路:
数据库整体性能问题
↓
AWR
↓
发现某个时间段异常
↓
ASH
↓
继续定位SQL / Session / Lock
也就是说:
AWR 用来定方向,ASH 用来定位具体问题。
七、Oracle ASH 报告生成方法
下面以 Oracle 19c PDB 环境为例。
1. 登录数据库
切换 Oracle 用户:
su - oracle
设置实例:
export ORACLE_SID=XXX
确认:
echo $ORACLE_SID
登录:
sqlplus / as sysdba
这也是你当前手册中的标准登录方式。
2. 切换目标 PDB
查看 PDB:
show pdbs;
切换到目标 PDB,例如:
alter session set container=erp;
确认:
show con_name;
3. 生成 ASH 报告
执行:
@?/rdbms/admin/ashrpt.sql
按照提示填写参数。
Report Type
直接回车:
Report Type:
回车
默认:
HTML
AWR Location
PDB 环境建议:
AWR_PDB
Instance
只分析当前 RAC 实例:
1
如果分析所有 RAC 实例:
ALL
Begin Time
例如:
08/12/26 15:30
时间格式:
MM/DD/YY HH24:MI
Duration
分析 60 分钟:
60
你原手册中的参数也是这一组。
最终分析时间就是:
2026-08-12 15:30
~
2026-08-12 16:30
八、查看生成的 ASH 报告
生成成功后会看到类似:
Report written to ashrpt_1_0812_1630.html
退出 SQL*Plus:
exit
进入目录:
cd /home/oracle
查看报告:
ls -lh ashrpt_*.html
查看完整路径:
readlink -f ashrpt_1_0812_1630.html
九、ASH 报告重点看什么?
打开 HTML 后,重点看下面几个部分:
Top Events
Top SQL
Top Sessions
Top Blocking Sessions
Activity Over Time
Top Events
主要看数据库当时在等什么:
CPU + Wait for CPU
db file sequential read
enq: TX - row lock contention
library cache lock
cursor: pin S wait on X
Top SQL
重点找:
高CPU SQL
全表扫描 SQL
执行频率高的 SQL
逻辑读高的 SQL
Top Sessions
可以判断:
哪个Session最活跃
哪个用户占用资源最多
哪个程序在持续执行
Top Blocking Sessions
如果系统出现卡死、提交慢、业务页面长时间等待,可以重点看这一部分。
Activity Over Time
这个部分非常实用。
可以直接看:
15:30
15:36
15:42
15:48
...
每个时间段主要发生了什么。
对于定位:
"某一分钟为什么卡"
非常有帮助。
十、总结
实际生产排障时,可以这样记:
整体性能问题 → AWR
具体时间问题 → ASH
如果数据库整体运行缓慢,先看 AWR。
如果已经明确:
某个时间段
某次用户操作
某次锁等待
某个SQL异常
建议直接查看 ASH。
很多 Oracle 性能问题,比较有效的排查方式就是:
AWR 找方向
ASH 找现场
SQL执行计划找根因
这三者配合起来,基本可以覆盖大部分 Oracle 性能问题排查场景。