Oracle 11g在诊断和可恢复性方面做了大量增强,其中Health Monitor(健康监控,简称HM)是一个容易被忽视但非常实用的功能。它内置了多种检查器(Checker),能够对数据库的块完整性、重做日志、回滚段、数据字典等进行自动化体检,检查结果会被记录到ADR(Automatic Diagnostic Repository)中,方便后续生成报告和配合恢复操作。对于没有购买额外监控产品的团队来说,这是一套开箱即用的自诊断工具。

一、Health Monitor是什么,能检查什么
Health Monitor本质上是一个运行在数据库内部的检查框架,它由一系列预定义的检查器组成。每个检查器负责一个特定领域的健康检查任务,比如检查数据文件中的坏块、验证redo日志链的完整性、确认undo回滚段的状态是否健康等。这些检查器可以由DBA手动触发,也可以由数据库在某些故障场景下自动触发,例如实例崩溃后的自动诊断。
常见的内置检查器包括以下几种,可以通过查询v$hm_check视图获取完整清单:
-- 查看所有可用的检查器及其描述 SELECT name, description FROM v$hm_check ORDER BY name;
典型的检查器有:DB Structure Integrity Check(数据库结构完整性检查,校验控制文件、数据文件、日志文件的基本可达性)、Data Block Integrity Check(数据块完整性检查,针对特定数据文件的坏块检测)、Redo Integrity Check(重做日志完整性检查)、Undo Segment Integrity Check(undo段完整性检查)、Dictionary Integrity Check(数据字典一致性检查)、CF Block Integrity Check(控制文件块检查)等。其中大部分检查支持在线执行,个别深度检查(如某些块级校验)需要在脱机状态下进行,这一点在v$hm_check视图中通过OFFLINE_CAPABLE列可以区分。
二、如何执行健康检查:两种常用方式
第一种也是最推荐的方式是通过DBMS_HM包手动运行。执行一次检查称为一次run,每次run会生成一条运行记录,检查产生的详细结果保存在ADR中。下面的例子演示了对整个数据库做一次结构完整性检查,并对指定数据文件做坏块检查:
-- 1. 对数据库做结构完整性检查
BEGIN
DBMS_HM.RUN_CHECK(
check_name => 'DB Structure Integrity Check',
run_name => 'hm_db_struct_run');
END;
/
-- 2. 对特定数据文件做数据块完整性检查
BEGIN
DBMS_HM.RUN_CHECK(
check_name => 'Data Block Integrity Check',
run_name => 'hm_block_run',
input_params => 'BLC_DF_NUM=4'); -- 检查4号数据文件
END;
/
input_params参数用于给检查器传递输入,比如指定文件号、表空间名等,不同检查器支持的参数不同,可以查询v$hm_check_param视图查看每个检查器接受的参数名和默认值。第二种方式是借助Data Recovery Advisor自动关联,当数据库检测到坏块等故障时,Health Monitor会被自动调用执行相应检查,之后可以通过DBMS_HM与恢复顾问配合给出修复建议。
检查的执行状态和结果可以通过一组动态视图跟踪,最常用的是v$hm_run,它记录了每次运行的名称、检查器、开始结束时间以及查找出的故障数量:
-- 查看历史运行记录
SELECT run_id, name, check_name, status,
error_number, src_incident
FROM v$hm_run
ORDER BY run_id;
-- 查看某次运行发现的具体问题
SELECT * FROM v$hm_finding
WHERE run_id = (SELECT MAX(run_id) FROM v$hm_run);
三、生成和查看健康检查报告
检查执行完毕后,原始结果以XML形式存放在ADR目录中,直接阅读并不友好。Oracle提供了DBMS_HM.GET_RUN_REPORT函数,可以把某次运行的结果转换成可读文本,直接在SQL*Plus中输出:
-- 以文本形式查看报告
SET LONG 100000 LONGCHUNKSIZE 100000
SELECT DBMS_HM.GET_RUN_REPORT('hm_block_run') AS report
FROM dual;
如果需要HTML或XML格式的报告,可以使用adrci工具。adrci是Oracle 11g引入的命令行诊断工具,进入adrci后通过show hm_run列出所有健康检查记录,再针对某个run id执行show report命令即可:
$ adrci adrci> show hm_run adrci> show report hm_run hm_block_run
报告中会列出检查的输入参数、检查范围内的对象数量、发现的每个finding及其严重级别、对应的incident事件编号等信息。finding中的INCIDENT_ID尤其重要,它可以与ADR中的事件信息关联,配合Data Recovery Advisor进一步分析故障原因和修复方案。
四、实战场景与注意事项
Health Monitor在实际运维中最典型的应用场景是坏块排查。当应用报出ORA-01578(Oracle数据块损坏)错误时,传统做法是用DBVERIFY工具对整个数据文件做校验,文件大的话耗时非常久。而使用Data Block Integrity Check并配合input_params指定文件号甚至块号范围,可以显著缩小检查范围,加快定位速度。发现坏块后,再结合RMAN的BLOCKRECOVER命令或Data Recovery Advisor的修复建议完成恢复。
使用时有几点需要注意。首先,深度块检查可能需要脱机执行,如果尝试在线运行不支持的模式,DBMS_HM会直接报错,此时应检查v$hm_check中该检查器的OFFLINE_CAPABLE属性。其次,检查记录会持续累积在ADR中,占用诊断目录空间,可以通过adrci的purge命令定期清理过期数据。最后,Health Monitor是诊断工具而非实时监控工具,它适合在故障发生后做针对性体检,不能替代基于AWR、ASH的性能监控体系,两者定位不同,搭配使用才能覆盖完整的数据库健康面。
Oracle 11gHealth Monitor健康监控修改时间:2026-09-06 00:10:46