如果OS层面没有发现明显问题,那么下一步吧就需要去排查数据库了。排查数据库可以先从锁和会话查起,如果数据库有等待事件,可以分析一下主要等待事件,从等待事件的名称上去找灵感。不过不幸的是,国产数据库的等待事件往往不够靠谱,很可能收获不大。不过会话、活跃会话、锁、长事务等的排查是必要的。幸运的是大多数国产数据库查这些问题也不算太困难。找到手册就很容易写出排查SQL了。
如果确实是活跃会话太多,那么我们应该通过会话视图找出这些会话属于哪个应用,哪个主机,哪个用户的,从而更加精确地找到问题点。如果发现了,可以让开发商或者应用运维人员先去排查应用。
TOP SQL的检查可以先从并发执行的SQL查起,一般国产数据库的会话视图都有SQLTEXT,根据SQLTEXT的前几十个字节做统计,看看是否有某些类似的SQL的并发执行量很大,如果存在这样的SQL,那么下一步重点排查的方向就有了。
很多国产数据库都有一个SQL审计视图,这个视图一般是一个内存区域,存储了最近执行的1000条或者几千条SQL语句,这个视图不是按照Oracle V$SQL这样做过签名归并的,而是每执行一次就会有一条记录,通过这个接口也可以很好地分析当前SQL的执行情况。找到可能存在问题的SQL去解决问题就可以了。如果暂时无法优化SQL,杀掉一批会话可能就能临时解决问题了。
是不是不太难?只要你是有心人,哪怕面对一个你不熟悉的数据库,上面的排查工作你也是可以比较顺利地完成的。事先准备好一些排查SQL语句就可以了。甚至在现场,如果你的心理素质够好,根据官方手册,临时去写几条排查SQL也没问题。