#巡检

巡检在YashanDB中为一个单独的后台线程,该线程类似于巡逻小队,不断地监控数据库的运行状况。当发生严重错误时,收集诊断数据存储在自动诊断存储库中,并且触发相应的修复手段或者限制损坏及中断。 巡检主要包含如下内容:

  • 监控数据库文件
  • 发生严重错误时触发健康检查
  • 监控同步备库(最大保护模式)

# 文件监控

YashanDB的后台文件都存储着重要的信息,部分文件丢失可能导致数据库无法正常使用。此外,用户不可以手动改动数据库的文件,如数据文件被改动可能造成各种影响,系统需要对此及时响应避免造成更大的损坏及中断,共享集群模式下该功能禁用。

文件监控的范围

控制文件、数据文件、redo文件,如果开启双写也将监控双写文件。

文件监控的异常操作

  • 文件元数据的变动:文件权限、文件用户及用户组以及时间戳等。
  • 文件被删除:文件直接被删除,例如:rm命令等。
  • 文件名被修改或者文件被移动:文件名称被修改或者修改文件的路径,例如:mv命令等。
  • 文件系统被卸载:文件所在的磁盘被卸载或者时磁盘损坏无法装载。

异常响应

检测到数据库文件存在异常时,触发事件警报,收集事件诊断数据,并且触发反应式健康检查,将诊断数据存储在自动诊断存储库中。

故障处理

出现数据文件、redo文件被删除或者被移动等操作时,系统将数据库的状态置为ABNORMAL,数据库处于只读状态,用户执行业务报错,等待DBA介入修复故障。

下面以数据文件hm_test丢失时,文件监控的诊断数据为例:

-- 事件警报,通过V$DIAG_INCIDENT查看,输出信息如下

SELECT incident_id, session_id, error_number, error_argument, error_comments FROM V$DIAG_INCIDENT;												  
 INCIDENT_ID   SESSION_ID ERROR_NUMBER ERROR_ARGUMENT    ERROR_COMMENTS                                                   
------------ ------------ ------------ ----------------- ---------------------------------------------------------------- 
          11           12          107 data file         [MONITOR] /data/yashan/dbdata/dbfiles/hm_test does not exist and may have been deleted
          12           12          108 data file         [MONITOR] /data/yashan/dbdata/dbfiles/hm_test was deleted
                   
-- 反应式健康检查,输出信息如下
SELECT run_id, name, check_name, run_mode FROM V$HM_RUN;				  
 RUN_ID NAME          CHECK_NAME                            RUN_MODE  
------- ------------- ------------------------------------- --------- 
     51 hm_run_51     DB Structure Integrity Check          REACTIVE 

SELECT finding_id, description FROM V$HM_FINDING WHERE run_id = 51;
  FINDING_ID DESCRIPTION                                                      
------------ ---------------------------------------------------------------- 
          21 datafile /data/yashan/dbdata/dbfiles/hm_test is missing

数据文件丢失,数据库状态变为ABNORMAL,用户无法执行业务。

SELECT status FROM V$DATABASE;
STATUS                            
--------------------------------- 
ABNORMAL    

-- 执行业务报错
CREATE TABLE student_no(ID INT);
YAS-06023 database is set to read-only because of database abnormal

-- 查询正常
SELECT * FROM DUAL;
DUMMY 
----- 
X    

Note: 数据库的状态变为ABNORMAL时,DBA需要及时处理,避免用户业务一直等待。

数据文件丢失,数据库有可能异常退出,需要DBA及时响应。

数据文件丢失,DBA可以考虑是否offline该文件或者对该文件所在表空间进行离线修复,消除故障状态以使用户继续执行业务,也可以使用其他的处理策略。 以 offline 该文件所在表空间为例进行修复:

-- 消除故障状态
ALTER DATABASE CONVERT TO NORMAL;

SELECT status FROM V$DATABASE;
STATUS                            
--------------------------------- 
NORMAL                           

-- offline 该文件所在表空间hm_test
ALTER TABLESPACE hm_test OFFLINE IMMEDIATE;

-- 用户继续执行业务
CREATE TABLE student_no(ID INT);

Note: 当出现ABNORMAL时,请及时查阅告警日志或者是事件视图V$DIAG_INCIDENT查看数据库ABNORMAL的诊断数据。

出现ABNORMAL时,需要先修复故障再消除故障,但是offline表空间数据DDL 操作,是不可以执行的,所以需要先消除故障状态,再进行offline 操作。

使用offline操作时,应采用IMMEDIATE选项,避免数据库出现异常退出的状况。

建议将数据库重启到mount阶段后,再执行offline数据文件操作,open阶段执行该操作存在风险,故障有可能会扩散。

# 健康检查——反应式

反应式健康检查主要是用来排查潜在的故障。当YashanDB运行过程中出现某些故障时,会触发相应的健康检查,尽早地检测出潜在的故障,及时处理避免造成损坏。

以读取页面失败为例:

-- 查询数据发现页面(block 132)损坏
SELECT * FROM HM_TEST;
YAS-02147 the block 6-0-132 is corrupted

-- 发现页面损坏,巡检线程会触发健康检查(Single Datafile Check)检查该页面所在的整个文件
-- 触发反应式健康检查,输出信息如下
SELECT run_id, name, check_name, run_mode, status FROM V$HM_RUN;
RUN_ID NAME        CHECK_NAME              RUN_MODE  STATUS        
------ ----------- ----------------------- --------- -----------
    61 hm_run_61   Single Datafile Check   REACTIVE  COMPLETED    
										 
-- 查看健康检查的具体诊断数据
SELECT DBMS_HM.GET_RUN_REPORT('HM_RUN_61') FROM DUAL;
DBMS_HM.GET_RUN_REPO                                             
---------------------------------------------------------------- 
 Run Name                    : hm_run_61
 Run Id                      : 61
 Check Name                  : Single Datafile Check
 Mode                        : REACTIVE
 status                      : COMPLETED
 Start Time                  : 2022-07-22 11:51:16
 End Time                    : 2022-07-22 11:51:16
 Error Encountered           : 0
 Source Incident Id          : 0
 Number of Incidents Created : 0

Input Parameters for the Run
 DF_NUM=6

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

从以上示例可以发现:当执行业务发现页面损坏时,会触发单个文件的健康检查,不仅检测到页面(block 132)损坏,还发现了潜在的页面(block 152)损坏。

# 监控同步备库(最大保护模式)

YashanDB的高可用架构支持三种保护模式,最大保护模式为其中一种,在最大保护模式下,同步备库与主库断连或者同步备库不可用时,主库用户的业务提交会卡住。

巡检线程检测到同步备库长时间不可用或者是断连状态时,会将数据库的状态设置为ABNORMAL,后续的业务将不再执行,如果正在提交或者是已经提交的业务会一直卡住,等待DBA介入修复故障。

处理该故障的推荐方案如下:

  • 查看故障备库是否可以重新启动或者修复,如果可以,请尽快启动或者修复。
  • 根据需要,可以考虑修改配置参数 QUORUM_SYNC_STANDBYS 和 REQUIRED_SYNC_STANDBYS。
  • 根据需要,可以考虑修改主库的保护模式。

出现该故障的处理流程:

1.执行业务报错,数据库状态为 ABNORMAL。

SELECT status FROM V$DATABASE;
STATUS                            
--------------------------------- 
ABNORMAL    

2.查阅视图V$DIAG_INCIDENT或告警日志。

SELECT incident_id, session_id, error_number, error_comments FROM V$DIAG_INCIDENT;

INCIDENT_ID   SESSION_ID ERROR_NUMBER ERROR_COMMENTS                                                   
----------- ------------ ------------ ---------------------------------------------------------------- 
         22           12          211 synchronization standby database destinations have failed, database is set to read-only

3.查看视图V$ARCHIVE_DEST_STATUS。

-- 存在一个断连备库
SELECT dest_id, connection, status, database_mode FROM V$ARCHIVE_DEST_STATUS;
DEST_ID CONNECTION        STATUS            DATABASE_MODE     
------- ----------------- ----------------- ----------------- 
      2 CONNECTED         NORMAL            OPEN             
      3 DISCONNECTED      UNKOWN            UNKOWN       

4.选取修复方案(以重新启动备库为例)。

SELECT dest_id, connection, status, database_mode FROM V$ARCHIVE_DEST_STATUS;
DEST_ID CONNECTION        STATUS            DATABASE_MODE     
------- ----------------- ----------------- ----------------- 
      2 CONNECTED         NORMAL            OPEN             
      3 CONNECTED         NORMAL            OPEN             

5.DBA 消除故障状态,提交卡住的用户业务提交成功,用户可以继续执行业务。

ALTER DATABASE CONVERT TO NORMAL;

SELECT status FROM V$DATABASE;
STATUS                            
--------------------------------- 
NORMAL    

Note

有关最大保护模式的详细信息请查阅高可用相关的文档。

同步备库信息可以查看配置参数 QUORUM_SYNC_STANDBYS 和 REQUIRED_SYNC_STANDBYS 获取更多的信息。

如果故障未修复,直接执行 ALTER DATABASE CONVERT TO NORMAL 消除故障状态的话,数据库会重新将数据库设置为ABNORMAL状态,再次记录告警日志和收集诊断数据。

有些故障修复之后数据库会自动消除ABNORMAL 状态。例如:

  • 归档空间不足,数据库状态被置为ABNORMAL,DBA 释放磁盘空间,数据库会自动消除ABNORMAL状态,用户可以继续执行业务。

  • 最大保护模式下,同步备库长时间异常,数据库状态被置为 ABNORMAL, DBA 重启同步备库或者是其他的修复方案,数据库检测到修复完成,会自动消除ABNORMAL 状态,无需手动消除,用户可以继续执行业务。