点击上方蓝字关注我们
在日常运维中经常会遇到数据库出现了锁,导致前台应用运行缓慢,甚至应用无法使用的问题,由于在运维过程中,会出现各种各样的问题,遇到问题,数据库管理员会手忙脚乱,不知道从何处下手。如果着手分析的方向发生了错误,时间更是浪费严重,问题得不到及时解决,甚至有可能采取了错误的措施,导致更严重的后果。
其实导致数据库出现问题的原因有很多种,这个时候就需要我们通过自己学到的知识,经验的积累,来快速的定位问题的原因,下面跟着我来一起了解下DB2数据库有锁了该怎么处理;
一、锁链分析和处理
发现数据库中有锁,我们首先查看锁链情况,查看是被那个会话锁的,可以通过DB2的工具db2top来查看
db2top-d 数据库名 db2top-d sample |
然后输入U可以看到等待信息
在输入L可以看到锁链信息
在这个输出里面,7这个应用是锁的持有者,其他都是等待者。下一步就是分析7 在执行什么语句,是否需要杀,是否需要优化。
然而对于已经堵塞的Db2数据库,db2top可能根本打不开。这个时候就需要db2pd工具来查看锁等待的信息。
二、通过db2pd 查看锁等待db2pd-d smaple -wlock |
在这个db2pd的输出里面,第八列Sts就是持有者(G)和等待者(W)。第四列lockname是对应的锁。需要综合这两个信息,才能知道应用的等待关系。
三、分析锁问题通过上面的信息,找到了锁的持有者源头,但是现在还需要知道持有者在运行什么语句。这个可以通过db2pd的application选项和dynamic选项综合分析出当前正在执行和上次执行的语句。
db2pd查看application
db2pd-d sample -application 7 |
在db2pd工具的application输出里面,C-AnchID和C-StmtUID结合起来指向当前正在运行的语句。L-AnchID和L-StmtUID结合起来指向上一次执行的语句。要获得详细的语句,需要从dynamiccache 里找到。图中C-AnchID和C-StmtUID都是0,也就是当前应用没有执行任何语句。而L-AnchID和L-StmtUID是201和1,上一次执行的语句是可以获取到的。
db2pd查看动态语句
db2pd-d sample -dynamic anch=201 |
基于L-AnchID为201去查dynamiccache,可以看到StmtUID为1的sql语句是”insertinto t2values('5','cc')”。至此就得到了锁的持有者正在运行的语句或者最后运行的语句是什么。这样就可以和开发一起分析这个问题是什么原因导致的。
同样的方法我们也可以找到是什么语句在等待
可以看出是select* from t2这个语句在等待
四、处理锁问题通常异常出现锁问题的原因分两种:
1、不常见的SQL:当前SQL不是业务常用SQL,例如新上线的功能,管理节点发起的维护SQL,或者个人后台发起的SQL等。因为测试不充分,没有评估好对生产业务的影响。这种情况下一般选择先杀掉,并且控制不要再次发起,等优化完再上线。
2、常见SQL突然变慢:例如执行计划发生变化,导致SQL变慢,从而促发了锁竞争的问题。这种情况仅仅杀SQL可能是不管用的,因为SQL还会被调用起来。这时需要立刻获取SQL的查询计划,抓紧时间调优。例如运行runstats,创建必要的索引等方式。
以上是我在虚拟做的锁等待的实验,来带领大家一起了解处理锁问题的分析思路,在实际运维中锁的问题可能需要更加复杂,但是只要大家能耐心的分析,一定能解决问题。
END