awrrpt.sql是Oracle 19c中唯一官方支持批量生成AWR报告的脚本,需通过参数文件绕过交互式输入,精准指定snap_id、确保statistics_level=TYPICAL且具备Diagnostic Pack授权,并配合定时归档清理。

用 awrrpt.sql 脚本定时生成报告最可靠
Oracle 19c 中没有内置的“自动导出”开关,awrrpt.sql 是官方唯一支持批量生成 HTML/TEXT 报告的脚本,路径固定在 $ORACLE_HOME/rdbms/admin/awrrpt.sql。它不依赖 GUI 或 Enterprise Manager,适合写进 crontab 或 Windows Task Scheduler。
常见错误是直接运行脚本却卡在交互式提示里——它默认等待人工输入参数。必须用重定向或 SQL*Plus 的 @ + 参数文件方式绕过:
- 准备一个参数文件
/tmp/awr_params.txt,内容按顺序写四行:html、1(表示最近1天内快照)、12345(起始snap_id)、12346(结束snap_id),最后一行留空 - 执行:
sqlplus / as sysdba @${ORACLE_HOME}/rdbms/admin/awrrpt.sql /tmp/awr_report_$(date +%Y%m%d_%H%M).html 2>&1 - 注意:输出文件名必须带扩展名(如
.html),否则脚本会报错SP2-0734: unknown command beginning "html..."
如何精准锁定“关键时段”的 snap_id
手动查 snap_id 容易错,尤其当问题发生在凌晨或跨小时边界时。别靠肉眼数时间,用 SQL 直接定位:
SELECT snap_id, TO_CHAR(begin_interval_time, 'YYYY-MM-DD HH24:MI') begin_time
FROM dba_hist_snapshot
WHERE begin_interval_time >= TO_DATE('2026-10-27 02:30', 'YYYY-MM-DD HH24:MI')
AND begin_interval_time < TO_DATE('2026-10-27 03:00', 'YYYY-MM-DD HH24:MI')
ORDER BY snap_id;这个查询返回的是该时间段内所有快照 ID,通常会有 2–3 个(因默认 1 小时间隔,但实际采样可能每 30 分钟一次)。选最小和最大 snap_id 作为 begin_snap 和 end_snap 即可覆盖整个窗口。
- 如果想按负载峰值反向找时段,先查
DB Time最高的快照:SELECT snap_id, ROUND(db_time/1000000, 2) db_time_sec FROM dba_hist_sys_time_model WHERE stat_name = 'DB time' ORDER BY db_time DESC FETCH FIRST 3 ROWS ONLY -
dba_hist_snapshot中的end_interval_time才是快照“完成时间”,begin_interval_time是采样起点——报告区间应以begin_interval_time为准
避免被 statistics_level 和 license 卡住
脚本跑出来是空报告或报错 ORA-13783: No AWR data found for the specified range,大概率是这两个配置没开:
- 检查
statistics_level必须为TYPICAL或ALL:SHOW PARAMETER statistics_level;若为BASIC,AWR 根本不采集核心指标,再准的时间段也导不出有效数据 - 确认有
Diagnostic Pack授权:SELECT * FROM v$option WHERE parameter = 'Oracle Database Diagnostic Pack';返回TRUE才能用awrrpt.sql;否则只能查dba_hist_*视图手工拼,且无法生成标准报告 -
timed_statistics参数已随statistics_level=TYPICAL自动启用,无需单独设,但可验证:SELECT value FROM v$parameter WHERE name = 'timed_statistics'应为TRUE
导出后自动归档与清理的实操要点
生成的 HTML 报告体积大(单份常超 2MB),长期堆积会撑爆 $ORACLE_HOME 下的临时目录。不要等磁盘报警才处理:
- 加一行 shell 命令自动压缩:
gzip /tmp/awr_report_*.html - 保留最近 7 天的报告即可,用 find 清理:
find /tmp -name "awr_report_*.html.gz" -mtime +7 -delete - 别把报告写到
$ORACLE_HOME/rdbms/admin目录下——那里是只读的 Oracle 安装路径,写入失败概率高;统一用/tmp或独立挂载的/oradump
真正难的不是导出动作本身,而是确保每次生成的报告都落在业务真实抖动的那 5 分钟内——这要求你提前把应用侧的异常日志时间戳,对齐到数据库服务器的系统时间(注意 NTP 同步状态),而不是依赖“大概凌晨三点左右”。


















