一则Bug导致数据库All Database Sessions Hang

春节前夕,一套核心交易系统出现短时间夯死的状况出现(后台数据库版本信息:Oracle 11.2.0.4 RAC 2节点,Linux X86服务器),活动会话数又飙升至近300+

20200127-1如上图所示,数据库从1月19日 09:34分左右开始,活动会话逐渐攀升,数据库在当时存在大量等待事件log file switch (checkpoint not complete),排查了硬件IO链路、应用事务量均正常,还是要在数据库软件层面进行分析。

    可以看到当时数据库活动会话概览,这些在等待log file switch (checkpoint incomplete)的会话均被节点2的1369会话所阻塞。

20200127-2

那么2节点的1369会话这时在干些什么?从ASH中看到,1369会话(LGWR)正在读取控制文件,等待事件为control file sequential read,但是这个动作是很快的动作,理论上不应该造成长时间的阻塞。

20200127-3

当时的DIAG进程做的HANGANALYZE中我们可以看到如下的Chain关系,开始试图找寻是否是Bug引起,因为种种客观现象实在是有悖常理,无法从原理上解释

20200127-4

从Oracle Mos上找寻相关Bug描述,果然有一个刚刚发布不久的Bug:

Bug 29635990 – All Database Sessions Hang Due To Checkpoint Incomplete (Doc ID
29635990.8)
20200127-5

但是这个Bug并未标注影响版本范围,但是和本次故障现象基本一致,遗憾的是并没有相关的Workrond并且此Bug只能在12.2版本中有相关Patch进行修复。

为了规避此问题的再次爆发,我们在数据库中设置了一个Job进行规避,调度时间按照redo 所有group#均变为ACTIVE且准备进行覆盖的时间周期,本系统为5分钟。

declare
jobno number;
begin dbms_job.submit(
jobno,
'begin
 execute immediate ''alter system checkpoint'';
end;',
sysdate,
'sysdate + 5/1440');
commit;
end;
/

每5分钟进行强制全量检查点,避免数据库再次产生log file switch (checkpoint not complete)的现象,从而导致产生更大数据库夯死风险。