awrddrpt.sql是生成差异报告的唯一入口,它要求分两次输入baseline和target两组snap_id进行差值运算,而非awrrpt.sql等其他脚本。

awrddrpt.sql才是生成差异报告的唯一入口
Oracle没有“选两个时间段自动对比”的交互选项,awrrpt.sql只接受单组快照区间,强行输入两段会静默截断或报错。真正能算出Delta值的只有awrddrpt.sql——它要求你分两次输入 baseline 和 target 两组 snap_id,底层做指标差值运算。
常见错误现象:
- 在 SQL*Plus 里输
@?/rdbms/admin/awrrpt.sql后试图填两组 begin/end,脚本直接跳过第二组 - 误点 Enterprise Manager 界面里的 “Compare Periods” 按钮,结果导出的是 HTML 页面里的静态表格,不是 Oracle 原生计算的 delta 报告
- 用
awrgrpt.sql(RAC 全局报告)代替,它只是合并多实例数据,不支持跨时段减法
执行前必须确认:SELECT * FROM session_roles WHERE role = 'SELECT_CATALOG_ROLE';有返回。没激活就先GRANT SELECT_CATALOG_ROLE TO sys;,否则卡在权限检查阶段。
RAC 环境下必须用 awrddrpti.sql 并指定实例号
awrddrpt.sql在 RAC 中默认只分析当前连接实例,比如你在节点1上运行,它不会拉节点2的 gc buffer busy acquire 数据。要对比真实资源争用变化,必须换awrddrpti.sql。
关键操作点:
- 路径一样:
@?/rdbms/admin/awrddrpti.sql - 第一步就问
Enter value for instance_number:,必须填具体数字(如2),不能留空或输ALL - 若要覆盖整个集群,得对每个实例单独跑一次
awrddrpti.sql,再人工比对“Top 5 Timed Events”中 RAC 特有事件的Delta列
别指望awrddrpti.sql能自动聚合所有实例——它的设计目标是单实例深度对比,不是全局视图。
ADG 备库无法直接生成本地差异报告
在备库上直接运行awrddrpt.sql会立刻报ORA-13502: cannot create awr snapshot on a standby database。这不是权限问题,是 Oracle 的硬限制:19c 及以前版本中,备库不采集本地快照,DBA_HIST_* 表里的数据全来自主库归档日志。
想让备库有自己真实的 delta 报告,必须走 RMF 远程采样流程:
- 主库解锁
SYS$UMF用户:ALTER USER sys$umf IDENTIFIED BY pwd ACCOUNT UNLOCK - 主备双向建 DBLINK(备库连主库报
ORA-16000可忽略,只要主库能连备库就行) - 主库设
"_umf_remote_enabled" = TRUE,再调DBMS_UMF.CONFIGURE_TOPOLOGY和REGISTER_DATABASE - 最后在主库执行
DBMS_UMF.CREATE_REMOTE_SNAPSHOT触发备库本地采样 - 生成报告时,在
awrddrpt.sql里选 “Remote Database” 类型,并填备库的dbid和instance_number
漏掉 RMF 配置这一步,所有后续操作都只是在主库快照上做无意义的减法。
输出文件名暗含四段快照 ID,别靠猜
awrddrpt.sql生成的 HTML 文件名形如awrddrpt_1_12345_12346_12347_12348.html,末尾四个数字顺序固定为:baseline_start、baseline_end、target_start、target_end。这个命名规则是唯一可靠的方式确认你生成的是哪两段对比。
容易踩的坑:
- 手动改文件名后,报告里“Report Info”区域仍显示原始四段 ID,和文件名对不上,导致后期归档混乱
- 在 RAC + PDB 组合场景下,
dbid和instance_number必须与你实际选择的容器和实例完全一致,否则Delta列全是 0 或 N/A - 时间长度不一致(比如 baseline 是 1 小时,target 是 2 小时),报告虽能生成,但每秒指标(如 Logical Reads/sec)的 delta 值会失真,需人工换算
真正难的不是生成动作本身,而是 baseline 和 target 区间的时间密度、采样节奏、实例范围是否严格对齐——差一点,delta 就不可信。











