如何通过调整系统包来优化Oracle AWR报告自动生成的时间间隔及快照保留策略?

2026-04-30 13:492阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1168个文字,预计阅读时间需要5分钟。

如何通过调整系统包来优化Oracle AWR报告自动生成的时间间隔及快照保留策略?

请提供需要改写的伪原创开头内容,以便我为您进行简化改写。

如何用 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 参数不是 TYPICALALL:此时 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_dbidl_inst_numl_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”,但文件根本没生成。

  • 执行用户必须有 SELECT on DBA_HIST_* 视图,以及 EXECUTE on DBMS_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 的报告生成,确认权限和路径通了,再套进调度作业。

标签:Oracle

本文共计1168个文字,预计阅读时间需要5分钟。

如何通过调整系统包来优化Oracle AWR报告自动生成的时间间隔及快照保留策略?

请提供需要改写的伪原创开头内容,以便我为您进行简化改写。

如何用 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 参数不是 TYPICALALL:此时 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_dbidl_inst_numl_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”,但文件根本没生成。

  • 执行用户必须有 SELECT on DBA_HIST_* 视图,以及 EXECUTE on DBMS_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 的报告生成,确认权限和路径通了,再套进调度作业。

标签:Oracle