循序渐进Oracle - 全面认识Oracle ASH

盖国强 2017-04-10
261

从Oracle 10g开始,Oracle引入了ASH新特性,也就是活动Session历史信息记录(Active Session History,ASH)。如果说v$session_wait_history是一小步,那么ASH则是Oracle迈出根本变革的一大步。

本文节选自<循序渐进Oracle:数据库管理、优化与备份恢复>

一、ASH概述

ASH以v$session为基础,每秒钟采样一次,记录活动会话等待的事件。因为记录所有会话的活动是非常昂贵的,所以不活动的会话不会被采样,这一点从ASH的“A”上就可以看出。采样工作由Oracle 10g新引入的一个后台进程MMNL来完成。


是否启用ASH功能,受一个内部隐含参数控制:


而采样时间同样由另一个内部隐含参数决定:


1000毫秒正好是一秒的时间。此处引用的脚本GetHparDes.sql内容如下:


SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ

  FROM SYS.x$ksppi x, SYS.x$ksppcv y

 WHERE x.inst_id = USERENV ('Instance')

   AND y.inst_id = USERENV ('Instance')

   AND x.indx = y.indx

   AND x.ksppinm LIKE '%&par%'

/


注意:隐含参数通常具有特殊的作用,一般不建议用户查询或者修改,本文大量引用隐含参数的目的只有一个,那就是希望大家知道,所有在文档中见到的限制、约束、阈值、比率都是有来源的,只要足够细心,就能找出数据库的真相,不再靠记忆来学习。

很多人可能更关心性能,如此频繁的采样是否会极大地影响数据库的性能呢?


采样的性能影响无疑是存在的,但是因为Oracle的采样工具可以直接访问Oracle10g内部结构,所以是极其高效的,对于性能的影响也非常小,这也正是Oracle提供优化或诊断工具的优势所在。


ASH信息被设计为在内存中滚动的,在需要时早期的信息是会被覆盖的。ASH记录的信息可以通过v$active_session_history视图来访问,对于每个活动session,每次采样会在这个视图中记录一行信息。


这部分内存在SGA中分配:

SQL> select * from v$sgastat where name like '%ASH%';

POOL            NAME               BYTES

------------     ---------------    ----------

shared pool   ASH buffers     6291456


注意,ASH buffers的最小值为1MB,最大值不超过30MB,大小按照以下算法分配:

Max ( Min (cpu_count * 2MB, 5% * SHARED_POOL_SIZE, 30MB), 1MB)


在以上公式中,如果SHARED_POOL_SIZE未显示设置,则限制为2%*SGA_TARGET。这一算法在Oracle 10g的不同版本中,可能不同。


根据这个算法,这里采样系统分配的ASH Buffers为6MB:


另外一个生产系统中,这一内存分配为8MB:


记录在SGA中的ASH信息,可以通过v$session_wait_history进行查询:


二、ASH报告

我们可以通过Oracle提供的工具生成ASH的报告,报告可以以几分钟为跨度对数据库进行精确分析;也可以以数小时或数天为时间跨度,为数据库提供概要分析。生成ASH报告主要可以通过两种方式。


脚本方式

调用$ORACLE_HOME/rdbms/admin/ashrpt.sql脚本,回答一系列问题之后,就可以生成一个ASH的报告,报告包括Top等待事件、Top SQL、Top SQL命令类型、Top sessions等内容,摘录部分报告内容如下。


首先使用$ORACLE_HOME/rdbms/admin/ashrpt.sql脚本:


数据库可用的采样数据:


完成一系列定义之后,ASH会将用户定义概要显示出来:


然后生成ASH报告,接下来对这个报告进行一点详细说明:


顶级用户事件(TopUser Events)部分列出了采样时段内数据库发生的显著用户等待,可以看到行级锁竞争(enq: TX - row lock contention)占用了87.82%的活动时间。


顶级后台进程事件(TopBackground Events)部分列出后台进程等待事件,对于本例没有输出:


对于顶级等待事件,接下来部分列出了相关等待时间及其参数值。根据这些参数,可以知道等待发生在哪些对象或资源上,对于不同的等待事件,P1/P2/P3列信息被完整地记录在案,在Oracle 10g之前,我们是无法在事后获得这部分信息的:


顶级服务和组件(TopService/Module),这一部分列出活动进程的用户及应用信息,通过这部分信息可以看到,活动时间最久的应用是SQL*Plus,那么也就意味着,相关SQL是通过SQL*Plus直接执行的:


顶级SQL命令类型(Top SQL Command Types)部分列出了ASH采样阶段数据库接受的命令类型,通过以下的数据注意到,采样阶段占用87.82%时间的SQL是一条UPDATE命令:


再转到Top SQL部分,引发数据库等待的SQL在此被列出,在这里看到那条引发等待的UPDATE语句排在了第一位,第二位的SQL则引发了全表扫描:


通过以上介绍我们已经能够感受到ASH的强大之处。


session及session的等待信息、进一步的SQL信息都被记录在案,并且能够通过ASH报告清晰展现,这对于追踪数据库的性能问题,发现数据库性能瓶颈提供了极大的帮助。


这在Oracle 10g之前都需要DBA去跟踪、捕获,现在Oracle帮助我们完成了这一切。


接下来列出了数据库未使用绑定变量的SQL示例(Top SQLUsing Literals),看来Oracle将绑定变量的重要性进一步提高了:


顶级会话(TopSessions)部分列举了处于等待的会话,信息包括详细的等待事件、等待用户等:


阻塞会话列表(TopBlocking Sessions)部分列举了被阻塞的会话信息,这个信息和测试追踪的信息一致,其来源同样一致:


此外还有顶级并行查询信息,在这次采样中,未有这类信息记录:


顶级数据库对象(Top DBObjects)部分则列举了相关等待具体等待的对象,对于我们测试的EYGLE表此处已经列出,数据库业务应用全表扫描的数据表也已经被列出:


顶级数据文件列表(Top DB Files)部分列出了全表扫描访问的数据文件信息:


顶级栓锁(Top Latches)部分列出Latch竞争,对于本例没有这类竞争:


活动结束时间(Activity Over Time)部分列出了各类等待的细粒度显示:


通过ASH报告可以注意到,以前需要通过用户追踪或者不易跟踪的信息,通过现在的ASH报告,可以很清晰地从始至终获得全面的信息,与以前版本比较起来,性能诊断和分析可以用“易如反掌”来形容。


EM图形方式

通过Oracle 10g Web方式的EM,可以在性能页,单击“运行ASH报告”按钮生成ASH报告,如图所示。


只要试用一下就可以感受到ASH的强大功能,OEM生成的ASH报告非常清晰和直观。ASH的概况信息如下图所示。


等待事件信息如下。


等待参数信息如下。


Top SQL等信息如下。

加入"云和恩墨大讲堂"微信群,参与讨论学习

搜索 盖国强(Eygle) :eyygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。


关注微信,获得后续精彩分享

文章转载自盖国强,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论