awr差异对比报告必须使用awrddrpt.sql(或rac环境下的awrddrpti.sql),不能用awrrpt.sql生成,因其仅支持单时间范围聚合统计,不提供跨时段指标差值计算;需指定两组对齐的快照区间,并确保时间长度、采样密度一致。

AWR差异对比报告不是标准awrrpt.sql能直接生成的——它需要手动比对两个时间窗口的指标变化,或使用awrddrpt.sql脚本。别指望交互式菜单里有“选两个时间段自动对比”这种选项。
为什么不能用awrrpt.sql生成差异报告
awrrpt.sql只支持单个时间范围(起始snap_id到结束snap_id),输出的是该区间内聚合统计值,不提供与另一区间的差值计算。所谓“差异”,本质是两份独立AWR报告中关键指标(如DB Time、Logical Reads/sec、Wait Events占比)的横向比较,Oracle没内置自动做减法的功能。
- 试图在
awrrpt.sql里输入两个不连续的时间段,脚本会报错或静默截断为第一个有效区间 - HTML报告里的“Compare Periods”按钮仅在Enterprise Manager或Cloud Control界面可用,SQL*Plus命令行无此能力
- 误以为
awrgrpt.sql(RAC全局报告)能做差异——它只是合并多个实例数据,不是跨时段对比
正确做法:用awrddrpt.sql生成标准差异报告
Oracle官方提供的差异报告脚本是awrddrpt.sql,路径同awrrpt.sql:@?/rdbms/admin/awrddrpt.sql。它要求你指定两组快照范围(baseline和target),而非单组。
- 执行前确认用户有
SELECT_CATALOG_ROLE,否则会报ORA-01031: insufficient privileges - 脚本会先让你选报告格式(
html或text),再分两次输入:第一组起止snap_id(基线)、第二组起止snap_id(目标) - 注意顺序:先输baseline区间(比如业务低峰期),再输target区间(比如慢查询发生时段),结果页会标出“Delta”列
- 输出文件名类似
awrddrpt_1_12345_12346_12347_12348.html,末尾四个数字分别是baseline_start、baseline_end、target_start、target_end
RAC环境必须用awrddrpti.sql指定实例
在RAC中运行awrddrpt.sql默认只分析当前连接实例,但差异对比常需跨实例看资源争用是否加剧。此时必须换用awrddrpti.sql,并在交互中显式选择Instance Level Report。
-
awrddrpti.sql路径相同:@?/rdbms/admin/awrddrpti.sql - 执行后第一步就问
Enter value for instance_number:,填具体实例号(如2),避免默认取1导致漏掉节点2的锁等待变化 - 若要对比整个集群行为,得分别对每个实例生成
awrddrpti报告,再人工比对“Top 5 Timed Events”中gc buffer busy acquire等RAC特有事件的delta值
容易被忽略的快照时间对齐问题
差异报告的价值高度依赖两组快照的时间长度和采样密度一致。比如baseline选02:00–03:00(1小时,60分钟粒度),target却选09:15–10:45(90分钟,含非整点快照),会导致I/O吞吐量、事务数等指标不可比。
- 查快照对齐性:运行
SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot WHERE snap_id IN (12345,12346,12347,12348) ORDER BY snap_id; - 理想情况是两组都取整点开始、整点结束,且跨度相同(如都是3600秒),否则报告里“Per Second”列会失真
- AWR默认每小时采样一次,但如果DBA调小了
snapshot_interval(如设为15分钟),则必须确保两组快照ID序列间隔相同(如baseline用12345,12346,12347,target也必须用连续三个)











