一、背景
某个数据库在20200312 14:00:28-15:00:18期间,监控系统发出DBTime超出阈值告警,信息如下:
二、问题分析
1、获取期间AWR报告,进行分析
1.1、查看Elapsed、DB Time指标
通过AWR可以看到,服务器规格是4CPU16G,Elapsed*CPUs=239.36min远远小于DB Time(22,862.47min),反应awr统计的时间段数据库很繁忙。
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等待上。
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部分反应上面的问题。
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。
从下面的截图来看,session数的变化也能印证可能是用户并发访问数据库引起的。
2、查看ash报告
通过awr分析,问题基本可以确定是用户并发访问数据库频繁执行sql引起cursor: pin S wait on X,但是哪些sql引起,需要从ash报告中查看。
通过下面截图可以看到,sql_id为39cbpxu5sp7zt和1dxpz6s60pyy2是造成这个现象的主要原因,接下来需要确认这两个sql频繁执行原因。
2.3、了解sql执行的情况
将上面2个sql反馈给客户后,并且询问这个期间用户登陆数据库的情况,客户反馈:
①第一个sql是用户登陆数据库做权限校验用的,第二个是获取病人信息使用的,这两个sql都是在用户登录时触发的
②sql中使用了dblink,awr期间dblink有异常,不能正常执行
③sql不能执行,用户端端获取不到结果,护士持续发起请求,连接数据库,最终导致了上面的情况
3、总结
上面的情况大致就是,客户端查询信息,没有得到结果,之后不断重试,并发访问,在数据库端,sql中使用了dblink,dblink在那个期间出现问题,不能执行,最终出现了上面的问题。上面如果有不正确的地方欢迎大家指正。