DB2数据库堵塞怎么办?
时间:2020-12-12

对于数据库管理员来说,工作中经常遇到的一个问题是:当数据库发生故障时,如何快速地定位问题并找到解决方案。特别是在运行重要系统时,解决问题恢复服务是分阶段需要解决的。作为广泛使用的商业数据库,Db2内部提供了许多方法和诊断工具等,以帮助分析问题。但是,如果问题真的发生了,数据库管理员仍然很忙,不知道该从哪里着手。假如在分析的方向上出现了错误,时间就会更加浪费,问题无法及时解决,甚至有可能采取错误的措施,导致更加严重的后果。

造成数据库阻塞的原因有很多,即使现在总结,也只是总结曾经遇到过的情况。即使在遇到问题反复出现的情况下,迅速找到根源并加以解决也是一个巨大的挑战。此时脑子里想着方法,手按着各种诊断工具的指令,从结果输出到分析处理。即使是非常有经验的数据库管理员,也要花费大量的操作时间。如能针对常见的阻塞问题,开发出一种自动分析工具,直接显示阻塞原因并对语句进行处理,就能大大加快处理速度。这个工具对于数据库管理员来说也是非常必要的。但是,由于造成数据库阻塞的原因多种多样,且未知,所以很难编写这样一个工具,因此市场上还没有成熟的工具。

退后一步,仅仅针对常见的堵塞问题,就可以开发出这样的一键检查处理工具。因此,我开发了一个简单的python脚本来帮助分析在日常工作中遇到的数据库问题。随后还需要逐步加强和改进。首先,本文旨在总结一些Db2数据库常见的阻塞问题,并提供解决方案。

当开发此工具时,我想到以前遇到过数据库阻塞问题,当数据库甚至无法连接时,新请求就会被阻塞。像db2top这样的命令根本没有结果。只有db2pd等工具可以使用。DB2pd工具是直接从内存中获取信息,不需要连接数据库,属于轻量级诊断工具。因此,当数据库出现阻塞而无法连接时,db2pd是最佳选择。

数据库阻塞了怎么办呢?第一,快速定位原因,用db2pd对常见的阻塞进行分析。若定位到曾经遇到过的问题上,那就更好办了,赶紧实施相应的解决办法。若非常见问题,则尝试收集足够多的信息,如stack等,然后重新启动实例恢复数据库,但这仍可能导致问题再次出现,无法从根本上解决问题。

数据库Db2常见阻塞问题。

数据库执行速度慢或出现阻塞的最常见情况是数据库活动会话增加,以及数据库相关命令和语句执行速度慢。有很多原因会导致性能下降,最常见的可能是锁问题。长sql会阻塞其它相关sql,导致短时间内并发sql增多,系统缓慢。还有可能出现大的sql,耗尽系统资源等等。下面我就归纳列举一些常见堵塞的原因,并整理出解决相关问题的方法。

图1.Db2常见阻塞分析。

DB2数据库堵塞怎么办?

可以通过db2pd工具获得分析图中列出的这些问题的信息。在一键检查分析工具中,我还包括了这些场景。

链条分析与加工。

与其他数据库相比,Db2的锁定机制差别很大,锁问题也是数据库运行中的一个主要问题。锁定用于控制事务的一致性和并发性。与其他数据库一样,Db2的隔离级别可以解决脏读、幻读、不可重复读等问题。但是,与其他数据库不同的是,Db2的锁存储在内存中。这个内存大小由数据库的locklist参数控制。当某些操作需要加锁的时候,锁可能会导致这个内存无法放置,从而触发锁升级。锁定升级更容易造成堵塞。

找到锁孔。

通常有两种情况,正常运行的数据库会突然出现锁问题:一种是运行不频繁的SQL事务,这会阻塞正常的交易。其中之一是普通事务突然出现性能问题,比如查询计划更改。无论在哪一种情况下,最重要的是要找到其根源。db2top工具有一项非常有效的功能,它可以查看锁链信息。