AWR基线不支持直接设置性能预警阈值,仅作为历史对比基准;真正实现阈值告警的是服务器生成告警或EM指标配置,基线仅在报告中提供参照。

AWR基线本身不支持直接设置性能预警阈值——它只是一组用于对比的快照,不是告警触发器。 真正做阈值预警的是Oracle的“服务器生成的告警”(Server-Generated Alerts)或EM中的指标阈值配置,AWR基线只是为这些告警提供历史参照基准。混淆这两者,是DBA踩坑最频繁的地方。
为什么不能在DBMS_WORKLOAD_REPOSITORY里设阈值
AWR基线通过DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE创建,仅保存snap_id范围、名称和类型(如STATIC或MOVING_WINDOW)。它不包含任何阈值逻辑,也不参与实时监控。系统不会因为某次快照偏离基线就自动发邮件或写alert.log。
-
CREATE_BASELINE参数只有baseline_name、start_snap_id、end_snap_id、expiration,没有threshold或alert_on_deviation这类字段 - 基线数据存于
WRM$_BASELINE视图,该表无threshold_value列 - 试图用基线“自动触发告警”,本质是把诊断工具当监控工具用,方向错了
真正起作用的阈值配置在V$METRIC和Enterprise Manager里
Oracle 11g的阈值预警依赖两层机制:底层是动态指标采集(V$SYSMETRIC、V$SESSMETRIC),上层是EM或DBMS_SERVER_ALERT的规则绑定。AWR基线只在你手动运行awrrpt.sql或ADDM时,作为报告中的“对比参考线”出现。
- 关键指标如
SQL Service Response Time、Database Time Per Sec的阈值,在EM中路径为:Database Home → Related Links → Server → Metric and Policy Settings - 命令行可查当前启用的阈值:
SELECT metric_name, warning_value, critical_value FROM dba_thresholds WHERE object_type = 'DATABASE' - 若用脚本替代EM,需调用
DBMS_SERVER_ALERT.SET_THRESHOLD,传入metric_name(如'Database Time Per Sec')和具体数值,与基线无关
如何让基线“间接支撑”预警判断
虽然基线不发告警,但你可以用它生成可量化的偏离度,再结合外部脚本做人工预警。例如:对比当前1小时DB Time与同时间段基线均值,偏差超200%时触发通知。
- 先从基线获取参考值:
SELECT AVG(db_time_per_sec) FROM dba_hist_sysmetric_summary WHERE baseline_id = (SELECT baseline_id FROM dba_hist_baseline WHERE baseline_name = 'PEAK_HOURS') - 再查实时值:
SELECT value FROM v$sysmetric WHERE metric_name = 'Database Time Per Sec' AND intsize_csec > 3000(5秒以上采样) - 注意
dba_hist_sysmetric_summary中基线数据默认只保留8天,超出则查不到——baseline.expiration必须设长,否则对比失效
基线真正的价值不在“实时拦停”,而在“归因定责”:当告警响起,你能立刻回答“这次慢,是比上周三同一时段慢了3倍,还是比过去四周平均慢了1.2倍”。没基线,所有告警都是孤点;有基线,才是有上下文的判断。别指望它替你点鼠标发邮件,但它能让你一眼看懂那封邮件到底意味着什么。



















