1. AWR性能报告基础解析
AWR(Automatic Workload Repository)是Oracle数据库内置的性能诊断工具,它就像数据库的"黑匣子"记录器,每隔一小时自动拍摄一次数据库性能快照。这些快照包含数百个关键指标,从SQL执行时间到系统等待事件,完整记录了数据库的运行状态。
重要提示:AWR报告默认保留8天,超过这个期限的快照会被自动清理。如果需要长期保存特定时间段的报告,务必及时导出。
我第一次接触AWR是在处理一个生产环境性能问题时。当时数据库在每天上午10点左右出现严重卡顿,通过对比9:00和10:30两个时间点的AWR报告,很快锁定了问题SQL。这种精准定位的能力,让AWR成为DBA最重要的诊断工具之一。
生成基础AWR报告只需要一条命令:
@?/rdbms/admin/awrrpt.sql执行后会提示输入:
- 报告类型(HTML或TEXT)
- 快照天数范围
- 具体的快照ID范围
- 报告名称
2. 关键指标解读技巧
2.1 负载概览分析
报告开头的"Load Profile"部分就像数据库的体检表。我通常会重点关注以下指标:
- DB CPU/s:每秒消耗的CPU时间,超过核心数80%就需要警惕
- Logical reads/s:逻辑读速率,突然增长可能意味着SQL效率下降
- Hard parses/s:硬解析次数,理想值应小于每秒2次
表格示例:关键指标健康阈值参考
| 指标名称 | 警戒值 | 可能问题 |
|---|---|---|
| DB CPU/s | CPU核心数×0.8 | CPU资源不足 |
| User commits/s | 500+ | 事务量过大 |
| Physical reads/s | 1000+ | I/O瓶颈 |
2.2 等待事件诊断
"Top 5 Timed Events"是AWR报告中最关键的部分。记得有次客户抱怨系统变慢,我首先检查这里,发现"log file sync"等待异常高,最终发现是存储阵列的电池故障导致redo日志写入延迟。
常见等待事件处理方案:
- db file sequential read:优化高IO的SQL,增加索引
- latch free:检查热点块,调整共享池大小
- enq: TX - row lock contention:排查锁等待和事务设计
3. 高级分析技巧
3.1 基线对比分析
Oracle允许创建性能基线(Baseline),这是AWR最强大的功能之一。我习惯在系统上线稳定后立即创建基线,后续出现问题时可以精准对比:
-- 创建基线 DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE( start_snap_id => 100, end_snap_id => 101, baseline_name => 'After_Launch'); -- 生成对比报告 @?/rdbms/admin/awrddrpt.sql3.2 时间点问题定位
对于间歇性性能问题,我开发了一套分析方法:
- 收集问题时间段前后各3个快照
- 使用以下脚本生成每小时的增量报告:
@?/rdbms/admin/awrrpti.sql- 重点关注指标突变的时间点
4. 实战问题排查案例
去年处理过一个典型案例:某电商系统在促销时出现周期性卡顿。通过AWR报告发现:
- 每15分钟出现一次"library cache lock"等待高峰
- 对应时间点有大量同类SQL的硬解析
最终解决方案:
- 使用SQL绑定变量替代字面值
- 调整cursor_sharing参数为FORCE
- 增加shared_pool_size 20%
调整后的AWR报告显示硬解析降为原来的1/50,系统恢复稳定。
5. 日常监控建议
对于生产环境,我建议建立以下AWR监控机制:
- 自动报告生成:通过Shell脚本每天自动生成并邮件发送
#!/bin/bash sqlplus / as sysdba <<EOF @?/rdbms/admin/awrrpt.sql ... EOF- 关键指标跟踪:使用以下SQL定期检查异常
SELECT metric_name, value FROM dba_hist_sysmetric_summary WHERE metric_name IN ('CPU Usage Per Sec','Database CPU Time Ratio');- 历史趋势分析:每月汇总分析AWR数据,识别潜在问题
6. 常见问题解决方案
经验之谈:AWR报告显示"DB CPU"很高,但操作系统CPU使用率却很低?这通常是因为Oracle进程在等待运行队列,检查系统负载和进程调度策略。
问题1:AWR报告生成失败,提示快照不存在
- 检查快照是否被自动清理:
SELECT * FROM dba_hist_wr_control; - 调整保留期:
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention=>14400);
问题2:报告显示"shared pool"内存不足
- 立即缓解:
ALTER SYSTEM FLUSH SHARED_POOL; - 长期方案:调整shared_pool_size,使用AWR的"Memory Advisory"确定理想值
问题3:关键SQL在报告中缺失
- 检查statistics_level是否为TYPICAL或ALL
- 确认SQL在快照期间确实执行过
- 使用以下SQL手动查询:
SELECT * FROM dba_hist_sqlstat WHERE sql_id = 'your_sql_id';7. 性能优化实战技巧
SQL优化优先级判断:
- 首先处理"SQL ordered by Elapsed Time"中占比超过5%的SQL
- 其次优化"SQL ordered by CPU Time"中的高消耗语句
- 最后处理"SQL ordered by Gets"中逻辑读异常高的查询
参数调整验证: 修改关键参数前,使用AWR基线记录当前状态:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE( start_snap_id => (SELECT MAX(snap_id)-1 FROM dba_hist_snapshot), end_snap_id => (SELECT MAX(snap_id) FROM dba_hist_snapshot), baseline_name => 'Before_Parameter_Change');存储性能分析: AWR的"I/O Profile"部分可以识别存储瓶颈:
- 单块读平均时间应<20ms
- 多块读平均时间应<15ms
- 如果"db file scattered read"等待高,考虑增加DB_CACHE_SIZE
8. 自定义报告扩展
标准AWR报告可能不包含所有需要的信息。我经常使用这些自定义查询扩展分析:
- ASH数据分析(Active Session History):
SELECT sample_time, event, count(*) FROM dba_hist_active_sess_history WHERE snap_id BETWEEN 100 AND 101 GROUP BY sample_time, event ORDER BY sample_time;- 时间模型细分:
SELECT stat_name, time_secs FROM dba_hist_sys_time_model WHERE snap_id = 100 ORDER BY time_secs DESC;- 系统统计趋势:
SELECT snap_id, begin_interval_time, value FROM dba_hist_sysstat NATURAL JOIN dba_hist_snapshot WHERE stat_name = 'execute count' ORDER BY snap_id;9. 企业级部署建议
在大型企业环境中,AWR数据的管理需要特别注意:
集中化管理:
- 使用Oracle Enterprise Manager集中监控多个数据库
- 设置统一的基线策略和保留策略
存储优化:
- AWR数据默认存储在SYSAUX表空间
- 大型系统建议调整AWR表空间:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( retention => 21600, interval => 60);安全控制:
- 限制AWR数据访问权限:
REVOKE SELECT ON WRH$_EVENT_NAME FROM PUBLIC; GRANT SELECT ON WRH$_EVENT_NAME TO PERFSTAT;
10. 性能优化闭环流程
根据多年经验,我总结出AWR驱动的性能优化闭环:
- 收集:定期自动收集AWR快照
- 分析:每周审查关键指标趋势
- 定位:出现问题时对比基线报告
- 优化:实施针对性的优化措施
- 验证:通过新的AWR报告确认效果
- 归档:保存重要时间段的报告备查
这个流程的关键是坚持长期执行。我曾经通过持续6个月的AWR监控,发现了一个每月出现一次的存储性能退化问题,最终追溯到存储阵列的固件缺陷。