dbms_server_alert.set_threshold需严格匹配参数顺序、类型及值格式,metrics_id须用预定义常量,warning/critical值须为带单引号字符串,object_type不可省略,object_name区分大小写且不支持通配符;阈值生效前须启用对应指标(如'tablespace used space'),且statistics_level需为typical或all;临时表空间无百分比告警支持,需自定义sql+调度器实现;邮件告警依赖em配置与agent正常运行,且存在最高65分钟延迟。
dbms_server_alert.set_threshold 调用必须带全参数且类型严格匹配
直接执行 dbms_server_alert.set_threshold 却没告警,90% 是因为参数顺序错、类型错或值格式错。它不是“设个表空间名+百分比”就能跑的函数。
关键约束:
-
metrics_id必须用预定义常量,例如DBMS_SERVER_ALERT.TABLESPACE_UTILIZATION(不是字符串'TABLESPACE_UTILIZATION') -
warning_value和critical_value是 字符串类型,必须加单引号,如'85',写成85会静默失败 -
object_type必须显式传DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,不能省略或传NULL -
object_name是表空间名,区分大小写,比如'USERS',不能是数据文件路径或小写'users' - 不支持通配符 —— 想批量设所有表空间?得循环调用,
object_name填'%'或空值会报ORA-20000
阈值生效前必须先启用对应指标
即使 SET_THRESHOLD 执行成功,DBA_OUTSTANDING_ALERTS 仍为空,大概率是指标根本没启用。
永久表空间使用率告警依赖 'Tablespace Used Space' 这个指标(注意大小写和空格),它默认不激活:
- 先查是否已注册:
SELECT object_name, metric_name FROM dba_thresholds WHERE object_type = 'TABLESPACE';,结果为空说明指标未启用 - 必须手动启用:
BEGIN DBMS_SERVER_ALERT.ENABLE('Tablespace Used Space'); END; - 该指标仅在
STATISTICS_LEVEL = TYPICAL或ALL时可用;若为BASIC,需先改参数:ALTER SYSTEM SET statistics_level = TYPICAL;
临时表空间不能用 SET_THRESHOLD 设百分比阈值
对 TEMP 表空间调用 DBMS_SERVER_ALERT.SET_THRESHOLD 设置 TABLESPACE_PCT_FULL,不会报错但永远不触发 —— Oracle 内部根本不采集临时表空间的「已用百分比」指标。
验证方式:
-
SELECT metric_name FROM v$metricname WHERE metric_name LIKE '%Temp%';在 11gR2+ 中也查不到Temp Tablespace Space Usage -
SELECT * FROM dba_thresholds WHERE object_name = 'TEMP';永远返回空 - 替代方案只能自己查
v$temp_space_header:SELECT tablespace_name, ROUND(100 * used_bytes / (used_bytes + NVL(free_bytes, 0)), 2) AS "USE_RATE(%)" FROM v$temp_space_header WHERE tablespace_name = 'TEMP'; - 再用
DBMS_SCHEDULER定时执行该 SQL,配合UTL_MAIL.SEND发邮件
告警不发邮件?EM 配置和通知规则才是关键
Oracle 默认只把告警写进 DBA_OUTSTANDING_ALERTS,不会自动发邮件,更不会写入 alert.log。
要收到邮件,必须走 EM(Database Control)配置:
- 进入 EM → Setup → Notification Methods,填 SMTP 服务器、端口、认证信息
- 进入 Preferences → General,填管理员邮箱地址
- 进入 Setup → Notification Rules,确认 “Tablespace Space Usage” 类告警已勾选,并设置了触发级别(Warning/Critical)
- 如果 EM Agent 停了,或 Repository 数据库不可用,整个告警链就断了 —— 此时查
DBA_OUTSTANDING_ALERTS也会为空
真正容易被忽略的是:阈值判断本身依赖 DBA_HIST_TBSPC_SPACE_USAGE 每小时采样一次,而告警检查频率是每 5 分钟一次;这意味着从空间突破阈值到你看到告警,中间可能有最多 65 分钟延迟 —— 不是实时的。











