一次DB Time过高告警处理

一、背景

        某个数据库在20200312 14:00:28-15:00:18期间,监控系统发出DBTime超出阈值告警,信息如下:

一次DB Time过高告警处理

二、问题分析

1、获取期间AWR报告,进行分析

1.1、查看Elapsed、DB Time指标

        通过AWR可以看到,服务器规格是4CPU16G,Elapsed*CPUs=239.36min远远小于DB Time(22,862.47min),反应awr统计的时间段数据库很繁忙。

一次DB Time过高告警处理

1.2、查看Load Profile

        从下图看到,DBtime中DB cpu所占比例其实并不大,DBTime大部分是在DB Wait Time上,从Top 10 Foreground Events by Total Wait Time可以看到主要是在cursor: pin S wait on X等待上。

一次DB Time过高告警处理

1.3、查看Top 10 Foreground Events by Total Wait Time

        从截图中可以看出,cursor: pin S wait on X等待事件占了DB time 86.9%,造成这个等待事件最常见的原因就是sql并发执行,可以从Wait Classes by Total Wait Time、SQL Statistics部分反应上面的问题。

一次DB Time过高告警处理

1.4、查看Wait Classes by Total Wait Time、SQL Statistics

        查看下面2个截图,可以发现当前数据库并发等待事件比较突出,之后查看SQL Statistics,发现是和用户登陆权限校验的sql有关,正常来讲,第二个截图中的一些sql不会造成cursor: pin S wait on X等待事件,这个需要在更具ash报告查看下,具体是哪些sql造成cursor: pin S wait on X。

一次DB Time过高告警处理


一次DB Time过高告警处理


        从下面的截图来看,session数的变化也能印证可能是用户并发访问数据库引起的。

一次DB Time过高告警处理

2、查看ash报告

        通过awr分析,问题基本可以确定是用户并发访问数据库频繁执行sql引起cursor: pin S wait on X,但是哪些sql引起,需要从ash报告中查看。
        通过下面截图可以看到,sql_id为39cbpxu5sp7zt和1dxpz6s60pyy2是造成这个现象的主要原因,接下来需要确认这两个sql频繁执行原因。

一次DB Time过高告警处理

2.3、了解sql执行的情况

    将上面2个sql反馈给客户后,并且询问这个期间用户登陆数据库的情况,客户反馈:
        ①第一个sql是用户登陆数据库做权限校验用的,第二个是获取病人信息使用的,这两个sql都是在用户登录时触发的
        ②sql中使用了dblink,awr期间dblink有异常,不能正常执行
        ③sql不能执行,用户端端获取不到结果,护士持续发起请求,连接数据库,最终导致了上面的情况

3、总结

        上面的情况大致就是,客户端查询信息,没有得到结果,之后不断重试,并发访问,在数据库端,sql中使用了dblink,dblink在那个期间出现问题,不能执行,最终出现了上面的问题。上面如果有不正确的地方欢迎大家指正。

上一篇:移动端长列表滚动优化


下一篇:Appium-处理系统弹窗