Skip to content

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报告

  1. 登录Oracle Enterprise Manager
  2. 导航到"性能" → "AWR报告"
  3. 设置报告生成计划
  4. 配置通知选项

AWR报告关键指标解读

报告头信息

  • 数据库版本:Oracle数据库版本信息,如19.3.0.0.0或21.3.0.0.0
  • 快照时间范围:报告涵盖的时间范围,建议选择业务高峰期
  • 数据库ID和实例ID:用于标识数据库和实例
  • DB时间:数据库花费在处理用户请求上的时间总和

等待事件分析

等待事件是AWR报告中最重要的部分,反映了数据库的主要瓶颈:

顶级等待事件

等待事件等待时间(s)平均等待时间(ms)等待次数占总等待时间百分比
db file sequential read1200524000035%
log file sync800108000023%
db file scattered read600154000017%
latch free400220000011%
buffer busy waits20020100006%

常见等待事件分析

  1. db file sequential read

    • 单块读取操作,通常与索引访问相关
    • 可能原因:索引设计不合理、统计信息过时、全表扫描
  2. db file scattered read

    • 多块读取操作,通常与全表扫描相关
    • 可能原因:缺少合适的索引、表太小不适合使用索引
  3. log file sync

    • 事务提交时等待日志写入磁盘
    • 可能原因:磁盘I/O性能差、提交频率过高
  4. latch free

    • 闩锁竞争
    • 可能原因:共享池不足、SQL解析过多
  5. 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语句优化建议

  1. 检查SQL语句的执行计划
  2. 验证表和索引的统计信息
  3. 考虑添加或修改索引
  4. 优化SQL语句结构
  5. 考虑使用绑定变量

AWR报告分析流程

1. 确定报告范围

  • 选择合适的时间范围,涵盖业务高峰期
  • 比较不同时间段的报告,识别性能变化趋势
  • 与基准报告进行对比,发现异常情况

2. 检查整体性能指标

  • 查看DB时间与Elapsed时间的比率,判断系统负载
  • 分析CPU使用率,判断是否存在CPU瓶颈
  • 检查内存使用率,判断是否需要调整内存参数
  • 分析I/O性能,判断是否存在磁盘瓶颈

3. 分析等待事件

  • 识别排名靠前的等待事件
  • 分析每个等待事件的根本原因
  • 制定相应的优化措施

4. 检查SQL语句

  • 分析消耗资源最多的SQL语句
  • 识别需要优化的SQL语句
  • 实施SQL优化

5. 检查数据库对象

  • 分析表和索引的使用情况
  • 检查是否存在碎片
  • 验证统计信息的准确性

6. 生成优化建议

  • 根据分析结果生成具体的优化建议
  • 确定优化的优先级
  • 制定实施计划

19c与21c版本差异

AWR报告内容差异

特性Oracle 19cOracle 21c
AWR报告格式传统格式新增HTML5格式,支持交互式分析
实时AWR报告支持增强实时AWR报告功能
AWR快照保留默认8天默认31天
AWR自动基线支持增强自动基线管理
内存诊断基本内存诊断增强内存诊断,包括PGA详细信息
I/O诊断基本I/O诊断增强I/O诊断,包括存储层信息

新特性

  1. AWR Compare Periods报告增强

    • 支持对比多个时间段的AWR报告
    • 新增差异分析功能
  2. AWR Baseline模板

    • 支持创建和管理AWR基线模板
    • 自动生成基线报告
  3. 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: 可以使用以下方法:

  1. 在SQL*Plus中执行awrrpti.sql脚本
  2. 在OEM中导航到"性能" → "AWR Compare Periods"
  3. 使用DBMS_WORKLOAD_REPOSITORY.CREATE_COMPARE_PERIOD_REPORT函数

Q: AWR报告中如何识别CPU瓶颈?

A: 可以通过以下指标识别CPU瓶颈:

  • CPU使用率接近100%
  • DB时间与Elapsed时间的比率接近CPU数量
  • 等待事件中CPU相关等待事件排名靠前
  • 共享池中的硬解析率较高

Q: 如何优化AWR报告中的log file sync等待事件?

A: 可以采取以下措施:

  1. 优化事务设计,减少提交频率
  2. 优化磁盘I/O性能,特别是日志文件所在的磁盘
  3. 调整LOG_BUFFER参数
  4. 考虑使用异步I/O
  5. 检查是否存在磁盘争用

Q: 如何使用AWR报告诊断内存泄漏?

A: 可以通过以下方法:

  1. 分析多个连续AWR报告中的内存使用趋势
  2. 检查共享池和PGA的使用情况
  3. 查看V$SGASTAT和V$PGASTAT视图中的详细信息
  4. 考虑使用内存诊断工具,如Automatic Memory Manager

总结

AWR报告是Oracle数据库性能监控和分析的重要工具,定期分析AWR报告可以帮助DBA及时发现和解决性能问题,优化数据库性能。通过本文的介绍,相信您已经掌握了AWR报告的定期分析方法和最佳实践,能够有效地使用AWR报告进行数据库性能管理。