#健康检查
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