当数据库发生故障时,如何快速定位问题并找到解决方案。特别是在非常重要的系统的运行和维护中,解决问题和恢复服务是分秒必争。DB2作为广泛使用的商业数据库,内部提供了许多方法和诊断工具来协助分析问题。但是,当问题确实发生时,数据库管理员仍然会很着急,不知道从哪里开始下手。如果在分析方向上发生错误,则会浪费更多的时间,并且无法及时解决问题。 甚至可能导致严重的后果。因此找出DB2数据库拥塞的原因才是问题的关键。DB2数据库中常见的堵塞问题有哪些?如何处理?
DB2数据库常见堵塞问题
DB2数据库发生性能缓慢或者堵塞的最常见现象是数据库活动会话激增,数据库相关命令和语句运行缓慢。导致性能缓慢的原因有很多,最常见的可能是出现锁问题。一个长sql堵塞其他相关sql,导致短时间并发sql变多,系统变慢。也有可能是出现了大sql,耗尽系统资源等。如下图所示,我归纳列举了一些常见的堵塞原因,整理了相关问题解决的方法。
图中所列的这些问题都可以通过DB2pd工具获取信息来分析。我也在一键检查分析工具里面包含了这些场景。
锁链分析和处理
DB2的锁机制与其他数据库差异很大,锁问题也是在数据库运维中重点关注的对象。锁是用来控制事务的一致性和并发性的。DB2的隔离级别和其他数据库差不多,都是解决脏读,幻读,不可重复读等问题。然而不同于其他数据库,DB2的锁是存放在内存里的。数据库的locklist参数控制这个内存的大小。如果出现某个实务需要加的锁特别多,可能会导致这个内存里放不下,触发锁升级。锁升级更容易引起堵塞。
发现锁堵塞
一个正常运行的数据库突然出现锁问题通常有两种情况: 一种是运行了不常运行的SQL 事务,堵塞了正常的交易。一种是正常的交易事务突然性能有问题,例如查询计划改变。不管是哪种情况,最紧要的是将源头找出来DB2top工具有一个非常好用的功能,就是查看锁链的信息。
清单1.DB2top查看锁链
在这个输出里面,1546 这个应用是锁的持有者,其他都是等待者。下一步就是分析1546在执行什么语句,是否需要杀,是否需要优化。
然而对于已经堵塞的DB2数据库,DB2top可能根本打不开。这个时候就需要DB2pd工具来查看锁等待的信息。
清单2. DB2pd 查看锁等待
在这个 DB2pd 的输出里面,第八列 Sts 就是持有者(G)和等待者(W)。第四列 lockname 是对应的锁。需要综合这两个信息,才能知道应用的等待关系。这里分析锁等待关系并不是非常直观。所以我在开发的工具里结合 lockname 和锁状态信息组织出锁链关系,然后展示出来。
分析锁问题
基于上述信息,找到锁的持有者源头,现在还需要知道持有者在运行什么语句。这个可以通过DB2pd 的application选项和dynamic选项综合分析出当前正在执行和上次执行的语句。
清单3. DB2pd 查看application
在DB2pd 工具的 application 输出里面,C-AnchID和C-StmtUID结合起来指向当前正在运行的语句。L-AnchID和L-StmtUID结合起来指向上一次执行的语句。要获得详细的语句,需要从dynamic cache里找到。图中C-AnchID和C-StmtUID都是0,也就是当前应用没有执行任何语句。而L-AnchID和L-StmtUID是341和2,上一次执行的语句是可以获取到的。
小结:导致数据库堵塞的问题原因非常多,上述只是列举了其中一小部分,想了解更多DB2数据库的信息,请继续关注中培伟业吧。