AWR报告需基于有效快照生成,先确认AWR启用及快照存在:执行SELECT snap_interval, retention FROM dba_hist_wr_control;和SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 10 ROWS ONLY;再按环境选用对应脚本(如单实例用awrrpt.sql),严格选择时间匹配的begin_snap与end_snap,避免ORA-13786错误或空报告。

AWR 报告不是“点一下就出来”的快照截图,而是基于两个时间点之间的性能聚合统计。你必须先确认数据库在目标时间段内有可用快照,再用正确的脚本和权限生成——否则会卡在交互界面、报错 ORA-13786: no snapshots found 或生成空报告。
确认 AWR 已启用且有可用快照
没快照,就根本没法生成报告。别跳过这步直接跑 @?/rdbms/admin/awrrpt.sql。
- 登录后执行:
SELECT snap_interval, retention FROM dba_hist_wr_control;—— 确保snap_interval不是+000000000 00:00:00.0(表示禁用) - 查最近 10 个快照:
SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 10 ROWS ONLY; - 如果结果为空或快照时间远早于你要分析的时段(比如你想看昨天 9–10 点,但最新快照是前天的),说明 AWR 没采集到,或保留期已过(默认 8 天),或数据库刚重启过还没触发首次自动快照
用对脚本:单实例 vs RAC 环境不能混用
Oracle 11g 对不同部署结构提供了专用脚本,用错会导致提示 “no instances found” 或只出部分数据。
- 单实例数据库(最常见):用
@?/rdbms/admin/awrrpt.sql - RAC 全局报告(所有节点汇总):用
@?/rdbms/admin/awrgrpt.sql - RAC 中指定某一个实例(如 inst_num=2):用
@?/rdbms/admin/awrrpti.sql - 只分析某条 SQL 的历史执行情况:用
@?/rdbms/admin/awrsqrpt.sql或awrsqrpi.sql - 注意:这些脚本路径里的
?是$ORACLE_HOME的简写,确保当前 shell 下$ORACLE_HOME已正确设置,否则会报SP2-0310: unable to open file
交互式生成时关键参数怎么选
运行脚本后,系统会逐项提示输入。最容易出错的是时间范围和实例号。
-
report_type:直接回车,默认 HTML,别输错拼写(如html带空格会失败) -
num_days:不是“查几天前”,而是“列出最近 N 天内的快照供你选”。输1列今天,输3列最近三天——它只是筛选列表,不决定报告跨度 -
begin_snap和end_snap:必须从上一步列出的快照 ID 中选,且end_snap > begin_snap。跨度建议控制在 30 分钟~2 小时内;太短(如只隔 1 个快照)可能没业务流量,太长(跨多个业务波峰)会让高负载被平均掉 - 多实例环境(RAC)下,脚本会问
instance number。如果漏选或输错(比如该输2却输成0),报告里 DB Name 和 Instance Number 对不上,数据就不可信
生成后找不到文件?路径和命名规则要盯住
脚本最后让你输 report_name,这个值决定输出位置和文件名,但很多人没意识到它默认是当前 SQL*Plus 启动目录下的相对路径。
- 不输入直接回车 → 默认生成
awrrpt_<dbid>_<begin_snap>_<end_snap>.html</end_snap></begin_snap></dbid>,存放在你执行sqlplus时所在的 Linux 目录(不是$ORACLE_HOME) - 输绝对路径如
/tmp/my_awr.html→ 文件会落在 /tmp 下 - 输带目录的相对路径如
./reports/awr.html→ 要求当前目录下已有reports/子目录,否则报错SP2-0734: unknown command - 生成完立刻用
ls -l *.html确认文件是否存在,大小是否 >100KB(空报告通常只有几 KB)
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();,压测前后各一次,再选这两个 ID 生成报告。



















