1. AWR报告基础认知:数据库性能的X光片
作为Oracle DBA日常工作中最常用的性能诊断工具,AWR(Automatic Workload Repository)报告就像是给数据库拍X光片。它通过周期性采集系统性能数据(默认每小时一次),记录下数据库运行的完整状态。当SQL执行变慢时,我们首先想到的就是调出对应时间段的AWR报告进行分析。
AWR报告的核心价值在于它提供了完整的等待事件统计。Oracle数据库执行SQL时,任何环节出现瓶颈都会表现为特定的等待事件。比如:
- 大量
db file sequential read等待通常意味着索引扫描时磁盘I/O存在瓶颈 log file sync等待突增可能反映事务提交频率过高导致日志写入拥塞latch free等待过多则指向内存竞争激烈
2. AWR报告生成实操指南
2.1 环境准备与脚本定位
生成AWR报告前需要确认:
- 具有DBA权限的用户(如SYS/SYSTEM)
- 确保STATISTICS_LEVEL参数设置为TYPICAL或ALL
- 确认AWR快照已正常生成(查询DBA_HIST_SNAPSHOT视图)
核心脚本awrrpt.sql位于$ORACLE_HOME/rdbms/admin目录。在12c及以上版本的多租户环境中,需要注意:
# CDB环境执行 SQL> alter session set container=CDB$ROOT; # PDB环境执行 SQL> alter session set container=PDB_NAME;2.2 分步生成流程
- 连接SQL*Plus并切换到目标容器
- 执行脚本:
@?/rdbms/admin/awrrpt.sql - 交互式输入参数:
- 报告类型(HTML/TEXT)
- 快照天数(默认显示最近7天)
- 开始和结束快照ID
- 输出文件名(建议包含时间戳)
关键技巧:先执行
@?/rdbms/admin/awrsqrpt.sql可以获取指定SQL的专项分析报告
2.3 常见报错处理
ORA-20028错误解决方案:
-- 检查快照连续性 SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot WHERE dbid = (SELECT dbid FROM v$database) ORDER BY snap_id; -- 强制生成报告(可能数据不完整) BEGIN DBMS_WORKLOAD_REPOSITORY.awr_report_html( l_dbid => (SELECT dbid FROM v$database), l_inst_num => (SELECT instance_number FROM v$instance), l_bid => 6932, l_eid => 6933, l_options => 0); END; /3. AWR报告深度解析
3.1 关键性能指标解读
| 指标项 | 健康阈值 | 异常处理建议 |
|---|---|---|
| DB CPU | < 70% | 检查高CPU SQL |
| Buffer Hit Ratio | > 95% | 增加DB_CACHE_SIZE |
| Hard Parse/sec | < 100 | 检查绑定变量使用 |
| User Calls/sec | 视业务而定 | 对比基线值 |
3.2 等待事件分析矩阵
通过以下SQL可提取关键等待事件:
SELECT event, total_waits, time_waited_micro/1000 as time_ms, ROUND(time_waited_micro*100/SUM(time_waited_micro) OVER(),2) pct FROM dba_hist_system_event WHERE snap_id BETWEEN &begin_snap AND &end_snap ORDER BY time_waited_micro DESC;典型等待事件处理策略:
I/O相关等待:
- 优化全表扫描(添加索引)
- 考虑使用ASM重平衡磁盘
- 调整DB_WRITER_PROCESSES
锁等待:
- 检查长时间未提交事务
- 优化应用代码中的锁机制
4. 高级分析技巧
4.1 时间维度对比分析
使用awrddrpt.sql脚本可以生成两个时间段的对比报告,特别适合以下场景:
- 版本升级前后性能对比
- 参数修改效果验证
- 业务高峰/低谷期差异分析
4.2 SQL优化实战案例
通过AWR定位TOP SQL的典型流程:
- 查看"SQL Statistics"部分的"SQL ordered by Elapsed Time"
- 获取SQL_ID和执行计划哈希值
- 使用DBMS_XPLAN显示执行计划:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sql_id')); - 检查执行计划中的异常操作(如全表扫描、低效连接)
4.3 基线管理
创建性能基线便于后续比较:
-- 创建基线 EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE( start_snap_id => 7000, end_snap_id => 7001, baseline_name => 'Pre_Migration'); -- 生成基线对比报告 @?/rdbms/admin/awrddrpt.sql5. 生产环境经验总结
快照策略调整:
-- 修改快照保留期(默认8天) EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( retention => 43200); -- 分钟数(30天) -- 修改采集频率(默认1小时) EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( interval => 30); -- 分钟数应急处理流程:
- 突发性能下降时立即手动创建快照:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT; - 问题解决后再次创建快照形成完整事件记录
- 突发性能下降时立即手动创建快照:
AWR仓库清理:
-- 删除指定范围内的快照 EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE( low_snap_id => 6900, high_snap_id => 7000);
实际工作中发现,12c及以上版本在PDB中生成AWR报告时,经常会出现快照不连续的问题。这时需要检查PDB的开闭状态是否影响了快照采集。我通常会在问题发生前手动创建基线快照,确保关键时段的性能数据可追溯。