禁用表空间告警需调用DBMS_SERVER_ALERT.SET_THRESHOLD将对应表空间的警告/严重阈值设为NULL并指定operator_do_not_check,而非删除视图;已有告警需等待自动清除或手动触发AWR快照促使其退出。
禁用表空间告警:不是删视图,而是关阈值
oracle 的 dba_outstanding_alerts 视图本身不能“禁用”,它只是只读结果集——是告警机制运行后的快照。真正触发写入该视图的,是后台进程 mmon 对预设阈值的持续比对。所以禁用告警,本质是停掉阈值监控,而不是清空或删除视图。
关键操作是调用 DBMS_SERVER_ALERT.SET_THRESHOLD,把对应度量(如表空间使用率)的警告/严重阈值设为 NULL:
EXEC DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => dbms_server_alert.tablespace_pct_full, warning_operator => dbms_server_alert.operator_do_not_check, warning_value => NULL, critical_operator => dbms_server_alert.operator_do_not_check, critical_value => NULL, observation_period => 1, consecutive_occurrences => 1, instance_name => NULL, object_type => dbms_server_alert.object_type_tablespace, object_name => 'USERS' );
- 必须指定
object_name(表空间名),否则影响全局所有表空间 -
warning_operator和critical_operator要设为dbms_server_alert.operator_do_not_check,仅设NULL值不生效 - 执行后立即生效,无需重启实例;但已有未清除的告警仍保留在
DBA_OUTSTANDING_ALERTS中,直到被自动清除或手动处理
清理 DBA\_OUTSTANDING\_ALERTS:不能 DELETE,只能等它“自愈”
你无法直接 DELETE FROM DBA_OUTSTANDING_ALERTS —— 这是个只读数据字典视图,底层依赖内部队列和状态机。强行尝试会报 ORA-01031: insufficient privileges 或直接拒绝。
它的清理逻辑由 Oracle 自动控制:
- 有状态告警(如表空间满):只有当实际使用率回落到阈值以下,并满足连续观测周期后,才会自动从
DBA_OUTSTANDING_ALERTS移出,转入DBA_ALERT_HISTORY - 无状态告警(如死锁、快照过旧):事件一过就消失,不进
DBA_OUTSTANDING_ALERTS,只留痕于历史视图 - 若空间已释放但告警卡住,常见原因是 MMON 进程异常或 AWR 快照间隔太长;可手动触发一次 AWR 快照:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT,再等 1–2 分钟观察
为什么不要用 UNLIMITED 配额来“绕开”告警
有人觉得:“我给用户配 QUOTA UNLIMITED ON USERS,空间就不会满了,自然没告警。”这是典型误判——告警触发依据是表空间整体使用率(USED_SPACE / TOTAL_SPACE),跟用户配额无关。即使所有用户都只配了 1MB,只要表空间文件被段填满到 85%,照样报警。
- UNLIMITED 配额反而掩盖真实容量风险,让 DBA 失去对空间增长趋势的感知
- 它不阻止系统对象(如
AUDSYS、SM/ADVISOR)在 SYSAUX 或 SYSTEM 表空间中疯长 - 生产环境应配合
DBA_TS_QUOTAS监控 + 定期清理策略,而非靠配额“堵漏”
查告警别只盯 DBA\_OUTSTANDING\_ALERTS,先看 DBA\_THRESHOLDS
如果发现某表空间明明才用 60%,却还在报 85% 警告,大概率是阈值被人为改过。直接查 DBA_THRESHOLDS 才能确认当前生效值:
SELECT metrics_name, warning_value, critical_value, object_name FROM dba_thresholds WHERE metrics_name = 'Tablespace Usage %';
常见陷阱:
- 不同表空间可设不同阈值,
OBJECT_NAME列为空时代表全局默认值,但会被具体表空间配置覆盖 - 修改阈值后,旧告警不会自动刷新;必须等下一次 MMON 检测周期(默认每分钟一次)才重新评估
- 某些云厂商 RDS(如华为云)封装了告警界面,其阈值可能独立于数据库内核设置,需同步检查平台层配置
告警机制背后是 AWR 数据 + MMON 状态机 + Enterprise Manager 或外部通知链路,任何一个环节断开都会导致“看得见告警、清不掉记录”。动手前,先分清是阈值问题、空间问题,还是通知链路问题——这三者处理方式完全不同。










