#故障诊断概念
为便于诊断和解决问题,YashanDB引入了三个概念:故障、问题和事件。
# 故障
故障是YashanDB运行过程中可能出现的一些严重错误,由数据库内部定义。可以通过视图V$DIAG_FAULT查看相关故障的信息。
YashanDB检测到异常故障时,防止扩散影响,会将数据库的状态置为ABNORMAL,数据库处于故障只读状态,允许查询但不能执行写的业务。
当数据库为ABNORMAL状态时,可以查看V$DIAG_INCIDENT视图或告警日志明确故障原因。
-- 故障发生时,数据库状态为ABNORMAL
SELECT STATUS FROM V$DATABASE;
STATUS
---------------------------------
ABNORMAL
1 row fetched.
-- 故障修复后,执行如下语句消除ABNORMAL状态
ALTER DATABASE CONVERT TO NORMAL;
SELECT STATUS FROM V$DATABASE;
STATUS
---------------------------------
NORMAL
下表列示数据库状态被置为ABNORMAL的常见故障及修复建议。
| 故障类型 | 说明 | 修复建议 |
|---|---|---|
| 归档日志磁盘空间不足 | 归档空间不足会导致业务卡住,设置为ABNORMAL,避免大量业务连接再进来,等待DBA释放空间 | 故障修复后,手动消除状态或等数据库检测到修复后会自动清除 * 增加磁盘空间或释放空间 *归档清理,删除无用的归档,参考归档管理 |
| 最大保护模式,同步备库异常 | 最大保护模式下,同步备库长时间异常会导致主库的业务提交会卡住 | 故障修复后,手动修复或等数据库检测到修复后会清除故障 * 排查原因,修复同步备 * 修改同步备配置 * 调整保护模式 |
| 数据文件或redo文件被手动操作,(例如,rm或mv等) | 数据文件被异常操作,可能会导致数据库不可用 | 需先修复故障,再手动消除异常状态 |
| 数据库发生Fatal错误 | 数据库可能因为资源、IO等原因出现故障,导致数据库无法运行,具体的错误原因查看V$DIAG_INCIDENT视图或运行日志明确故障原因。 | 该故障状态不可消除,数据库已经不能再继续运行了,只能shutdown abort,修复故障后重启数据库 |
Note:
通常,大部分故障在未修复时直接消除ABNORMAL状态,数据库检测到故障仍存在会重新置为ABNORMAL状态,重新上报事件,例如:归档磁盘空间不足、最大保护模式下同步备异常等。但对于数据文件被手动操作故障,手动消除ABNORMAL状态后不会再重新置为ABNORMAL,请确保故障已修复后再执行状态消除操作。
# 问题
问题是数据库运行过程中真实发生的故障,相同的故障可能会记录多个问题,相同故障的问题是通过问题键值进行区分的。可以通过视图V$DIAG_PROBLEM查看数据库运行过程中出现的问题。
# 事件
事件是单次出现的问题,数据库运行过程中,不同的会话在不同的时间可能产生相同的问题,数据库会创建多个事件,每个事件都有唯一标识的ID用于区分,也会记录当前会话的ID。可以通过视图V$DIAG_INCIDENT查看数据库运行过程中出现的严重错误,获取更多的诊断数据,例如创建时间、会话ID、故障详细描述等。
-- 该视图里定义当前YashanDB的所有故障信息
SELECT TYPE,code,description FROM V$DIAG_FAULT;
TYPE CODE DESCRIPTION
--------- ------------ ----------------------------------------------------------------
YASF 101 cannot allocate memory
YASF 102 too many open files
YASF 103 no space left on device
YASF 104 failed to open file
YASF 105 failed to create file
YASF 106 failed to write file
YASF 107 file metadata changed, for example, permissions, timestamps, extended attributes, and user/group ID, etc
YASF 108 file is missing
YASF 109 file is moved
YASF 110 file system is unmounted
YASF 111 failed to read file
YASF 112 failed to extend file
YASF 201 the data file is corrupted
YASF 202 the redo log file is corrupted
YASF 203 the ctrl files are corrupted
YASF 204 data block versions are mismatching
YASF 205 the database is aborted
YASF 206 the database needs to be repaired
YASF 207 deadlock detected
YASF 208 inconsistent database startup
YASF 209 watcher has an exception
YASF 210 the user limit on the total number of watches was reached
YASF 211 synchronization standby database destinations have failed
当问题(严重错误)多次发生时,系统将为每次问题创建一个事件。 这些事件将在加上时间戳后,存储在自动诊断存储库中。每个事件都由事件ID标识,该ID在自动诊断存储库中是唯一的。
发生一个事件时,数据库将执行如下操作:
- 收集首次失败的诊断数据。
- 使用事件ID标记事件。
- 将事件dump到为该事件创建的自动诊断存储库子目录中。
# 事件防洪
一个问题可能会在短时间内产生数十个或数百个事件,这将导致系统中生成过多的诊断数据,占用 自动诊断存储库中的太多空间,并可能减慢诊断和解决问题的速度。由于这些原因,故障诊断机制将在达到洪水阈值后控制事件的生成。
受到洪水控制的事件只记录告警日志,不再dump事件。洪水控制事件提供了一种通知用户正在发生严重错误的方法,但不会存在诊断数据过载的现象。
事件洪水控制的阈值水平是预先确定的,无法更改。它们定义如下:
- 在一小时内同一问题发生5个事件后,此问题的后续事件将受到洪水控制。该问题的事件的正常(非洪水控制)记录将在下一个小时再次开始。
- 在一天内同一问题发生25个事件后,此问题的后续事件将受到洪水控制。该问题的事件的正常记录将在第二天再次开始。
- 在一小时内发生同一问题的50个事件,或者在一天内发生同一问题的250个事件后,此问题的后续事件永远不再记录到自动诊断存储库中。该情况下,数据库将向告警日志中写入一条消息,指示不会再记录其他事件。
Note:
事件洪水控制后不会再记录事件,但会记录事件的防洪累计次数。
DBA应时常排查是否有新的事件产生,及时定位解决问题。
事件和问题诊断数据的存储上限为1000000条,如果个数超过该上限,新的诊断数据会覆盖旧的诊断数据。

