现在的Oracle DBA们都已经比较习惯于使用等待事件接口来分析Oracle数据库的性能或者某些异常甚至故障。这是因为Oracle的等待事件接口能够十分明确的表现出数据库的运行性状。二十多年前大多数客户还在用Oracle 7的时候,我从一个地方了解到Oracle 7.3已经具有了OWI,通过$ORACLE_HOME/rdbms/admin下的utlbstat/utlestat这两个脚本可以生成一份report.txt,通过这个报告,可以用来分析数据库的运行情况和性能瓶颈。这个报告就是著名的statspack报告的前身,后来statspace报告在10g之后改名为awr report。在当时,通过OWI我们第一次看到了数据库运行的全貌性的数据,从此Oracle数据库的运维与分析进入了一个新的时代。DBA不仅仅可以通过几个缓冲区的命中率以及SQL的运行情况来分析数据库的性能与问题,还可以通过数据库的等待事件情况来对数据库进行更为深入的分析,从而定位一些疑难杂症。正是利用这个技能,作为一个程序员的我,也经常帮助一些客户解决Oracle数据库的疑难杂症。时间长了,大家的数据库有些什么问题,都主动找我,我也算步入了DBA的行列。

utlbstat/utlestat工具十分简陋,也仅仅能够列出一些等待事件、一些状态值的情况,不过因为这些值十分准确,能够十分正确的反映出数据库的运行状态,因此从二十多年前的Oracle 7到现在的12.2,OWI一直成为DBA分析数据库问题的利器。
现在绝大多数DBA都知道,如果数据库系统出了问题,那么就可以生成一份AWR报告,然后来看看主要的等待事件等信息,找出系统中存在的问题。当然AWR里包含了十分丰富的数据,经验丰富的DBA可以看出更多的信息来,本文不是介绍AWR报告解读的文章,因此这里就不细说了。AWR报告可以看出一个时间段里的数据库的总体情况。如果这个时间段内,数据库系统存在某个很严重的问题,那么我们可以在AWR中找到各种蛛丝马迹,从而定位系统的问题。不过有些时候数据库的一些问题可能被一些其他的亚健康状态所掩盖了,这样我们在AWR报告中就不太容易看出问题来了。当然有经验的DBA还是能够在某些状态的细微变化上发现问题的所在,不过对于大多数DBA来说,要从这些AWR里找到问题的根因,和看天书有得一比。有些DBA说OWI只能看一些数据库总体的运行情况,这实际上是不准确的,OWI也能够看出数据库的某些细微的问题。

通过这个以OWI相关数据构建的健康模型,我们可以看出当数据库健康状态不太好的时候,数据库的负载、IO、命中率三个维度都出现了一些健康问题,最终导致了数据库的总体情况维度的健康度十分低。这是通过某一个时间点的切面获得的数据库的健康状态。如果我们不是看一个时间段内的OWI的平均数据,而是去看某一个时点的情况,就可以看出一些微观方面的问题了。
分析数据库微观的问题,我们还可以从ASH入手。从Oracle 10g开始,Oracle提供了ASH这个更为强大的数据库问题分析工具,不过大家似乎不是太会用。一方面是Oracle自己提供的ashrpt工具相对简单,让DBA获得的信息不够,导致ash分析并没有成为Oracle 数据库运维的主要分析方法。实际上,随着这些年数据库技术的发展以及硬件的发展,表现得十分明显得数据库问题越来越少了,因此这些年通过ash分析定位问题根因得情况越来越多了。很多时候,通过awr报告不容易发现的问题,使用ash分析就可以轻松解决了。当然仅仅使用ash报告是不够的,自己编写分析脚本去分析ash的原始数据是十分有效的。

这是D-SMART中的ASH分析工具,通过ASH分析工具,可以定位系统中的主要等待事件相关的问题根因,包括SQL、某些特殊的锁和操作等等,还有窗口内的TOP SQL、等待事件链、HANG分析等。通过这些分析,可以对数据库微观的问题快速定位。微观分析对于隐藏较深的被一些亚健康状态所掩盖的数据库健康问题定位的效果很好,是DBA必须掌握的技能。
实际上,对于宏观分析,继OWI后,Oracle还推出了一个新的模型-“时间模型”。

时间模型使用OWI的数据进行归类分析,从而形成一个更为简单的模型,通过这个模型我们可以分析系统中存在的问题。大多数DBA都不太会使用时间模型,而更喜欢看AWR该报告里的TOP EVENT。实际上如果TOP EVENT和time model各有擅场,通过时间模型上数据的变化(和正常情况比对),我们可以更为快速的定位可能存在问题的方向,再从这个方向上去做深度分析,可以取得更好的效果。比如说,我们看到TOP EVENT里有某个等待事件排名靠前,那么这个等待事件对系统的影响度有多大呢?实际上通过时间模型中的百分比,我们就可以进行更为精准的分析了。如果这个等待事件相关的等待类在时间模型中占比十分低,那么说明这个等待事件在这段时间里可能对数据库的总体影响并不高。
随着开源数据库和国产数据库的使用越来越多,我们总希望在开源数据库和国产数据库运维的时候也能看到类似的报告,从而用类似Oracle OWI的方法去定位数据库问题。而事实上,我们可能要失望了,虽然各类国产数据库和开源数据库上也有一些类似的报告,但是因为其统计数据不够准确,或者统计数据的内容较少,我们目前还很难通过这些报告来像Oracle那样定位问题。甚至在某些数据库上,等待事件的平均等待时间等数据的统计还存在错误和偏差,如果我们直接利用这些数据来进行分析,可能会对我们形成一定的误导。我们在运维开源/国产数据库的时候可能会发现,很多数据库都可以统计等待事件的次数,但是不提供等待事件的平均等待时长。曾经有国产数据库厂商和我做过专项的交流,分析Oracle 是如何做到能够精准的统计等待时间的,而我们为什么加上等待时间统计后,数据库性能会有那么大幅度的下降。这是因为ORACLE 实现OWI上面依赖其很深的技术积累,能够通过开销很小的方式统计等待时间,这个话题十分复杂,今天讨论的内容有限,我们就不做展开了,下回再找时间详细讨论。
正是因为上面的问题,在运维国产数据库/开源数据库的时候,我们大多数情况下还是需要通过分析操作系统的情况、通过系统调用的占比、通过TOP SQL等方式来进行分析,而无法通过那些数据库提供的类似AWR的报告来进行分析。Oracle的OWI 虽然已经出现了二十多年了,依然是我们国产数据库学习和追赶的一个方向。




