我是从Oracle 5开始使用Oracle的,不过Oracle 5、6的时代,我只是帮用户安装Oracle而已,真正的开始关注数据库的内部,尝试调优数据库和解决数据库的故障是从Oracle 7.1开始的。因此我对v$sysstat有着十分深厚的感情,虽然从Oracle 7到Oracle 9,以至于到Oracle 11,v$sysstat中的指标数量增加了许多,但是对这个系统视图的用法没有改变。
2007年的时候,我和一个当时供职于Oracle ACS的朋友一起为某个运营商优化一套短信平台系统,那个朋友一看到用户的数据库是Oracle 10g,立马就说:“老徐,这个项目还是你来干吧,我从Oracle 6干到现在,不准备再去更新10g的知识了”。那个时代Oracle基本上5年迭代一个版本,而且每个版本都有一些颠覆性的技术出现。对于运维的可观测性来说,从Oracle7到Oracle 10g正是Oracle的可观测性体系日渐完善的时期,变化尤其大。
作为一个老DBA,用户一般都是挺尊重我的,记得我刚刚用10g的时候还闹过一个笑话,当时是给一个东北的运营商优化系统。当我要求在Oracle 10g上安装一个statspack的时候,甲方的DBA虽然没听说过啥叫statspack,不过还是很配合的帮我安装了。不过生成完第一份spreport的时候,那个DBA不禁笑了,这个不是和AWR报告很类似吗?这是我最后一次让让用户在10g上安装statspack报告。
因为惯性,在好长一段时间里,我一直没有意识到Oracle数据库发生的变化,也依然使用v$sysstat帮助用户分析问题。在10g和11g上,我会使用ASH来弥补v$sysstat在微观分析能力上的不足。
直到有一天,公司的小伙伴告诉我实际上没必要那么复杂的去通过统计v$sysstat来计算指标,Oracle 已经和提供了一个叫v$metric的系统视图,我们可以更加方便的获得这些指标。
图片
后来我仔细分析了一下,确实如此,原来从Oracle 10g开始Orace已经提供了如此强大的指标接口。在Oracle 12.1版本中,v$metric已经包含了200个指标,并且为这些指标提供了1秒、5秒、15秒、1分钟等多种统计值,用于不同需求的分析。Oracle还提供了一系列的Metric视图,向用户提供更加丰富的可观测性指标。比如eventmetric/sysmetric等。
目前大多数数据库都提供类似v$sysstat的系统视图,用于运维人员采集与分析相关的指标。不过v$sysstat还是太笼统了,还不够友好。如果能够像Oracle一样将sysstat在内核中加工,生成各种metric,那么数据库的可观测性能力将会得到极大的提升。去年的时候,一个用户经常会出现活跃会话数异常的情况,那个时段里经常会出现核心交易抖动。不过他们的监控哪怕把采样周期调整得很低,也抓不到这个现象。我看了一下他们的监控系统,原来是通过统计v$session的瞬间值来采集这个指标的,于是我让他去v$metric和v$metric_history中查找,一下子就抓到了好几个异常点。
可能有朋友会觉得奇怪,在数据库内核中做一个类似Oracle metric的功能难道很难吗?确实很难,因为内核既要兼顾性能与可靠性,又要提供更多的可观测性,确实很考验架构师和研发人员的水平。通过埋点实现的指标采集必须代码性能十分优越,否则会影响数据库的性能和稳定性。因此这些埋点的代码越简洁,做的事情越少越好。一个数据库产品要做好这一点确实是要花大力气的。
可喜的是,目前已经有一些数据库产品开始提供这方面的可观测性接口了,虽然接口还不够完善,提供的数据也没有Oracle丰富,起码已经看到我们的国产数据库厂商也已经关注到了这方的用户需求了。