Skip to content

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.sql

2. 使用Enterprise Manager生成AWR报告

  1. 登录Enterprise Manager控制台
  2. 导航到"性能"选项卡
  3. 点击"AWR报告"
  4. 选择快照范围和报告格式
  5. 生成并查看报告

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用户调用次数根据业务需求
ParsesSQL解析次数软解析比例 > 90%
Hard Parses硬解析次数硬解析/总解析 < 10%
ExecutionsSQL执行次数根据业务需求
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

等待事件分析步骤

  1. 查看Top 5等待事件,识别主要瓶颈
  2. 分析每个等待事件的平均等待时间
  3. 关联等待事件与SQL语句或会话
  4. 提出优化建议

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调优步骤

  1. 识别Top SQL语句(按Elapsed Time或CPU Time排序)
  2. 查看SQL执行计划
  3. 分析执行计划中的瓶颈(如全表扫描、嵌套循环连接)
  4. 优化SQL语句或调整索引
  5. 重新生成执行计划
  6. 验证优化效果

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增强

特性19c21c
AWR报告内容详细更详细,新增多个统计指标
快照生成频率支持自定义支持更灵活的快照调度
报告格式HTML/TXT新增JSON格式,便于自动化处理
报告大小适中优化报告生成,减小报告大小
采样精度秒级支持毫秒级采样

2. ASH增强

特性19c21c
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. 报告分析最佳实践

  1. 定期生成和分析AWR报告

    • 每天生成前一天的AWR报告
    • 每周生成周度AWR报告
    • 每月生成月度AWR报告
  2. 实时监控使用ASH报告

    • 当出现性能问题时,立即生成ASH报告
    • 分析最近1小时或30分钟的ASH数据
    • 识别当前的性能瓶颈
  3. 结合多个报告分析

    • 结合AWR报告和ASH报告,从宏观和微观两个层面分析
    • 结合SQL Tuning Advisor和AWR报告,优化Top SQL
    • 结合ADDM(Automatic Database Diagnostic Monitor)报告,获取自动诊断建议
  4. 建立性能基线

    • 创建正常负载下的AWR基线
    • 当性能下降时,与基线比较,识别异常变化
    • 定期更新性能基线,适应业务变化

4. 性能问题诊断流程

  1. 收集信息:生成AWR报告、ASH报告、ADDM报告
  2. 识别瓶颈
    • 查看Top 5等待事件
    • 分析CPU、I/O、内存使用情况
    • 识别资源消耗最多的SQL语句
  3. 定位原因
    • 关联等待事件与SQL语句
    • 分析SQL执行计划
    • 检查系统资源使用情况
  4. 提出解决方案
    • SQL调优
    • 索引调整
    • 系统参数优化
    • 硬件资源扩容
  5. 实施和验证
    • 实施优化方案
    • 生成新的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: 可以通过以下步骤:

  1. 生成锁等待期间的ASH报告
  2. 查看Top等待事件,识别锁相关等待事件(如enqueue)
  3. 按SQL ID或会话ID分析,找到阻塞会话
  4. 查看阻塞会话执行的SQL语句
  5. 终止阻塞会话或优化SQL语句

Q: 19c和21c的AWR报告有什么变化?

A: 21c的AWR报告主要变化:

  1. 新增更多统计指标,如内存使用详情、I/O性能指标
  2. 支持JSON格式报告,便于自动化处理
  3. 优化报告生成算法,减小报告大小
  4. 新增SQL计划比较功能
  5. 增强的等待事件分类和统计

Q: 如何使用ADDM报告?

A: ADDM(Automatic Database Diagnostic Monitor)是AWR的重要组成部分,可以自动分析AWR数据并提供优化建议:

sql
-- 生成ADDM报告
@?/rdbms/admin/addmrpt.sql

-- 按照提示输入:
-- 1. 开始和结束快照ID
-- 2. 报告文件名

ADDM报告包含:

  • 发现的性能问题
  • 问题的严重程度
  • 建议的解决方案
  • 预计改进效果

总结

AWR和ASH是Oracle数据库中强大的性能监控和分析工具,通过合理使用这些工具,可以有效识别和解决数据库性能问题。

在生产环境中,建议:

  1. 优化AWR/ASH配置,根据业务需求调整快照频率和保留时间
  2. 定期生成和分析AWR报告,建立性能基线
  3. 当出现性能问题时,立即生成ASH报告,进行实时诊断
  4. 结合多个报告和工具,进行综合性能分析
  5. 利用21c新增的功能,如智能AWR报告和ASH热力图,提高分析效率

通过掌握AWR/ASH报告分析技巧,DBA可以更好地监控和优化数据库性能,确保数据库系统的稳定运行和良好性能。