某系统数据库节点2自动重启分析报告

故障现象

数据库oracle rac集群两节点中的第2个节点mcisdb2发生了操作系统自动重启的故障, 需要对故障进行分析,以预防问题再次发生。

系统环境:AIX 5.3 & ORACLE 10.2.0.5 RAC & hacmp

分析过程

确认OS自动重启是RAC驱逐机制引起

通过errpt和sysdumpdev –L以及kdb分析,RAC驱逐节点在前,操作系统生成dump和重启在后,因此,需要从oracle方面分析导致OS自动重启的原因。

检查节点1 ORACLE CRS alert日志

从上述信息可以看到:

  • 05:01:01,节点1报出了与节点2私网通讯心跳丢失达到50%的错误。由于网络心跳设置为30秒,因此50%心跳丢失就意味这从5点0分46秒开始出现的私网通讯心跳丢失的情况。
  •  05:01:15,由于已经超过了阀值30秒,仍然无法与节点2 htqddb2私网通讯。因此开始将节点2剔除节点。”[cssd(893176)]CRS-1607:CSSD evicting node htqddb2.”
  •  05:01:58,剔除节点2动作完成。

导致私网通讯异常的原因可能有两个:

  • 物理上通讯异常
  • 系统负载大,未及时响应

常见的原因是第二种。如果物理上通讯异常,则节点1和节点2均应报出到彼此的心跳丢失,通过继续检查节点2的日志即可确认。

检查节点2 ORACLE CRS alert日志

从上述信息可以看到:

  • 故障日即9月18日,节点2未报出到节点1有任何心跳丢失的日志,但节点1报出了与节点2私网心跳丢失的情况,因此可排除网络问题。
  • 但是在故障前些天,即9月11日和9月17日都分别报出了节点2到节点1心跳丢失50%的情况,即私网心跳丢失了15秒。只不过这两天里,没有达到30秒的阀值就自动恢复了正常(缓过来了),因此这两天并未出现自动重启的故障。
  • 9月11日和9月17日里节点2报到节点1心跳丢失,但节点1并未报到节点2心跳丢失
  • 总结节点1和节点2私网心跳丢失的时间,不难发现都是在5点左右出现的。

确定分析方向:

  • 如果是因为物理通讯异常导致私网心跳丢失,则应该会同时出现节点1和节点2互报私网心跳丢失的情况,但这里都是单边报;另外,网络团队反馈的结果表明,问题时段网络设备并无报错,因此可排除网络物理通讯异常导致的心跳丢失.
  • 结合心跳丢失都是5点后出现,并且9月11日和17日只丢失15秒,9月18日丢失30秒的现象,这是典型的系统性能引起的RAC驱逐节点的现象。

通过OSWatcher获得平日5点左右时段的系统负载情况

以9月21日为例(其他日期类似),5点左右节点2,CPU运行队列突然出现了高达147的运行队列,系统idle只有9%,在不到1分钟的时间里,负载又自动恢复正常。这个现象说明,该时段可能有大的任务在运行。9月11日与9月17日类似。

 

通过该时间CPU运行队列高的原因

发出下列查询,可以看到,在故障时段9月18日5点0分45秒左右,数据库中活动的进程数超过了100个,几乎都在执行一个SQL_Id为9jbv997r1pbkd的语句,该语句是从htqdap1发起的一个按省统计签约用户的报表语句,由于索引并行度为DEFAULT,引起一个SQL语句吊起了大量并行进程,导致系统负载很大。分析过程如下

  • 问题时段前后的活动进程趋势分析

  • 问题时段SQL语句分布情况

  • 具体的SQL语句如下所示

  • 查找发起这个SQL的机器

  • 该语句的执行计划如下

可以看到,虽然SQL语句并未采用并行,但是执行计划采用了并行,因此短时间内,系统出现大量进行进程,CPU运行队列高,导致系统负载突然加大。

  • 为何出现如此多的活动进程

可以看到,因为表上的索引PK_T_HTQD_CUSTCHECK的并行度设置为DEFAULT,因此虽然SQL语句并未采用并行,但是该设置会导致执行计划采用了并行,继而导致段时间内系统负载突然增大

  • 找到程序发起的源头

进一步检查该程序的发起方,可以看到,这是由HTQDAP1上通过crontab每天凌晨5点发起的一个统计报表作业导致。

HTQD用户下其他并发度不为1的表和索引

 

可以看到,系统还存在其他并发度不为1的表和索引,当并行度为DEFAULT时,及时应用的SQL语句不指定并行度,ORACLE依然会自动选择使用并行,可能导致系统负载突然加大导致短时间内系统部分进程无法获得CPU的情况。

建议应用确认并修改这些并行度,当需要使用并行时,手工指定并行度。

故障分析总结和建议

  • 建议应用对2.5章节的表和索引的并行度进行确认,并修改并行度为1.当需要使用并行时,在SQL中使用hint来指定并行度而不是交给ORACLE控制
  • 增加CPU,提高系统应对瞬间高负载的能力。该工作目前已完成。
  • 修改数据库参数parallel_max_servers为40,限制并行的最大进程数。
  • 增加对CRS alert日志的监控,添加监控关键字heartbeat evicting Reconfiguration
    日志位置 $ORA_CRS_HOME/log/hostname/alerthostname.log

未经允许不得转载:Oracle一体机用户组 » 某系统数据库节点2自动重启分析报告

相关推荐