暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据库锁/阻塞分析的一种常用方法

白鳝的洞穴 2021-01-23
1315
对于一些中小用户来说,日常遇到的最多的问题不外乎表空间与锁的分析。数据库表空间使用率/空间使用率分析似乎很简单,是一条SQL就能搞定的事情,实际上并不简单,这个话题容以后找时间阐述。今天就重点分析下另外一个问题,就是锁/阻塞分析。我加上了一个阻塞分析,就是说在数据库中阻塞应用的不仅仅有我们的一些常见的行锁/事务锁,表锁等锁,还有一些其他的机制,比如Oracle的GES/GCS,闩锁等,对于PostgreSQL,一些轻量级锁(lwlock)也会造成阻塞。
昨天一个朋友说他们的系统最近锁表情况比较严重,有没有啥好方法来分析。我说对于当前的问题很容易分析,历史情况需要通过ASH数据分析。如果要比较简单的快速定位问题。需要把分析过程工具化。于是我做了一个例子给他演示了一下。创造了一个行锁的现场,从D-SMART的监控界面上可以看到目前有两个被阻塞的会话:

点击这个指标,看到指标详情页面:

画圈的这个工具按钮就是一个利用知识库做工具推荐的工具。

其中推荐了一个生成Oracle数据库实例会话等待链的工具,点一下看看有什么效果:

可以看出,存在一个阻塞者会话,阻塞了两个会话。这和我们前面看到的两个阻塞会话是一致的。点击阻塞者的会话详情:

可以看出这是老白通过SQLPLUS登录上去的会话,执行了一条UPDATE语句,然后没有提交。工具也发现了问题,这个会话处于事务中,并且已经空闲了20多分钟了。
查看被阻塞者的情况:

发现了两个问题:

使用行锁分析工具去做分析:

发现了一个行锁,阻塞了2个会话。同时也指出系统中没有因为高并发而引起的行锁问题。
上面的演示采用了一种工具化的方法来进行分析,可以快速的定位当前问题与历史问题。如果我们手头没有D-SMART这样的工具,该如何去做分析呢?如果是Oracle数据库,要分析当前锁的情况是十分简单的,因为系统提供了大量的系统视图用于锁的分析,比如v$lock,v$access。

、实际上,从Oracle 11g开始,v$session的功能有了很大的提高,利用v$session我们完全可以对当前系统中的锁和阻塞情况进行全面的分析。另外我们可以从v$sysstat系统视图中去分析锁相关的等待是否存在问题。

如果我们把这个数据每3分钟采集一次,并写入一张表,然后进行差值计算,就可以随时掌握系统中锁的情况了。如果enqueue timeouts一直在增长,那么当前肯定存在长时间的锁等待。对于Oracle来说lock timeout的时间缺省值是3秒,大多数OLTP系统中,不应该经常存在超过3秒的锁等待。
max cf enq hold time这个值是记录了数据库启动以来控制文件锁的最大等待时间,我们也应该随时关注这个指标,当这个指标产生了一个新值的时候(比上一次采集的值更大),那么我们就应该注意这个采集周期里数据库是不是出现了一些不正常的状态。
当我们判断出数据库的锁存在问题后,我们就需要进一步的去分析锁的具体情况了。对于当前锁或者阻塞分析,最好的工具是v$session,对于历史数据据分析,可以使用ash,ash的数据缺省保留时间和awr一样,都是7天,在日常使用中已经足够了。下面是v$session视图的内容,我省略了一些和今天要讨论的阻塞分析用不着的字段。

如果一个会话正在等待一个锁,那么这个会话的lockwait是非空的,从这个字段我们可以判断正在等待锁的会话情况。
sql_exec_start也是一个十分有价值的字段,可以告诉我们当前SQL执行的启动时间,如果这个时间是比较早的,而且这条SQL很简单,那么这个会话可能就处于不正常的状态。
row_wait_obj#,row_wait_file#,row_wait_block#,row_wait_row#这几个字段可以让我们知道会话正在等待的某个行锁的情况(如果等待事件是行锁)。

 BLOCKING_SESSION_STATUS、BLOCKING_INSTANCE、BLOCKING_SESSION这几个字段对于分析会话阻塞情况是十分关键的,这几个字段指出本会话是否处于被阻塞的状态,以及阻塞/等待的类别。如果存在阻塞会话,则我们可以从blocking_instance和blocking_session这两个字段中知道谁阻塞了本会话。要注意的是blocking_session_stats不仅仅指出了阻塞的状态,还有可能反映出某些长时间等待某个等待事件。如果我们是在一个RAC环境中,阻塞来自于另外一个实例,那么我们可以使用gv$session这个视图做全局分析。不过对于GCS/GES的冲突比较严重的高负载系统,访问GV$的视图还是要十分小心,最好是发现存在跨实例的阻塞,再使用GV视图去做更详细的分析。

 了解了上面的一些情况,接下来你就可以自己着手去写自己的阻塞分析工具了。
如果我们要分析的不是当前的情况,而是历史情况又会怎么样呢?不用着急,我们有ASH数据,比如v$active_session_history视图。这个视图是对v$session的历史归档(只保留存在活跃状态的数据),因此进行锁/阻塞分析的方法十分类似。D-SMART中的等待链分析工具就是基于这两个视图的。
文章转载自白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论