点击上方蓝字关注我们
在日常运维中经常会遇到数据库出现了锁,导致前台应用运行缓慢,甚至应用无法使用的问题,由于在运维过程中,会出现各种各样的问题,遇到问题,数据库管理员会手忙脚乱,不知道从何处下手。如果着手分析的方向发生了错误,时间更是浪费严重,问题得不到及时解决,甚至有可能采取了错误的措施,导致更严重的后果。
其实导致数据库出现问题的原因有很多种,这个时候就需要我们通过自己学到的知识,经验的积累,来快速的定位问题的原因,下面跟着我来一起了解下DB2数据库有锁了该怎么处理;
一、锁链分析和处理
发现数据库中有锁,我们首先查看锁链情况,查看是被那个会话锁的,可以通过DB2的工具db2top来查看
db2top-d 数据库名 db2top-d sample |
然后输入U可以看到等待信息
在输入L可以看到锁链信息
在这个输出里面,7这个应用是锁的持有者,其他都是等待者。下一步就是分析7 在执行什么语句,是否需要杀,是否需要优化。
然而对于已经堵塞的Db2数据库,db2top可能根本打不开。这个时候就需要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,创建必要的索引等方式。
以上是我在虚拟做的锁等待的实验,来带领大家一起了解处理锁问题的分析思路,在实际运维中锁的问题可能需要更加复杂,但是只要大家能耐心的分析,一定能解决问题。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130032.html
摘要:也有人称其为同步锁。既然是锁,其必然有锁的东西,下面先会简单介绍一下,再通过一个示例代码展示锁了什么。从而可以证明并不是锁定方法内访问的变量锁定的是同一个监视器对象监视的代码 前言 synchronized翻译为中文的意思是同步的,它是Java中处理线程安全问题常用的关键字。也有人称其为同步锁。既然是锁,其必然有锁的东西,下面先会简单介绍一下synchronized,再通过一个示例代码...
摘要:而且只要他更新完毕对修饰的变量赋值,那么读线程立马可以看到最新修改后的数组,这是保证的。这个时候,就采用了思想来实现这个,避免更新的时候阻塞住高频的读操作,实现无锁的效果,优化线程并发的性能。 今天聊一个非常硬核的技术知识,给大家分析一下CopyOnWrite思想是什么,以及在Java并发包中的具体体现,包括在Kafka内核源码中是如何运用这个思想来优化并发性能的。这个CopyOnW...
摘要:首先谈到分布式锁自然也就联想到分布式应用。如基于的唯一索引。基于的临时有序节点。这里主要基于进行讨论。该命令可以保证的原子性。所以最好的方式是在每次解锁时都需要判断锁是否是自己的。总结至此一个基于的分布式锁完成,但是依然有些问题。 showImg(https://segmentfault.com/img/remote/1460000014128437?w=2048&h=1365); 前...
摘要:了解自动锁很早就受不了锁的机制了每次都需要在去解锁不仅代码不美观而且很麻烦我想能不能实现加锁之后自动解锁如果是可以利用析构函数实现但就想了想好像可以利用的特性对象只需要实现接口实现自动锁我了解如何利用特性写一个自动锁那么下面我们开始真正 了解自动锁 很早就受不了 java 锁的机制了,每次都需要在 finally 去解锁, 不仅代码不美观,而且很麻烦 我想能不能实现加锁之后自动解锁, ...
阅读 1249·2023-01-11 13:20
阅读 1557·2023-01-11 13:20
阅读 1011·2023-01-11 13:20
阅读 1680·2023-01-11 13:20
阅读 3971·2023-01-11 13:20
阅读 2519·2023-01-11 13:20
阅读 1310·2023-01-11 13:20
阅读 3486·2023-01-11 13:20