在 Oracle 数据库中, 挂起 (hang) 指某一个进程由于无法获得申请的资源而进入的等待状态, 这种等待状态只有在获得申请的资源后才能够解除, HM 实现对 hang 的管理, 包括了对于 hang 的监控, 分析, 记录和解决.
等待链是由阻塞进程和等待进程构成的, 而阻塞进程中会存在一个或多个根阻塞进程, 这个进程阻塞了所有的其他进程, 如果根阻塞进程正在忙于一些操作, 那么也许这种等待链的出现是正常的, 如果阻塞进程处于空闲状态, 那么也许这种等待链的出现就是不正常的, 而打破等待链的方法, 就是终止根阻塞进程. HM 能够主动发现数据库中存在的等待链, 并从对个角度对它们分析, 如果发现了真正影响数据块性能的 hang, 会根据具体的情况来决定是否要解决问题, 而且即使不能直接解决, 也会将相应的诊断信息记录下来并持续监控.
HM 的工作由七个阶段构成
阶段 1(搜集阶段): 在这个阶段, 每个实例的 dia0 进程会定期搜集 hang analyze 信息.
阶段 2(发现阶段): 在这个阶段, 每个实例的 dia0 进程会分析搜集到的 hang alalyze 信息, 找到出现 hang 的会话, 并发送给主节点的 dia0 进程.
阶段 3(绘制阶段): 在这个阶段, 主节点的 dia0 进程根据每个实例的 dia0 进程发送过来的信息, 绘制等待链.
阶段 4(分析阶段): 在这个阶段, 主节点 dia0 进程根据绘制的等待链, 分析是否的确出现了 hang.
阶段 5(验证阶段): 在这个阶段, 主节点 dia0 进程会再次执行阶段 1-4, 之后将阶段 4 的分析结果和这一次的分析结果进行对比, 验证是否真的发生了 hang.
阶段 6(定位阶段): 在这个阶段, 主节点 dia0 进程更加验证阶段的结果定位到等待链的根阻塞进程.
阶段 7(解决阶段): 在这个阶段, 主节点 dia0 进程根据参数_hang_resoluton_scope 的值判断 hang 是否能够被解决.
HM 的参数
_hang_detection_enabled: 该参数决定 HM 特性在数据库中是否被启用, 默认值为 true.
_hang_detection_interval: 该参数指定 HM 搜集 hang analyze 信息的时间间隔, 默认值为 32s.
_hang_verification_interval: 该参数指定 HM 验证 hang 的时间间隔, 默认值为 46s.
_hang_resolution_scope: 该参数指定 HM 解决 hang 时能够操作的范围, 默认值为 process, 允许的值如下:
off: 表示 HM 只会继续监控 hang, 而不会做任何操作去解决 hang.
process: 表示 HM 可以通过终止根阻塞进程的方式来解决 hang, 但是这里的根阻塞进程不能是数据库重要的后台进程, 因为这会导致实例 crash.
instance: 表示 HM 可以通过终止实例的方式来解决 hang.
DIA0 进程的跟踪日志文件
主跟踪文件(<sid>_DIA0_<pid>.trc): 这个日志文件会记录 dia0 进程工作的详细信息, 包括发现, 分析, 处理 hang 的过程.
历史跟踪文件(<sid>_DIA0_<pid>_n.trc): 由于 dia0 进程的跟踪日志文件会随着数据库的运行不断产生信息, 可能使这个日志文件变得很大, dia0 进程会定期将日志信息写到它的历史日志文件中, 历史日志文件的 n 为正整数, 会随着时间推移不断增加.
incident 日志文件: 如果 HM 通过终止进程方式来解决 hang, 会首先在 alert.log 中记录 ORA-32701 错误, 而由于 ADR 的存在, dia0 进程同时会产生一个 incident 日志文件记录本次问题的详细信息.
与 hang 相关的视图
V$HANG_INFO: 该视图包含了 HM 发现的 hang 的详细信息.
V$HANG_SESSION_INFO: 该视图包含了与 hang 相关的会话信息.
V$HANG_STATISTICS: 该视图包含了与 hang 相关的统计信息.
来源: http://www.bubuko.com/infodetail-2691540.html