DBMS_SERVER_ALERT.SET_THRESHOLD对表空间告警无效的主因是未启用'Tablespace Used Space'指标且需满足Oracle 10gR2+及STATISTICS_LEVEL=TYPICAL/ALL;须先用ENABLE启用指标,再正确调用SET_THRESHOLD指定TABLESPACE对象类型、字符串型阈值及具体表空间名,并通过DBA_OUTSTANDING_ALERTS验证告警是否触发。
DBMS_SERVER_ALERT.SET_THRESHOLD 对表空间使用率告警不起作用?
多数人配完 dbms_server_alert.set_threshold 发现:表空间快满了,但没收到任何告警。根本原因不是函数没执行,而是它只对「自动数据库诊断监视器(addm)监控的指标」生效,而表空间使用率默认不在其中——得先确认指标是否被启用。
-
SELECT object_name, metric_name FROM dba_thresholds WHERE object_type = 'TABLESPACE';查不到记录?说明指标未注册,SET_THRESHOLD就是白设 - 必须先用
DBMS_SERVER_ALERT.ENABLE启用'Tablespace Used Space'指标(注意大小写和空格) - 该指标只在 Oracle 10gR2 及以上、且数据库启用了
STATISTICS_LEVEL = TYPICAL或ALL时才可用
怎么用 DBMS_SERVER_ALERT.SET_THRESHOLD 配置表空间阈值?
参数顺序和类型容易错:第1个参数是指标名字符串,不是表空间名;第4/5个参数才是 warning/critical 百分比值(整数,不带%符号),且必须用 DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE 显式指定对象类型。
- 正确调用示例:
BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => DBMS_SERVER_ALERT.TABLESPACE_UTILIZATION, warning_operator => DBMS_SERVER_ALERT.OPERATOR_GE, warning_value => '85', critical_operator => DBMS_SERVER_ALERT.OPERATOR_GE, critical_value => '95', observation_period => 1, consecutive_occurrences => 1, instance_name => NULL, object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE, object_name => 'USERS' ); END; -
warning_value和critical_value是字符串类型,不是数字,必须加单引号 -
object_name填表空间名(区分大小写),不是数据文件路径 - 如果想对所有表空间统一设阈值,
object_name不能填'%'或留空——Oracle 不支持通配,得逐个调用
为什么 alert.log 里看不到表空间告警日志?
告警不会直接写进 alert.log,而是发给 Oracle Enterprise Manager(OEM)或通过 DBA_OUTSTANDING_ALERTS 视图暴露。很多人查 alert.log 找不到记录,就以为配置失败。
- 检查当前未清除的告警:
SELECT * FROM DBA_OUTSTANDING_ALERTS WHERE OBJECT_TYPE = 'TABLESPACE'; - 已清除的告警查
DBA_ALERT_HISTORY,但默认只保留最近 7 天 - 告警触发后,若数据库没配邮件网关(UTL_MAIL / SMTP),OEM 也没连上,那就真的“静默”了——不是没触发,是没出口
- 每 5 分钟由 MMON 进程扫描一次(不可调),所以从超阈值到出现在视图中,最多延迟 5 分钟
DBMS_SERVER_ALERT 和 OEM、Cloud Control 的关系
这个包只是底层接口,OEM 界面里看到的表空间告警策略,背后就是调的它。但反过来,单独用 PL/SQL 配置后,OEM 不会自动同步显示——两套元数据不互通。
- OEM 修改阈值会覆盖你用
SET_THRESHOLD设的值,反之亦然 - 如果用 OEM 禁用了某表空间的监控,即使你 PL/SQL 里设了阈值,也不会触发
- Oracle Cloud Control 13c+ 把告警逻辑移到了代理端,本地
DBA_OUTSTANDING_ALERTS可能为空,得去云控制台查
实际配完别只盯着函数是否报错,重点看 DBA_OUTSTANDING_ALERTS 是否有记录,再确认告警通道是否通。表空间告警链路长,中间断一环就静音。










