#健康检查

YashanDB提供健康检查框架,用于数据库运行诊断检查。

健康检查也称为检查器,检查数据库的各个组件,如检测文件损坏、数据块损坏、redo日志损坏等,并生成一份报告,记录发现的错误以及错误带来的影响。

可以通过如下两种方式运行健康检查:

  • 反应式:故障诊断架构自动运行健康检查以响应严重错误。
  • 手动:使用内置高级包手动运行健康检查。如有需要,可以通过定义JOB定期运行健康检查。

健康检查执行的结果将存储在自动诊断存储库中。 健康检查必须在数据库为OPEN模式或者MOUNT模式下运行。

# 健康检查项

数据库结构完整性检查

此检查验证数据库文件的完整性,在检查到数据库文件(控制文件、redo文件、数据文件、归档文件)不可访问、损坏或不一致时报告失败。

数据块完整性检查

此检查可检测磁盘映像块损坏,例如checksum失败、头尾不匹配以及块内的逻辑不一致。对于页面损坏,通常可以通过备库或者是页面修复工具来修复。

单个数据文件检查

此检查可检测数据文件可访问性,例如数据文件所有的块损坏,包含有效的块可未使用的块等。

redo完整性检查

此检查可检测数据库的一致性和所有的redo文件的头部信息,避免数据库重启后无法恢复到一致性点,数据库不可用。

单个redo文件检查

此检查可检测单个redo文件的可访问性和redo块损坏。

归档日志文件检查

此检查检测单个归档日志文件的可访问性和内容损坏。

死锁检测检查

此检查项检测用户行为上的事务死锁,在检测出死锁后会在trace目录下(按seesion id的trace文件)报告出具体的死锁环信息,即Wait-For-Graph(WFG)。

# 手动运行健康检查

用户可以手动调用DBMS_HM.RUN_CHECK程序运行健康检查,该程序需提供运行状况检查名称和运行的名称(自定义),如下所示:

BEGIN
   DBMS_HM.RUN_CHECK('DB Structure Integrity Check', 'my_run', NULL);
END;
/

若要获取运行状况检查名称的列表,请运行以下查询:

SELECT name FROM V$HM_CHECK;

输出的内容如下:

NAME                                                             
---------------------------------------------------------------- 
DB Structure Integrity Check                                    
Data Block Integrity Check                                      
Single Datafile Check                                           
Redo Integrity Check                                            
Redo File Check                                                 
Archived Log Check

大多数健康检查需要输入参数,可以通过视图 V$HM_CHECK_PARAM 查看参数名称和说明。有些参数是必须的,有些参数是可选的。可选参数输入NULL 则表示使用默认值。 以下查询显示所有健康检查的参数信息:

SELECT c.name check_name, p.name parameter_name, p.description
FROM V$HM_CHECK_PARAM p, V$HM_CHECK c
WHERE p.check_id = c.id ORDER BY c.name;

输出的内容如下:

CHECK_NAME                       PARAMETER_NAME         DESCRIPTION                 
-------------------------------- ---------------------- --------------------------- 
Archived Log Check               ARC_SEQ_NUM            Archive sequence number    
Data Block Integrity Check       BLC_BL_NUM             Block number               
Data Block Integrity Check       BLC_DF_NUM             Data file number           
Redo File Check                  RF_NUM                 Redo file number           
Single Datafile Check            DF_NUM                 Data file number

输入参数的名称和值在参数中传递是成对的,以分号;分隔。下面示例演示如何将文件ID和块ID作为参数传递数据块完整性检查:

BEGIN
  DBMS_HM.RUN_CHECK('Data Block Integrity Check','my_run','BLC_DF_NUM=1;BLC_BL_NUM=234');
END;
/

Note: 详细使用信息请参考开发手册DBMS_HM的定义及参数说明。 健康检查的数据存储的上限是1000000条记录,如果超过该上线,新的诊断数据将覆盖掉最旧的诊断数据。

# 查看健康检查报告

健康检查运行的结果和其他信息存储在自动诊断存储库中,但不会立即生成报告。 如果需要查看报告,用户可以通过执行DBMS_HM包生成,如果该报告尚不存在,系统首先从自动诊断存储库中的检查器运行数据生成,并以TEXT格式文件存储在自动诊断存储库主目录的HM子目录下,然后向用户输出显示。如果报告文件已存在,则系统仅执行输出显示。

DBMS_HM.GET_RUN_REPORT程序用于查看健康检查的报告,默认格式为文本。示例如下:

SELECT DBMS_HM.GET_RUN_REPORT('HM_RUN_13') FROM DUAL;

DBMS_HM.GET_RUN_REPO                                             
---------------------------------------------------------------- 
 Run Name                    : hm_run_13
 Run Id                      : 13
 Check Name                  : Data Block Integrity Check
 Mode                        : MANUAL
 status                      : COMPLETED
 Start Time                  : 2022-07-22 10:21:40
 End Time                    : 2022-07-22 10:21:40
 Error Encountered           : 0
 Source Incident Id          : 0
 Number of Incidents Created : 0

Input Parameters for the Run
 BLC_DF_NUM=6
 BLC_BL_NUM=132

Run Findings And Recommendations
 Finding
 Finding Name  : block corruption
 Finding ID    : 12
 Message       : block 132 in datafile 6: '/data/yashan/dbdata/dbfiles/hm_test' is corrupted
 Message       : object might be unavailable

Note: 详细使用信息请参考开发手册DBMS_HM的定义及参数说明。 如果报告信息太长,系统仅输出显示部分信息,完整信息需从报告文件中获得。

# 健康检查视图

用户可以直接查询创建报告的自动诊断存储库数据,查看运行特定的健康检查的结果,而不是通过健康检查报告。 此数据可以通过视图V$HM_RUN和视图V$HM_FINDING获得。 下面的示例查询视图V$HM_RUN以确定检查器运行的历史记录:

SELECT run_id, name, check_name, run_mode FROM V$HM_RUN;
	 
 RUN_ID NAME              CHECK_NAME                            RUN_MODE  
------- ----------------- ------------------------------------- --------- 
      1 hm_run_1          Single Datafile Check                 REACTIVE 
      2 hm_run_2          Single Datafile Check                 REACTIVE 
      3 hm_run_3          DB Structure Integrity Check          REACTIVE 
      4 hm_run_4          DB Structure Integrity Check          MANUAL   
      .             
      .             
      .             
     39 hm_run_39         Redo Integrity Check                  REACTIVE 
     40 hm_run_40         DB Structure Integrity Check          REACTIVE 
     41 hm_run_41         Data Block Integrity Check            MANUAL         
     42 hm_run_42         Single Datafile Check                 MANUAL   
     43 hm_run_43         DB Structure Integrity Check          REACTIVE 
     44 hm_run_44         Single Datafile Check                 REACTIVE   
     45 hm_run_45         Redo Integrity Check                  MANUAL   
     46 hm_run_46         Redo File Check                       MANUAL   
     47 hm_run_47         Archived Log Check                    MANUAL   
     48 hm_run_48         Redo File Check                       REACTIVE 

下面示例查询视图V$HM_FINDING,获取run_id=44(反应式单个数据文件检查)的结果详细信息:

SELECT finding_id, description FROM V$HM_FINDING WHERE run_id = 44;

  FINDING_ID DESCRIPTION                                                      
------------ ---------------------------------------------------------------- 
          16 block 1432 in datafile 6: '/data/yashan/dbdata/dbfiles/hm_test' is corrupted
          17 block 1549 in datafile 6: '/data/yashan/dbdata/dbfiles/hm_test' is corrupted