外观
Oracle AWR报告定期分析
概述
AWR(Automatic Workload Repository)报告是Oracle数据库性能监控和分析的核心工具,通过定期分析AWR报告,可以及时发现数据库性能问题,优化系统资源使用,确保数据库稳定运行。
AWR报告生成
手动生成AWR报告
在SQL*Plus中连接到数据库,执行以下步骤生成AWR报告:
sql
-- 以sysdba身份登录
conn / as sysdba
-- 执行awrrpt.sql脚本
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
-- 选择报告格式(html或txt)
Enter value for report_type: html
-- 选择天数范围
Enter value for num_days: 7
-- 选择开始快照ID
Enter value for begin_snap:
-- 选择结束快照ID
Enter value for end_snap:
-- 输入报告文件名
Enter value for report_name:自动生成AWR报告脚本
创建Shell脚本自动生成AWR报告:
bash
#!/bin/bash
# 自动生成AWR报告脚本
ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
ORACLE_SID=ORCL
DATE=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR=/home/oracle/awr_reports
EMAIL=admin@example.com
# 确保输出目录存在
mkdir -p $OUTPUT_DIR
# 生成AWR报告的SQL脚本
SQL_SCRIPT=$OUTPUT_DIR/generate_awr.sql
cat > $SQL_SCRIPT << EOF
set echo off
set termout off
set feedback off
set heading off
spool $OUTPUT_DIR/awrrpt_${ORACLE_SID}_${DATE}.html
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
h
7
awr_${ORACLE_SID}_${DATE}.html
spool off
exit
EOF
# 执行SQL脚本
$ORACLE_HOME/bin/sqlplus -S / as sysdba @$SQL_SCRIPT
# 发送邮件通知
if [ -f $OUTPUT_DIR/awr_${ORACLE_SID}_${DATE}.html ]; then
echo "AWR报告已生成,文件名为:awrrpt_${ORACLE_SID}_${DATE}.html" | mail -s "Oracle AWR报告 - ${ORACLE_SID} - ${DATE}" -a $OUTPUT_DIR/awrrpt_${ORACLE_SID}_${DATE}.html $EMAIL
fi
# 清理7天前的报告
find $OUTPUT_DIR -name "*.html" -mtime +7 -delete使用OEM自动生成AWR报告
- 登录Oracle Enterprise Manager
- 导航到"性能" → "AWR报告"
- 设置报告生成计划
- 配置通知选项
AWR报告关键指标解读
报告头信息
- 数据库版本:Oracle数据库版本信息,如19.3.0.0.0或21.3.0.0.0
- 快照时间范围:报告涵盖的时间范围,建议选择业务高峰期
- 数据库ID和实例ID:用于标识数据库和实例
- DB时间:数据库花费在处理用户请求上的时间总和
等待事件分析
等待事件是AWR报告中最重要的部分,反映了数据库的主要瓶颈:
顶级等待事件
| 等待事件 | 等待时间(s) | 平均等待时间(ms) | 等待次数 | 占总等待时间百分比 |
|---|---|---|---|---|
| db file sequential read | 1200 | 5 | 240000 | 35% |
| log file sync | 800 | 10 | 80000 | 23% |
| db file scattered read | 600 | 15 | 40000 | 17% |
| latch free | 400 | 2 | 200000 | 11% |
| buffer busy waits | 200 | 20 | 10000 | 6% |
常见等待事件分析
db file sequential read
- 单块读取操作,通常与索引访问相关
- 可能原因:索引设计不合理、统计信息过时、全表扫描
db file scattered read
- 多块读取操作,通常与全表扫描相关
- 可能原因:缺少合适的索引、表太小不适合使用索引
log file sync
- 事务提交时等待日志写入磁盘
- 可能原因:磁盘I/O性能差、提交频率过高
latch free
- 闩锁竞争
- 可能原因:共享池不足、SQL解析过多
buffer busy waits
- 缓冲区繁忙等待
- 可能原因:热块争用、段头争用
内存使用分析
SGA使用情况
- 共享池:库缓存和数据字典缓存的使用情况
- 缓冲区缓存:数据块缓存的命中率
- 日志缓冲区:日志缓冲区的使用情况,建议命中率>99%
PGA使用情况
- PGA聚合目标:当前设置的PGA目标值
- PGA实际使用:实际使用的PGA内存
- SQL工作区:排序和哈希操作的内存使用情况
存储I/O分析
- 物理读:每秒物理读取的数据块数
- 物理写:每秒物理写入的数据块数
- I/O等待时间:I/O操作的平均等待时间
- 表空间I/O:各表空间的I/O分布情况
SQL语句分析
顶级SQL语句
AWR报告中会列出消耗资源最多的SQL语句,包括:
- 消耗CPU最多的SQL
- 消耗I/O最多的SQL
- 执行时间最长的SQL
- 执行次数最多的SQL
SQL语句优化建议
- 检查SQL语句的执行计划
- 验证表和索引的统计信息
- 考虑添加或修改索引
- 优化SQL语句结构
- 考虑使用绑定变量
AWR报告分析流程
1. 确定报告范围
- 选择合适的时间范围,涵盖业务高峰期
- 比较不同时间段的报告,识别性能变化趋势
- 与基准报告进行对比,发现异常情况
2. 检查整体性能指标
- 查看DB时间与Elapsed时间的比率,判断系统负载
- 分析CPU使用率,判断是否存在CPU瓶颈
- 检查内存使用率,判断是否需要调整内存参数
- 分析I/O性能,判断是否存在磁盘瓶颈
3. 分析等待事件
- 识别排名靠前的等待事件
- 分析每个等待事件的根本原因
- 制定相应的优化措施
4. 检查SQL语句
- 分析消耗资源最多的SQL语句
- 识别需要优化的SQL语句
- 实施SQL优化
5. 检查数据库对象
- 分析表和索引的使用情况
- 检查是否存在碎片
- 验证统计信息的准确性
6. 生成优化建议
- 根据分析结果生成具体的优化建议
- 确定优化的优先级
- 制定实施计划
19c与21c版本差异
AWR报告内容差异
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| AWR报告格式 | 传统格式 | 新增HTML5格式,支持交互式分析 |
| 实时AWR报告 | 支持 | 增强实时AWR报告功能 |
| AWR快照保留 | 默认8天 | 默认31天 |
| AWR自动基线 | 支持 | 增强自动基线管理 |
| 内存诊断 | 基本内存诊断 | 增强内存诊断,包括PGA详细信息 |
| I/O诊断 | 基本I/O诊断 | 增强I/O诊断,包括存储层信息 |
新特性
AWR Compare Periods报告增强
- 支持对比多个时间段的AWR报告
- 新增差异分析功能
AWR Baseline模板
- 支持创建和管理AWR基线模板
- 自动生成基线报告
AWR报告数据挖掘
- 支持对AWR报告数据进行挖掘分析
- 自动识别性能趋势
最佳实践
AWR报告生成频率
- 生产环境:建议每小时生成一次快照,保留30天
- 测试环境:建议每4小时生成一次快照,保留7天
- 开发环境:建议每天生成一次快照,保留3天
AWR报告分析频率
- 每日分析:查看前一天的AWR报告,重点关注异常情况
- 每周分析:对一周的AWR报告进行综合分析,识别性能趋势
- 每月分析:对一个月的AWR报告进行深入分析,制定优化计划
AWR报告存储管理
- 定期归档AWR报告,建议保留6个月
- 使用压缩工具减少报告存储空间
- 建立AWR报告索引,便于快速检索
AWR报告与其他性能工具结合
- 结合ASH报告进行实时性能分析
- 结合ADDM报告获取自动诊断建议
- 结合SQL Tuning Advisor获取SQL优化建议
常见问题(FAQ)
Q: AWR报告中DB时间大于Elapsed时间是什么原因?
A: DB时间是数据库处理用户请求花费的总时间,当系统有多个CPU时,DB时间可能大于Elapsed时间。这表示系统有较高的并发度,多个CPU同时处理请求。
Q: 如何调整AWR快照的生成频率和保留时间?
A: 可以使用以下SQL命令调整:
sql
-- 修改快照生成频率为30分钟
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 30, retention => 43200);
-- 修改快照保留时间为30天(43200分钟)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 43200);Q: 如何手动创建AWR快照?
A: 可以使用以下SQL命令手动创建AWR快照:
sql
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();Q: 如何生成AWR Compare Periods报告?
A: 可以使用以下方法:
- 在SQL*Plus中执行awrrpti.sql脚本
- 在OEM中导航到"性能" → "AWR Compare Periods"
- 使用DBMS_WORKLOAD_REPOSITORY.CREATE_COMPARE_PERIOD_REPORT函数
Q: AWR报告中如何识别CPU瓶颈?
A: 可以通过以下指标识别CPU瓶颈:
- CPU使用率接近100%
- DB时间与Elapsed时间的比率接近CPU数量
- 等待事件中CPU相关等待事件排名靠前
- 共享池中的硬解析率较高
Q: 如何优化AWR报告中的log file sync等待事件?
A: 可以采取以下措施:
- 优化事务设计,减少提交频率
- 优化磁盘I/O性能,特别是日志文件所在的磁盘
- 调整LOG_BUFFER参数
- 考虑使用异步I/O
- 检查是否存在磁盘争用
Q: 如何使用AWR报告诊断内存泄漏?
A: 可以通过以下方法:
- 分析多个连续AWR报告中的内存使用趋势
- 检查共享池和PGA的使用情况
- 查看V$SGASTAT和V$PGASTAT视图中的详细信息
- 考虑使用内存诊断工具,如Automatic Memory Manager
总结
AWR报告是Oracle数据库性能监控和分析的重要工具,定期分析AWR报告可以帮助DBA及时发现和解决性能问题,优化数据库性能。通过本文的介绍,相信您已经掌握了AWR报告的定期分析方法和最佳实践,能够有效地使用AWR报告进行数据库性能管理。
