外观
Oracle AWR/ASH报告分析
AWR和ASH概述
AWR(Automatic Workload Repository)和ASH(Active Session History)是Oracle数据库提供的两种重要性能监控和分析工具,用于收集、存储和分析数据库性能数据。
AWR(Automatic Workload Repository)
- 定义:自动负载信息库,是一个内置的性能数据收集和管理框架
- 收集内容:系统统计信息、SQL执行计划、等待事件、资源使用情况等
- 收集频率:默认每60分钟生成一个快照,保留8天
- 存储位置:存储在SYSAUX表空间的AWR表中
- 主要用途:长期性能趋势分析、SQL调优、资源瓶颈识别
ASH(Active Session History)
- 定义:活动会话历史,是AWR的重要组成部分
- 收集内容:活动会话的详细信息,包括SQL语句、等待事件、会话状态等
- 收集频率:每秒采样一次,每个采样点记录所有活动会话的信息
- 存储位置:内存中的V$ACTIVE_SESSION_HISTORY视图和AWR表
- 主要用途:实时性能监控、短期性能问题诊断、等待事件分析
AWR报告生成方法
1. 使用SQL*Plus生成AWR报告
生成单实例AWR报告
sql
-- 连接到数据库
sqlplus / as sysdba
-- 运行AWR报告生成脚本
@?/rdbms/admin/awrrpt.sql
-- 按照提示输入:
-- 1. 报告格式(html或txt)
-- 2. 快照范围(开始快照ID和结束快照ID)
-- 3. 报告文件名生成RAC集群AWR报告
sql
-- 运行RAC AWR报告生成脚本
@?/rdbms/admin/awrgrpt.sql生成指定实例的AWR报告
sql
-- 运行实例AWR报告生成脚本
@?/rdbms/admin/awrrpti.sql2. 使用Enterprise Manager生成AWR报告
- 登录Enterprise Manager控制台
- 导航到"性能"选项卡
- 点击"AWR报告"
- 选择快照范围和报告格式
- 生成并查看报告
3. 使用PL/SQL生成AWR报告
sql
-- 使用DBMS_WORKLOAD_REPOSITORY包生成AWR报告
DECLARE
l_report CLOB;
BEGIN
l_report := DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(
l_dbid => 1234567890, -- 数据库ID
l_inst_num => 1, -- 实例号
l_bid => 100, -- 开始快照ID
l_eid => 101, -- 结束快照ID
l_options => 0 -- 报告选项
);
-- 将报告保存到文件
DBMS_XSLPROCESSOR.CLOB2FILE(l_report, 'MY_DIR', 'awr_report.html');
END;
/ASH报告生成方法
1. 使用SQL*Plus生成ASH报告
sql
-- 连接到数据库
sqlplus / as sysdba
-- 运行ASH报告生成脚本
@?/rdbms/admin/ashrpt.sql
-- 按照提示输入:
-- 1. 报告格式(html或txt)
-- 2. 时间范围(开始时间和结束时间,或快照ID)
-- 3. 报告文件名2. 使用PL/SQL生成ASH报告
sql
-- 使用DBMS_WORKLOAD_REPOSITORY包生成ASH报告
DECLARE
l_report CLOB;
BEGIN
l_report := DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML(
l_dbid => 1234567890, -- 数据库ID
l_inst_num => 1, -- 实例号
l_btime => SYSTIMESTAMP - INTERVAL '1' HOUR, -- 开始时间
l_etime => SYSTIMESTAMP, -- 结束时间
l_options => 0 -- 报告选项
);
-- 将报告保存到文件
DBMS_XSLPROCESSOR.CLOB2FILE(l_report, 'MY_DIR', 'ash_report.html');
END;
/AWR报告关键指标解读
1. 报告首页
- 数据库版本:Oracle数据库版本信息
- 快照信息:开始和结束快照ID、时间、持续时间
- 数据库负载信息:DB Time、DB CPU、Redo Size、Logical Reads等
关键指标
| 指标名称 | 描述 | 正常范围 |
|---|---|---|
| DB Time | 数据库处理用户请求的总时间 | 根据业务需求,通常大于Elapsed Time |
| DB CPU | 数据库消耗的CPU时间 | 占总CPU时间的比例 < 80% |
| Redo Size | 生成的重做日志大小 | 根据业务交易量 |
| Logical Reads | 逻辑读次数 | 根据业务需求 |
| Block Changes | 数据块修改次数 | 根据业务需求 |
| Physical Reads | 物理读次数 | 物理读/逻辑读 < 10% |
| Physical Writes | 物理写次数 | 根据业务需求 |
| User Calls | 用户调用次数 | 根据业务需求 |
| Parses | SQL解析次数 | 软解析比例 > 90% |
| Hard Parses | 硬解析次数 | 硬解析/总解析 < 10% |
| Executions | SQL执行次数 | 根据业务需求 |
| Transactions | 事务次数 | 根据业务需求 |
2. 等待事件统计
等待事件是AWR报告中最关键的部分,用于识别数据库性能瓶颈。
主要等待事件类型
- CPU相关:CPU time
- I/O相关:db file sequential read, db file scattered read, log file parallel write
- 锁相关:enqueue, latch: shared pool, library cache lock
- 网络相关:SQLNet message from client, SQLNet message to client
- 内存相关:free buffer waits, buffer busy waits
- 并发相关:row cache lock, enqueue
等待事件分析步骤
- 查看Top 5等待事件,识别主要瓶颈
- 分析每个等待事件的平均等待时间
- 关联等待事件与SQL语句或会话
- 提出优化建议
3. SQL统计信息
AWR报告中的SQL统计信息部分显示了资源消耗最多的SQL语句,包括:
- Elapsed Time (s):总执行时间
- CPU Time (s):CPU消耗时间
- Executions:执行次数
- Elap Per Exec (s):每次执行的平均时间
- Buffer Gets:逻辑读次数
- Disk Reads:物理读次数
- Direct Writes:直接写次数
- Rows Processed:处理的行数
SQL调优步骤
- 识别Top SQL语句(按Elapsed Time或CPU Time排序)
- 查看SQL执行计划
- 分析执行计划中的瓶颈(如全表扫描、嵌套循环连接)
- 优化SQL语句或调整索引
- 重新生成执行计划
- 验证优化效果
4. 实例效率百分比
显示数据库的各种效率指标,用于评估数据库整体性能:
| 指标名称 | 描述 | 正常范围 |
|---|---|---|
| Buffer Nowait % | 缓冲区立即获取百分比 | > 99% |
| Buffer Hit % | 缓冲区命中率 | > 95% |
| Library Hit % | 库缓存命中率 | > 95% |
| Redo NoWait % | 重做日志立即获取百分比 | > 99% |
| In-memory Sort % | 内存排序百分比 | > 95% |
| Soft Parse % | 软解析百分比 | > 90% |
| Execute to Parse % | 执行/解析比例 | > 80% |
| Latch Hit % | 闩锁命中率 | > 99% |
| Parse CPU to Parse Elapsd % | 解析CPU时间/解析总时间 | > 70% |
5. 资源使用情况
包括CPU、内存、I/O等资源的使用情况:
- CPU使用情况:CPU消耗分布,如DB CPU、background CPU等
- 内存使用情况:SGA和PGA的使用统计
- I/O使用情况:数据文件I/O统计,包括读写次数、等待时间等
- 网络使用情况:网络流量统计
ASH报告关键指标解读
1. 报告首页
- 报告时间范围:开始和结束时间
- 数据库信息:数据库版本、实例名、主机名
- 采样信息:采样次数、采样间隔、活动会话数
2. 顶部等待事件
显示报告期间最主要的等待事件,包括:
- Event:等待事件名称
- Count:等待次数
- % Event:该事件占总等待的百分比
- Avg Wait (ms):平均等待时间
- Total Wait (ms):总等待时间
3. 按维度分析等待事件
ASH报告可以按不同维度分析等待事件,包括:
- 按会话状态:ACTIVE、WAITING
- 按等待事件类型:I/O、CPU、锁等
- 按SQL ID:显示每个SQL语句的等待事件
- 按会话:显示每个会话的等待事件
- 按用户:显示每个用户的等待事件
- 按程序:显示每个客户端程序的等待事件
4. ASH采样数据
显示详细的ASH采样数据,包括:
- Sample Time:采样时间
- Session ID:会话ID
- SQL ID:执行的SQL ID
- Event:等待事件
- Wait Class:等待事件类别
- P1/P2/P3:等待事件的参数
- Current Obj#:当前操作的对象ID
19c和21c AWR/ASH差异
1. AWR增强
| 特性 | 19c | 21c |
|---|---|---|
| AWR报告内容 | 详细 | 更详细,新增多个统计指标 |
| 快照生成频率 | 支持自定义 | 支持更灵活的快照调度 |
| 报告格式 | HTML/TXT | 新增JSON格式,便于自动化处理 |
| 报告大小 | 适中 | 优化报告生成,减小报告大小 |
| 采样精度 | 秒级 | 支持毫秒级采样 |
2. ASH增强
| 特性 | 19c | 21c |
|---|---|---|
| ASH采样频率 | 每秒1次 | 支持自定义采样频率(最高每秒10次) |
| 采样数据保留 | 内存中1小时,AWR表8天 | 内存中2小时,AWR表14天 |
| 报告分析维度 | 丰富 | 新增更多分析维度,如按服务、按模块 |
| 实时分析能力 | 强 | 更强,支持实时ASH报告生成 |
| 等待事件分类 | 标准 | 更细化的等待事件分类 |
3. 新增功能
Oracle 21c新增功能
- 自动AWR基线:自动创建和管理AWR基线
- 智能AWR报告:基于机器学习的AWR报告分析
- AWR差异报告增强:更详细的AWR差异比较
- ASH热力图:可视化显示ASH数据,便于识别热点区域
- SQL计划比较:在AWR报告中直接比较SQL执行计划变化
生产环境AWR/ASH最佳实践
1. AWR配置优化
sql
-- 调整快照生成频率(每30分钟一次)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
interval => 30,
retention => 7*24*60, -- 保留7天
topnsql => 100 -- 每个快照保留100条Top SQL
);
-- 创建AWR基线
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(
start_snap_id => 100,
end_snap_id => 200,
baseline_name => 'NORMAL_LOAD',
dbid => 1234567890
);
-- 创建重复AWR基线(每周同一时间段)
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_REPEATING_BASELINE(
day_of_week => 'MONDAY',
hour_in_day => 10,
duration => 60,
baseline_name => 'MONDAY_MORNING',
template_name => 'WEEKLY_MORNING',
start_time => SYSTIMESTAMP,
end_time => SYSTIMESTAMP + INTERVAL '12' MONTH
);2. ASH配置优化
sql
-- 调整ASH采样频率(每秒2次)
ALTER SYSTEM SET ash_sampling_interval = 500 SCOPE = SPFILE; -- 500毫秒
-- 重启实例使配置生效
SHUTDOWN IMMEDIATE;
STARTUP;3. 报告分析最佳实践
定期生成和分析AWR报告:
- 每天生成前一天的AWR报告
- 每周生成周度AWR报告
- 每月生成月度AWR报告
实时监控使用ASH报告:
- 当出现性能问题时,立即生成ASH报告
- 分析最近1小时或30分钟的ASH数据
- 识别当前的性能瓶颈
结合多个报告分析:
- 结合AWR报告和ASH报告,从宏观和微观两个层面分析
- 结合SQL Tuning Advisor和AWR报告,优化Top SQL
- 结合ADDM(Automatic Database Diagnostic Monitor)报告,获取自动诊断建议
建立性能基线:
- 创建正常负载下的AWR基线
- 当性能下降时,与基线比较,识别异常变化
- 定期更新性能基线,适应业务变化
4. 性能问题诊断流程
- 收集信息:生成AWR报告、ASH报告、ADDM报告
- 识别瓶颈:
- 查看Top 5等待事件
- 分析CPU、I/O、内存使用情况
- 识别资源消耗最多的SQL语句
- 定位原因:
- 关联等待事件与SQL语句
- 分析SQL执行计划
- 检查系统资源使用情况
- 提出解决方案:
- SQL调优
- 索引调整
- 系统参数优化
- 硬件资源扩容
- 实施和验证:
- 实施优化方案
- 生成新的AWR/ASH报告
- 验证性能改进效果
常见问题(FAQ)
Q: 如何调整AWR快照生成频率和保留时间?
A: 可以使用DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS过程调整:
sql
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
interval => 30, -- 快照生成频率(分钟)
retention => 7*24*60, -- 保留时间(分钟)
topnsql => 100 -- 每个快照保留的Top SQL数量
);Q: 如何手动生成AWR快照?
A: 可以使用DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT过程手动生成快照:
sql
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;Q: 如何删除旧的AWR快照?
A: 可以使用DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE过程删除指定范围的快照:
sql
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(
low_snap_id => 100,
high_snap_id => 200,
dbid => 1234567890
);Q: ASH报告和AWR报告的区别是什么?
A: 主要区别:
| 特性 | ASH报告 | AWR报告 |
|---|---|---|
| 时间范围 | 短期(分钟到小时) | 长期(小时到天) |
| 数据粒度 | 细粒度(每秒采样) | 粗粒度(每小时快照) |
| 主要用途 | 实时性能问题诊断 | 长期性能趋势分析 |
| 数据详细程度 | 非常详细,包含每个活动会话的信息 | 汇总信息,包含统计数据 |
Q: 如何使用ASH报告诊断锁等待问题?
A: 可以通过以下步骤:
- 生成锁等待期间的ASH报告
- 查看Top等待事件,识别锁相关等待事件(如enqueue)
- 按SQL ID或会话ID分析,找到阻塞会话
- 查看阻塞会话执行的SQL语句
- 终止阻塞会话或优化SQL语句
Q: 19c和21c的AWR报告有什么变化?
A: 21c的AWR报告主要变化:
- 新增更多统计指标,如内存使用详情、I/O性能指标
- 支持JSON格式报告,便于自动化处理
- 优化报告生成算法,减小报告大小
- 新增SQL计划比较功能
- 增强的等待事件分类和统计
Q: 如何使用ADDM报告?
A: ADDM(Automatic Database Diagnostic Monitor)是AWR的重要组成部分,可以自动分析AWR数据并提供优化建议:
sql
-- 生成ADDM报告
@?/rdbms/admin/addmrpt.sql
-- 按照提示输入:
-- 1. 开始和结束快照ID
-- 2. 报告文件名ADDM报告包含:
- 发现的性能问题
- 问题的严重程度
- 建议的解决方案
- 预计改进效果
总结
AWR和ASH是Oracle数据库中强大的性能监控和分析工具,通过合理使用这些工具,可以有效识别和解决数据库性能问题。
在生产环境中,建议:
- 优化AWR/ASH配置,根据业务需求调整快照频率和保留时间
- 定期生成和分析AWR报告,建立性能基线
- 当出现性能问题时,立即生成ASH报告,进行实时诊断
- 结合多个报告和工具,进行综合性能分析
- 利用21c新增的功能,如智能AWR报告和ASH热力图,提高分析效率
通过掌握AWR/ASH报告分析技巧,DBA可以更好地监控和优化数据库性能,确保数据库系统的稳定运行和良好性能。
