AWR基线模板仅定义规则而非自动执行,需启用automatic baseline功能(12c+且STATISTICS_LEVEL≥TYPICAL、CONTROL_MANAGEMENT_PACK_ACCESS=DIAGNOSTIC+TUNING)才可能按repeat_interval定时生成基线。
什么是 AWR 基线模板,它真能自动按周/月生成?
不能。awr 基线模板(dbms_workload_repository.create_baseline_template)本身不“自动运行”,它只是定义一个未来某段时间内应创建基线的规则;实际基线是否生成,取决于你是否启用了 automatic baseline 功能,且该功能仅在 oracle 12c 及以后版本中支持,且默认关闭。
换句话说:模板只是“说明书”,不是“执行器”。你得手动触发一次模板注册,再确保数据库开启了自动基线捕获(通过 STATISTICS_LEVEL 和 CONTROL_MANAGEMENT_PACK_ACCESS 配置),它才可能在窗口到达时自动生成基线。
-
STATISTICS_LEVEL必须设为TYPICAL或ALL(BASIC会彻底禁用 AWR) -
CONTROL_MANAGEMENT_PACK_ACCESS必须为DIAGNOSTIC+TUNING(否则CREATE_BASELINE_TEMPLATE会报ORA-13516) - 模板生效时间以数据库服务器本地时区为准,不识别 NLS 或会话时区
怎么建一个每周一早 00:00 开始、持续 7 天的基线模板?
核心是调用 DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE,关键参数不是“周期”,而是 start_time、end_time 和 repeat_interval —— 后者必须用 Oracle Scheduler 的 repeat_interval 语法(类似 cron,但不完全等价)。
例如,要让模板每周一 00:00 触发一次、每次覆盖接下来 7 天:
BEGIN
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE_TEMPLATE(
template_name => 'WEEKLY_MON_START',
start_time => SYSTIMESTAMP,
end_time => SYSTIMESTAMP + INTERVAL '7' DAY,
baseline_name => 'WEEKLY_<start_day>',
template_type => 'REPEATING',
repeat_interval => 'FREQ=WEEKLY;BYDAY=MON;BYHOUR=0;BYMINUTE=0',
expiration => 52
);
END;</start_day>
-
template_type => 'REPEATING'才启用周期行为;'SINGLE'就只生成一次 -
baseline_name中的<start_day></start_day>会被自动替换为实际开始日期(如WEEKLY_20240401),这是唯一支持的占位符 -
expiration单位是“周”,不是天;设为52表示基线保留 52 周(约一年),过期后自动删除 - 如果
repeat_interval写成FREQ=DAILY却想覆盖 7 天,会导致每天建一个 7 天基线,严重重叠,别这么干
为什么基线没按模板时间生成?常见卡点在哪
最常被忽略的是:模板注册后,数据库不会“监听”系统时间然后主动干活。它依赖 AWR 快照的正常采集节奏和内部调度器轮询 —— 而这个轮询每小时最多检查一次是否该触发新基线。
- 如果快照间隔(
snapshot_interval)大于 60 分钟,可能错过触发窗口(比如设置为 90 分钟,周一 00:00 的触发可能拖到 01:30 才执行) - 数据库必须处于 OPEN 状态;如果周日凌晨维护停库,当次基线永久丢失,不会补建
- 模板的
start_time是“首次应用时间”,不是“第一次生效时间”——若设为过去时间(如上周一),Oracle 会静默跳过,不报错也不生成 - 查询
DBA_HIST_BASELINE_TEMPLATE看STATUS字段,ENABLED才有效;DISABLED表示模板存在但被禁用
月度基线模板要注意什么?
月度比周更麻烦,因为“每月第一天”在 Scheduler 里不能直接写 BYDAY=1(那是周内第 1 天,即周一)。正确写法是 BYMONTHDAY=1,且必须配合 FREQ=MONTHLY。
但要注意:Oracle 不支持“每月最后一个工作日”或“每月倒数第三天”这类动态逻辑。所有日期都得是绝对日历日。
- 以下写法合法:
FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=0;BYMINUTE=0 - 以下写法非法:
FREQ=MONTHLY;BYDAY=-1MON(Oracle Scheduler 不认这种语法) - 如果希望覆盖整月(1 日 00:00 到下月 1 日 00:00),
end_time应设为ADD_MONTHS(start_time, 1),而不是硬写+ INTERVAL '30' DAY - 跨年场景下(如 12 月模板),
BYMONTHDAY=31在 2 月会失效,但 Oracle 不报错,只是跳过当月——这点容易被监控遗漏
复杂点在于:模板本身不校验日期合理性,错误的 repeat_interval 会导致它静默失效,查 DBA_HIST_BASELINE 里有没有新增基线,比看模板状态更可靠。










