外观
Oracle AWR 和 ASH 报告分析
生成 AWR 报告
使用 SQL*Plus 生成
sql
-- 连接到数据库
sqlplus / as sysdba
-- 运行 AWR 报告生成脚本
@?/rdbms/admin/awrrpt.sql
-- 选择报告格式(html 或 txt)
Enter value for report_type: html
-- 选择天数范围
Enter value for num_days: 1
-- 选择开始快照 ID
Enter value for begin_snap:
-- 选择结束快照 ID
Enter value for end_snap:
-- 输入报告文件名
Enter value for report_name: awr_report_1_2.html使用 Enterprise Manager 生成
- 登录 Oracle Enterprise Manager
- 导航到 "性能" 选项卡
- 点击 "AWR 报告"
- 选择时间范围和快照
- 点击 "生成报告"
生成特定类型的 AWR 报告
sql
-- 生成单实例 AWR 报告
@?/rdbms/admin/awrrpt.sql
-- 生成 RAC 数据库的全局 AWR 报告
@?/rdbms/admin/awrgrpt.sql
-- 生成 RAC 数据库的节点级 AWR 报告
@?/rdbms/admin/awrrpti.sql
-- 生成 AWR 比较报告
@?/rdbms/admin/awrddrpt.sql生成 ASH 报告
使用 SQL*Plus 生成
sql
-- 连接到数据库
sqlplus / as sysdba
-- 运行 ASH 报告生成脚本
@?/rdbms/admin/ashrpt.sql
-- 选择报告格式(html 或 txt)
Enter value for report_type: html
-- 选择天数范围
Enter value for num_days: 1
-- 选择开始时间
Enter value for begin_time:
-- 选择结束时间
Enter value for duration:
-- 输入报告文件名
Enter value for report_name: ash_report.html使用 Enterprise Manager 生成
- 登录 Oracle Enterprise Manager
- 导航到 "性能" 选项卡
- 点击 "ASH 报告"
- 选择时间范围
- 点击 "生成报告"
AWR 报告分析
报告结构
- 报告标题:包含数据库名称、实例、时间范围等基本信息
- 摘要部分:包括 DB Time、DB CPU、等待事件摘要等
- Top 5 等待事件:最主要的等待事件
- SQL 统计信息:包括 Top SQL 语句
- 实例效率百分比:缓存命中率、软解析率等
- 内存统计信息:SGA、PGA 使用情况
- I/O 统计信息:数据文件 I/O 情况
- 详细等待事件:所有等待事件的详细信息
- 段统计信息:热点段分析
- 初始化参数:数据库参数设置
关键指标分析
DB Time 和 DB CPU
- DB Time:数据库总工作时间,包括 CPU 时间和等待时间
- DB CPU:数据库 CPU 时间
- DB Time/Elapsed Time:数据库负载指数,理想值为 CPU 核心数
等待事件分析
- Top 5 等待事件:识别主要瓶颈
- 等待事件比率:各类等待事件占比
- 等待时间:平均等待时间和总等待时间
SQL 语句分析
- Top SQL by Elapsed Time:执行时间最长的 SQL
- Top SQL by CPU Time:CPU 消耗最多的 SQL
- Top SQL by Logical Reads:逻辑读最多的 SQL
- Top SQL by Physical Reads:物理读最多的 SQL
实例效率分析
- Buffer Cache Hit Ratio:缓冲区缓存命中率,理想值 > 95%
- Library Cache Hit Ratio:库缓存命中率,理想值 > 99%
- Soft Parse Ratio:软解析率,理想值 > 95%
- Execute to Parse Ratio:执行与解析比率,理想值 > 90%
ASH 报告分析
报告结构
- 报告标题:包含数据库名称、实例、时间范围等基本信息
- 摘要部分:包括采样时间、会话数、等待事件摘要等
- Top 等待事件:最主要的等待事件
- Top SQL 语句:消耗资源最多的 SQL
- Top 会话:活动最频繁的会话
- Top 阻塞者:造成阻塞的会话
- 等待事件详细信息:各类等待事件的详细分布
关键指标分析
等待事件分布
- 等待事件类型:CPU、I/O、锁等不同类型的等待
- 等待事件占比:各类等待事件的百分比
- 等待时长:平均等待时间和总等待时间
SQL 语句分析
- Top SQL by Event:按事件分类的 Top SQL
- Top SQL by Duration:持续时间最长的 SQL
- Top SQL by CPU:CPU 消耗最多的 SQL
会话分析
- Top Sessions:活动最频繁的会话
- Session Details:会话的详细活动情况
- Blocking Sessions:造成阻塞的会话
性能问题诊断流程
1. 收集性能数据
- 生成 AWR 报告(长期趋势分析)
- 生成 ASH 报告(实时问题诊断)
- 收集系统级性能数据
2. 分析性能瓶颈
- 识别主要等待事件:从 Top 5 等待事件开始分析
- 定位问题 SQL:分析 Top SQL 语句
- 检查资源使用:CPU、内存、I/O 等资源使用情况
- 分析实例效率:缓存命中率、解析率等指标
3. 确定问题原因
- 等待事件分析:根据等待事件类型确定问题原因
- SQL 语句分析:检查执行计划、绑定变量使用等
- 系统资源分析:检查系统级资源瓶颈
- 配置参数分析:检查数据库参数设置
4. 实施解决方案
- SQL 优化:重写 SQL、创建索引、调整执行计划
- 参数调整:修改数据库参数
- 资源调整:增加系统资源、优化存储
- 应用优化:调整应用程序逻辑
5. 验证解决方案
- 生成新的性能报告
- 比较优化前后的性能指标
- 确认问题是否解决
- 监控长期性能趋势
常见性能问题分析
1. I/O 瓶颈
症状:
- Top 等待事件包含 "db file sequential read"、"db file scattered read"
- 物理读次数高,I/O 等待时间长
- 缓冲区缓存命中率低
解决方案:
- 优化 SQL 语句,减少物理读
- 创建合适的索引,减少全表扫描
- 调整 DB_CACHE_SIZE 参数
- 优化存储系统,提高 I/O 性能
2. CPU 瓶颈
症状:
- Top 等待事件包含 "CPU time"
- DB CPU 占比高
- 系统 CPU 使用率接近 100%
解决方案:
- 优化 CPU 密集型 SQL 语句
- 减少硬解析,使用绑定变量
- 调整 SHARED_POOL_SIZE 参数
- 考虑增加 CPU 资源
3. 锁和阻塞
症状:
- Top 等待事件包含 "enqueue"、"row lock contention"
- ASH 报告显示阻塞会话
- 事务执行时间长
解决方案:
- 优化事务逻辑,减少锁定时间
- 使用适当的隔离级别
- 检查并终止长时间运行的事务
- 调整应用程序逻辑,避免死锁
4. 内存瓶颈
症状:
- 大量的 PGA 内存使用
- 排序操作使用临时表空间
- 游标溢出到磁盘
解决方案:
- 调整 PGA_AGGREGATE_TARGET 参数
- 优化排序操作,减少排序量
- 使用适当的索引,避免排序
- 考虑增加内存资源
AWR 和 ASH 报告最佳实践
报告生成
- 选择合适的时间范围:避免生成过长或过短的报告
- 对比报告:使用 AWR 比较报告分析性能变化
- 定期生成:建立定期生成报告的机制
- 保存历史报告:便于趋势分析和问题追溯
分析技巧
- 关注变化:对比不同时间点的报告,关注指标变化
- 从宏观到微观:先看摘要,再深入分析具体问题
- 综合分析:结合 AWR、ASH 和系统级数据进行分析
- 关注比例:不仅看绝对值,还要看相对比例
自动化
- 自动生成报告:使用脚本定期生成性能报告
- 自动分析:使用工具自动分析报告中的异常
- 自动告警:设置性能指标阈值,超过阈值时告警
- 性能趋势:建立性能趋势分析系统
常见问题(FAQ)
Q1: AWR 和 ASH 报告有什么区别?
A1: AWR 报告是基于每小时收集的快照数据生成的,适用于长期性能趋势分析和整体性能评估。ASH 报告是基于每秒采样的活动会话数据生成的,适用于实时性能问题诊断和短期性能异常分析。
Q2: 如何确定生成 AWR 报告的最佳时间范围?
A2: 应根据问题的持续时间和严重程度确定。对于短期问题,选择 1-2 小时的时间范围;对于长期趋势分析,选择 1 天或更长时间;对于性能对比,选择相同工作负载的时间段。
Q3: 如何分析 AWR 报告中的 Top SQL 语句?
A3: 分析 Top SQL 语句时,应关注:
- 执行计划是否合理
- 是否使用了绑定变量
- 是否有合适的索引
- 是否可以重写 SQL 语句
- 是否存在全表扫描或其他低效操作
Q4: 如何解决 "db file sequential read" 等待事件?
A4: "db file sequential read" 通常表示单块读取操作慢,常见于索引扫描。解决方案包括:
- 优化 SQL 语句,减少索引扫描次数
- 检查索引是否合理,考虑创建或重建索引
- 优化存储系统,提高随机 I/O 性能
- 调整 DB_CACHE_SIZE 参数
Q5: 如何使用 ASH 报告诊断实时性能问题?
A5: 使用 ASH 报告诊断实时性能问题时:
- 关注 Top 等待事件,识别瓶颈
- 查看 Top 会话,找到活动最频繁的会话
- 分析 Top SQL,定位消耗资源最多的 SQL
- 检查阻塞者,识别造成阻塞的会话
- 结合系统级数据,综合分析问题原因
