Oracle 19c FRA使用率过高触发邮件通知的实现问题求助
Oracle 19c标准版FRA使用率告警邮件通知实现方案
下面提供两种可直接落地的实现方式,均适配标准版功能限制,无需额外付费选件:
方案1:最小改动适配原有逻辑
你原有方案不生效的核心原因是存储过程的异常没有正确传递到DBMS_SCHEDULER层面,调度器默认仅当接收到RAISE_APPLICATION_ERROR抛出的-20000~-20999区间的未捕获自定义错误时,才会判定作业运行失败。
修正步骤:
- 调整存储过程逻辑,不要在最外层捕获阈值超限的自定义异常,直接向外抛出:
CREATE OR REPLACE PROCEDURE check_fra_usage(p_threshold NUMBER DEFAULT 80) AS v_used_percent NUMBER; BEGIN -- 取FRA总使用率 SELECT ROUND(USED_PERCENT,2) INTO v_used_percent FROM V$FLASH_RECOVERY_AREA_USAGE WHERE FILE_TYPE = 'TOTAL'; IF v_used_percent >= p_threshold THEN -- 抛出标准自定义错误,无外层捕获直接传递给调度器 RAISE_APPLICATION_ERROR(-20001, 'FRA超限:当前'||v_used_percent||'%,阈值'||p_threshold||'%'); END IF; END; /
- 创建调度作业时
job_type指定为STORED_PROCEDURE,不要将存储过程套在匿名PL/SQL块中调用,避免异常被吞。 - 配置
DBMS_SCHEDULER.add_job_email_notification触发条件为job_failed即可正常触发告警邮件。
方案2:更稳定的直接发邮件方案(推荐)
无需依赖作业失败状态触发,直接在存储过程中判断阈值后调用UTL_MAIL发邮件,逻辑更直观,故障率更低。
前置配置:
- 授予作业执行用户UTL_MAIL权限:
GRANT EXECUTE ON UTL_MAIL TO <作业执行用户名>; - 配置数据库SMTP参数:
ALTER SYSTEM SET smtp_out_server = '<SMTP服务器地址:端口>' SCOPE=BOTH;
存储过程示例:
CREATE OR REPLACE PROCEDURE check_fra_send_alert( p_threshold NUMBER DEFAULT 80, p_receiver VARCHAR2 -- 告警接收人邮箱,多个用逗号分隔 ) AS v_used_percent NUMBER; v_subject VARCHAR2(200); v_content VARCHAR2(1000); BEGIN SELECT ROUND(USED_PERCENT,2) INTO v_used_percent FROM V$FLASH_RECOVERY_AREA_USAGE WHERE FILE_TYPE = 'TOTAL'; IF v_used_percent >= p_threshold THEN v_subject := '【告警】Oracle FRA使用率超出阈值'; v_content := '实例名:'||SYS_CONTEXT('USERENV','INSTANCE_NAME')||CHR(10)|| '当前使用率:'||v_used_percent||'%'||CHR(10)|| '配置阈值:'||p_threshold||'%'||CHR(10)|| '请及时清理归档/备份文件或扩容FRA空间。'; -- 直接发送告警邮件 UTL_MAIL.SEND( sender => '<发件人邮箱地址>', recipients => p_receiver, subject => v_subject, message => v_content ); END IF; END; /
调度配置:
创建DBMS_SCHEDULER定时作业直接调用上述存储过程即可,支持自定义检测频率(推荐每小时检测一次,比每日检测时效性更高),无需额外配置作业失败通知规则。
补充注意点
- 若SMTP服务器需要SSL/TLS加密,可替换UTL_MAIL为UTL_SMTP自定义发信逻辑适配加密要求
- 可在存储过程中增加告警去重逻辑,比如同一阈值的告警24小时内仅发送一次,避免短时间内重复发信骚扰
- 所有用到的功能均为Oracle 19c标准版原生支持,无需额外购买企业版选件
内容的提问来源于stack exchange,提问作者bluefox
相关产品推荐
相关产品推荐

