Db2数据库中常见的堵塞问题分析与处理方法

IBM的DB2是关系数据库的鼻祖,最近更加的深入了学习了,所以下面这篇文章主要给大家介绍了关于Db2数据库中常见的堵塞问题分析与处理方法,文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧。

Db2 数据库堵塞怎么办

作为一个数据库管理员,工作中经常会遇到的一个问题:当数据库出现故障的情况下,如何快速定位问题和找到解决方案。尤其是在运维非常重要系统的时候,解决问题恢复服务是分秒必争。Db2 作为广泛使用的商业数据库,内部提供了众多方法论和诊断工具等来协助分析问题。然而当问题真正发生的时候,数据库管理员还是会手忙脚乱,不知道从何处下手。如果着手分析的方向发生了错误,时间更是浪费严重,问题得不到及时解决,甚至有可能采取了错误的措施,导致更严重的后果。

导致数据库堵塞原因有很多,即便是现在总结,也仅仅是总结曾经遇到过的情况。即便是曾经遇到的问题重复发生的时候,快速找到源头并处理也是很大的挑战。这个时候脑子里想着方法论,手上敲着各种诊断工具的命令,从输出的结果再继续分析处理。整个过程即便是非常有经验的数据库管理员也需要很多操作时间。如果可以针对常见的堵塞问题,开发出一个自动分析的工具,直接展示堵塞原因和处理语句,就能够大大加快处理的速度。这也是一直以来数据库管理员亟需的工具。然而因为导致数据库堵塞原因的多样性和未知性,写这样一个工具并不容易,所以市场上并没有这样的成熟工具。

退而求其次,仅仅针对常见的堵塞问题,是可以开发出这样的一键检查处理工具的。所以我开发了一个简单的 python 脚本,帮助分析日常工作中的遇到的数据库问题。后续也需要慢慢加强和改进。最重要的是,写这个文章是为了总结几种 Db2 数据库常见的堵塞问题并提供解决方案。

开发这个工具的时候,我联想到在以前遇到过数据库堵塞问题的时候,数据库甚至都没有办法连接,新请求也会被堵塞住。db2top 等命令完全出不来结果。只有 db2pd 这样的工具能够使用。db2pd 工具是从内存直接获取信息,不需要连接数据库,属于轻量级的诊断工具。所以在数据库发生堵塞,数据库无法连接的情况下,db2pd 是最好的选择。

DB2 数据库堵塞怎么办?首先是快速定位原因,使用 db2pd 将常见的堵塞现象分析一遍。如果定位到是曾经碰到的问题,那就比较好办了,赶紧实行对应的解决方案。如果不是常见的问题,尽量收集足够多的信息,例如 stack 等,然后重启实例恢复数据库,但是这样可能堵塞问题还是会重现,不能根本解决问题。

Db2 数据库常见堵塞问题

Db2 数据库发生性能缓慢或者堵塞的最常见现象是数据库活动会话激增,数据库相关命令和语句运行缓慢。导致性能缓慢的原因有很多,最常见的可能是出现锁问题。一个长 sql 堵塞其他相关 sql,导致短时间并发 sql 变多,系统变慢。也有可能是出现了大 sql,耗尽系统资源等。如下图所示,我归纳列举了一些常见的堵塞原因,整理了相关问题解决的方法。

图 1. Db2 常见堵塞问题分析

图中所列的这些问题都可以通过 db2pd 工具获取信息来分析。我也在一键检查分析工具里面包含了这些场景。

锁链分析和处理

Db2 的锁机制与其他数据库差异很大,锁问题也是在数据库运维中重点关注的对象。锁是用来控制事务的一致性和并发性的。Db2 的隔离级别和其他数据库差不多,都是解决脏读,幻读,不可重复读等问题。然而不同于其他数据库,Db2 的锁是存放在内存里的。数据库的 locklist 参数控制这个内存的大小。如果出现某个实务需要加的锁特别多,可能会导致这个内存里放不下,触发锁升级。锁升级更容易引起堵塞。

发现锁堵塞

一个正常运行的数据库突然出现锁问题通常有两种情况: 一种是运行了不常运行的 SQL 事务,堵塞了正常的交易。一种是正常的交易事务突然性能有问题,例如查询计划改变。不管是哪种情况,最紧要的是将源头找出来。db2top 工具有一个非常好用的功能,就是查看锁链的信息。

清单 1. db2top 查看锁链

 [\]16:01:41,refresh=0secs(0.008) Locks  AIX,member=[4/4],DB2GDPC:CHGMDB [d=Y,a=N,e=N,p=ALL]        [qp=off] +---------------------------------------------------------------------------------+ |           | | Blocker->Blocked Agent Chain      | | --------------------------------------------------------------------------- | | 1546->64481->1309       | |           | |           | |           | |           | |           | |           | |           | |           | |           | |           | |           | | Press any key to resume...       | +---------------------------------------------------------------------------------+ Quit: q, Help: h  Lock=49 (Entries=49), L: Lock Chain  db2top 2

在这个输出里面,1546 这个应用是锁的持有者,其他都是等待者。下一步就是分析 1546 在执行什么语句,是否需要杀,是否需要优化。

然而对于已经堵塞的 Db2 数据库,db2top 可能根本打不开。这个时候就需要 db2pd 工具来查看锁等待的信息。

清单 2. db2pd 查看锁等待

 AGDPCMB1:/home/db2gdpc$db2pd -d chgmdb -wlocks ksh: There is not enough space in the file system. Database Member 0 -- Database CHGMDB -- Active -- Up 19 days 01:18:29 -- Date2018-02-27- 16.52.48.487758 Locks being waited on : AppHandl [nod-index] TranHdl Lockname   Type Mode Conv Sts CoorEDU AppName AuthID AppID 1546 [000-01546] 39  00030418000000000000000452 RowLock ..X G 176565 db2bp DB2GDPC *N0.db2gdpc.180430224639 1309 [000-01309] 40  00030418000000000000000452 RowLock ..X W 323302 db2bp DB2GDPC *N0.db2gdpc.180430224640 1546 [000-01546] 39  00030418000000000000000054 TableLock .IX G 176565 db2bp DB2GDPC *N0.db2gdpc.180430224639 1309 [000-01309] 40  00030418000000000000000054 TableLock .IX G 323302 db2bp DB2GDPC *N0.db2gdpc.180430224640 64481 [000-64481] 3  00030418000000000000000054 TableLock ..S W 394879 db2bp DB2GDPC *N0.db2gdpc.180430224637

在这个 db2pd 的输出里面,第八列 Sts 就是持有者(G)和等待者(W)。第四列 lockname 是对应的锁。需要综合这两个信息,才能知道应用的等待关系。这里分析锁等待关系并不是非常直观。所以我在开发的工具里结合 lockname 和锁状态信息组织出锁链关系,然后展示出来。

分析锁问题

基于上述信息,找到锁的持有者源头,现在还需要知道持有者在运行什么语句。这个可以通过 db2pd 的 application 选项和 dynamic 选项综合分析出当前正在执行和上次执行的语句。

清单 3. db2pd 查看 application

 AGDPCMB1:/home/db2gdpc$db2pd -d chgmdb -application 1546 Database Member 0 -- Database CHGMDB -- Active -- Up 20 days 18:31:55 -- Date 2018-03-01- 10.06.14.595025 Applications: Address  AppHandl [nod-index] NumAgents CoorEDUID Status   C- AnchID C-StmtUID L-AnchID L-StmtUID Appid WorkloadID WorkloadOccID CollectActData  CollectActPartition CollectSectionActuals 0x0A00020042CA0080 1546 [000-1546] 1  147263 UOW-Waiting  0 0  341 2  *N0.db2gdpc.180504025324 1  37352  N   C   N External Connection Attributes Address  AppHandl [nod-index] ClientIPAddress EncryptionLvl SystemAuthID 0x0A00020042CA0080 1546 [000-1546] n/a     None DB2GDPC Trusted Connection Attributes Address  AppHandl [nod-ind

以上就是Db2数据库中常见的堵塞问题分析与处理方法的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 数据库