如何通过调整系统包来优化Oracle AWR报告自动生成的时间间隔及快照保留策略?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1168个文字,预计阅读时间需要5分钟。
请提供需要改写的伪原创开头内容,以便我为您进行简化改写。
如何用 DBMS_WORKLOAD_REPOSITORY 修改 AWR 快照保留时间
oracle 默认 awr 快照保留 8 天(即 7×24 小时),但很多生产环境需要更长(如 30 天)或更短(如审计要求 7 天内自动清理)。直接改数据字典会破坏 oracle 支持资格,必须走官方接口。
调用 DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS 是唯一安全方式。注意它不修改快照采集频率,只管“保留多久”和“多久采一次”——后者其实是另一个参数。
-
retention:单位是分钟,比如 30 天 →30*24*60 = 43200 -
interval:单位是分钟,比如每 30 分钟一个快照 →30(默认是 60) - 两个参数可单独设,也可一起设;未指定的保持原值
- 执行需
DBA权限,且实例必须处于 OPEN 状态
示例:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 43200, interval => 30);
为什么改了 interval 后快照没按新间隔生成
AWR 快照由后台进程 MMON 负责触发,但它依赖数据库内部定时器,不是“改完立刻生效”。常见失效场景有:
- 数据库刚启动后,
MMON需要等待第一个完整interval周期才开始新节奏(例如设了 30 分钟,但当前距离上一个快照只剩 12 分钟,则下一次仍等 18 分钟后) -
STATISTICS_LEVEL参数不是TYPICAL或ALL:此时 AWR 功能被禁用,改任何参数都无效 - 系统时间被大幅调整过(如 NTP 校时跳变 >5 分钟),
MMON可能进入保护性休眠,需手动触发一次快照恢复节奏
验证是否生效,别只看 DBA_HIST_SNAPSHOT 的时间差,用这个查最近 5 次快照实际间隔:
SELECT snap_id, end_interval_time, ROUND((end_interval_time - LAG(end_interval_time) OVER (ORDER BY snap_id)) * 24 * 60) AS minutes_since_last FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 5 ROWS ONLY;
自动生成 AWR 报告不能靠调度快照间隔,得另起炉灶
很多人误以为把 interval 设成 60 分钟,就能“每天自动生成一份 AWR 报告”,这是混淆了快照(snapshot)和报告(report)两个概念。快照是原始性能数据存档,报告是基于快照生成的分析文本。
- AWR 报告本身没有内置自动生成功能,必须调用
awrrpt_sql_script或 PL/SQL 包DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT生成 - 推荐用
DBMS_SCHEDULER创建作业,而非老式DBMS_JOB(已废弃) - 脚本中必须显式指定
l_dbid、l_inst_num、l_bid(begin snap id)、l_eid(end snap id),否则报ORA-13516 - 输出路径受
UTL_FILE_DIR或 Oracle Directory 对象限制,12c+ 强烈建议用 DIRECTORY(如DATA_PUMP_DIR)
关键点:自动报告的“时间范围”得自己算,比如“昨天 00:00 到 23:59”的快照 ID,不能硬编码。可用子查询动态获取:
SELECT MIN(snap_id) bid, MAX(snap_id) eid FROM dba_hist_snapshot WHERE end_interval_time >= TRUNC(SYSDATE-1) AND end_interval_time < TRUNC(SYSDATE);
容易被忽略的权限与目录配置细节
即使 PL/SQL 脚本语法全对,也会因权限或路径问题静默失败——日志里只写“completed”,但文件根本没生成。
- 执行用户必须有
SELECTonDBA_HIST_*视图,以及EXECUTEonDBMS_WORKLOAD_REPOSITORY - 如果用
UTL_FILE.FOPEN写文件,目录路径必须在UTL_FILE_DIR初始化参数中,且该参数在 12c+ 已弃用,仅兼容;新库必须建 DIRECTORY 并授READ,WRITE -
AWR_REPORT_TEXT返回的是CLOB,直接写文件需用DBMS_LOB拆分写入,否则超长内容截断 - 多实例 RAC 环境下,
inst_num必须指定具体实例号,不能传 0(除非明确要所有实例汇总报告)
最简验证法:先在 SQL*Plus 里手工跑一次带固定 snap_id 的报告生成,确认权限和路径通了,再套进调度作业。
本文共计1168个文字,预计阅读时间需要5分钟。
请提供需要改写的伪原创开头内容,以便我为您进行简化改写。
如何用 DBMS_WORKLOAD_REPOSITORY 修改 AWR 快照保留时间
oracle 默认 awr 快照保留 8 天(即 7×24 小时),但很多生产环境需要更长(如 30 天)或更短(如审计要求 7 天内自动清理)。直接改数据字典会破坏 oracle 支持资格,必须走官方接口。
调用 DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS 是唯一安全方式。注意它不修改快照采集频率,只管“保留多久”和“多久采一次”——后者其实是另一个参数。
-
retention:单位是分钟,比如 30 天 →30*24*60 = 43200 -
interval:单位是分钟,比如每 30 分钟一个快照 →30(默认是 60) - 两个参数可单独设,也可一起设;未指定的保持原值
- 执行需
DBA权限,且实例必须处于 OPEN 状态
示例:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 43200, interval => 30);
为什么改了 interval 后快照没按新间隔生成
AWR 快照由后台进程 MMON 负责触发,但它依赖数据库内部定时器,不是“改完立刻生效”。常见失效场景有:
- 数据库刚启动后,
MMON需要等待第一个完整interval周期才开始新节奏(例如设了 30 分钟,但当前距离上一个快照只剩 12 分钟,则下一次仍等 18 分钟后) -
STATISTICS_LEVEL参数不是TYPICAL或ALL:此时 AWR 功能被禁用,改任何参数都无效 - 系统时间被大幅调整过(如 NTP 校时跳变 >5 分钟),
MMON可能进入保护性休眠,需手动触发一次快照恢复节奏
验证是否生效,别只看 DBA_HIST_SNAPSHOT 的时间差,用这个查最近 5 次快照实际间隔:
SELECT snap_id, end_interval_time, ROUND((end_interval_time - LAG(end_interval_time) OVER (ORDER BY snap_id)) * 24 * 60) AS minutes_since_last FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 5 ROWS ONLY;
自动生成 AWR 报告不能靠调度快照间隔,得另起炉灶
很多人误以为把 interval 设成 60 分钟,就能“每天自动生成一份 AWR 报告”,这是混淆了快照(snapshot)和报告(report)两个概念。快照是原始性能数据存档,报告是基于快照生成的分析文本。
- AWR 报告本身没有内置自动生成功能,必须调用
awrrpt_sql_script或 PL/SQL 包DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT生成 - 推荐用
DBMS_SCHEDULER创建作业,而非老式DBMS_JOB(已废弃) - 脚本中必须显式指定
l_dbid、l_inst_num、l_bid(begin snap id)、l_eid(end snap id),否则报ORA-13516 - 输出路径受
UTL_FILE_DIR或 Oracle Directory 对象限制,12c+ 强烈建议用 DIRECTORY(如DATA_PUMP_DIR)
关键点:自动报告的“时间范围”得自己算,比如“昨天 00:00 到 23:59”的快照 ID,不能硬编码。可用子查询动态获取:
SELECT MIN(snap_id) bid, MAX(snap_id) eid FROM dba_hist_snapshot WHERE end_interval_time >= TRUNC(SYSDATE-1) AND end_interval_time < TRUNC(SYSDATE);
容易被忽略的权限与目录配置细节
即使 PL/SQL 脚本语法全对,也会因权限或路径问题静默失败——日志里只写“completed”,但文件根本没生成。
- 执行用户必须有
SELECTonDBA_HIST_*视图,以及EXECUTEonDBMS_WORKLOAD_REPOSITORY - 如果用
UTL_FILE.FOPEN写文件,目录路径必须在UTL_FILE_DIR初始化参数中,且该参数在 12c+ 已弃用,仅兼容;新库必须建 DIRECTORY 并授READ,WRITE -
AWR_REPORT_TEXT返回的是CLOB,直接写文件需用DBMS_LOB拆分写入,否则超长内容截断 - 多实例 RAC 环境下,
inst_num必须指定具体实例号,不能传 0(除非明确要所有实例汇总报告)
最简验证法:先在 SQL*Plus 里手工跑一次带固定 snap_id 的报告生成,确认权限和路径通了,再套进调度作业。

