dbms_server_alert.set_threshold不生效主因是'tablespace used space'指标未启用,需先查dba_thresholds确认注册,再用enable启用;注意statistics_level必须为typical/all,temp表空间不支持该告警。

DBMS_SERVER_ALERT.SET_THRESHOLD 不生效,90% 的情况是因为指标根本没启用,而不是函数调用错了。
先确认 'Tablespace Used Space' 指标是否已注册
Oracle 不会默认监控表空间使用率,必须显式启用对应指标。执行以下查询:
SELECT object_name, metric_name FROM dba_thresholds WHERE object_type = 'TABLESPACE';
如果结果为空,说明指标未注册,后续所有 SET_THRESHOLD 都不会触发告警。此时需手动启用:
- 运行
BEGIN DBMS_SERVER_ALERT.ENABLE('Tablespace Used Space'); END;(注意大小写和空格,不能写成 'Tablesapce' 或 'tablespace used space') - 该指标仅在 Oracle 10gR2+ 且
STATISTICS_LEVEL = TYPICAL或ALL时可用;若当前为BASIC,先执行ALTER SYSTEM SET STATISTICS_LEVEL = TYPICAL SCOPE=BOTH; - 临时表空间(
TEMP)不支持TABLESPACE_UTILIZATION告警,Oracle 内部不采集其百分比指标,需改用自定义 SQL + DBMS_SCHEDULER
DBMS_SERVER_ALERT.SET_THRESHOLD 参数必须严格按顺序和类型传参
参数名(如 metrics_id)只是可读性辅助,真正起作用的是位置和类型。常见静默失败原因:
- 第一个参数必须是常量
DBMS_SERVER_ALERT.TABLESPACE_UTILIZATION,不是字符串'TABLESPACE_UTILIZATION' -
warning_value和critical_value是字符串类型,必须写成'85',不能写85或'85%' -
object_type必须显式指定为DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,不可省略或填'TABLESPACE' -
object_name是具体表空间名,区分大小写(如'USERS'),不支持通配符;填'%'或空字符串会静默失败
正确示例:
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;
告警触发后去哪查、怎么验证
告警不会写入 alert.log,也不会自动发邮件——它只生成记录到数据字典视图:
- 实时查是否触发:运行
SELECT * FROM DBA_OUTSTANDING_ALERTS WHERE object_type = 'TABLESPACE'; - 确认阈值已生效:查
SELECT * FROM DBA_THRESHOLDS WHERE object_type = 'TABLESPACE'; - 后台进程 MMON 每分钟轮询一次,所以告警延迟最多 60 秒;若长时间无记录,优先检查
STATISTICS_LEVEL和指标启用状态 - 已有告警不会自动消失,需等监控周期结束,或手动触发 AWR 快照:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
禁用告警不是删视图,而是重置或关闭指标
DBA_OUTSTANDING_ALERTS 是只读视图,删不掉也清不了——它只是 MMON 进程比对结果的快照。要停告警,只能:
- 对单个表空间取消阈值:再次调用
SET_THRESHOLD,把warning_value和critical_value设为NULL - 全局禁用指标:运行
BEGIN DBMS_SERVER_ALERT.DISABLE('Tablespace Used Space'); END; - 临时表空间无法设百分比阈值,这点容易被忽略——哪怕调用成功,也永远不触发











