为了系统化的梳理 AWR 的知识体系,我们整理了一个系列文章,希望从原理、使用到 AWR 报告的解读,给读者展示全面的 AWR 知识体系,本文是这个系列文章的开篇。
自动负载信息库(Automatic Workload Repository,AWR)是在Oracle 10g中被引入的,缺省地被安装到Oracle10g数据库中,用于收集关于该特定数据库的操作统计信息和其他统计信息。Oracle以固定的时间间隔(默认为每小时一次)为其所有重要统计信息和负载信息执行一次快照,并将这些快照存储在AWR中。这些信息在AWR中保留给定的时间(默认为一周),然后被清除。执行快照的频率及其保持时间都可以自定义,以满足不同环境的独特需要。
AWR的采样间隔及信息保留等信息可以通过dba_hist_wr_control视图查询得到:
AWR的采样工作由后台进程MMON每60分钟执行一次,ASH信息同样会被采样写出到AWR负载库。虽然ASH
buffers被设计为保留1小时的信息,但是很多时候这个内存是不足够的,当ASH buffers写满之后,另外一个后台进程MMNL将会主动将ASH信息写出。由于数据量巨大,把所有的ASH数据写到磁盘上是不可接受的。一般是在写到磁盘的时候过滤这个数据,写出的数据占采样数据的10%,写出时通过direct-path insert完成,尽量减少日志生成,从而最小化数据库性能影响。
通过下图,可以直观地理解ASH与AWR的关系。
ASH与AWR的关系
AWR的行为受到数据库另外一个重要初始化参数STATISTICS_LEVEL的影响,该参数有以下3个可选值。
· BASIC:设置为BASIC时,AWR的统计信息收集和所有自我调整的特性都被关闭。
· TYPICAL:设置为TYPICAL时,数据库收集部分统计信息,这些信息为典型的数据库监控需要,是数据库的缺省设置。
· ALL:所有可能的统计信息都被收集。
AWR的采样设置可以通过Oracle 10g新增加的一个系统包dbms_workload_repository来完成,这个Package中的过程MODIFY_SNAPSHOT_SETTINGS可以用于修改AWR的缺省采样设置:PROCEDURE MODIFY_SNAPSHOT_SETTINGS
ASH信息的写出比例受一个隐含参数控制:
写出到AWR负载库的ASH信息记录在AWR的基础表wrh$active_session_hist中,wrh$active_session_hist是一个分区表,Oracle会自动进行数据清理。
wrh$active_session_hist记录的这些历史信息可以通过dba_hist_active_sess_history视图进行聚合查询,通过简化后的下图来看一下Oracle以session为起点的一系列用以追踪和诊断的数据库对象。
一系列用以追踪和诊断的数据库对象
简单总结一下:
· V$SESSION代表数据库活动的开始,是为源起;
· V$SESSION_WAIT视图用以实时记录活动session的等待情况,是当前信息;
· V$SESSION_WAIT_HISTORY是对V$SESSION_WAIT的简单增强,记录活动SESSION的最近10次等待;
· V$ACTIVE_SESSION_HISTORY是ASH的核心,用以记录活动session的历史等待信息,每秒采样一次,这部分内容记录在内存中,期望值是记录一个小时的内容;
· WRH$_ACTIVE_SESSION_HISTORY是V$ACTIVE_SESSION_HISTORY在AWR的存储地,V$ACTIVE_SESSION_HISTORY中记录的信息会被定期(每小时一次)的刷新到负载库中,并缺省保留一个星期用于分析。
· DBA_HIST_ACTIVE_SESS_HISTORY视图是WRH$_ACTIVE_SESSION_HISTORY视图和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。
可以看到,关于session信息的记录,Oracle从不同的粒度进行了增强,目的只有一个,那就是全面真实地记录、监控和反映数据库的运行状况。
AWR记录的信息还远不止于此,通过系统的自动采样,AWR可以收集数据库运行的各方面统计信息及等待等重要数据,提供给数据库诊断分析使用。当然AWR的信息需要独立存储,在Oracle 10g中,新增的SYSAUX表空间是这类信息的存储地:
在Oracle 10g之前的版本中,类似的功能是由Statspack实现,但是Statspack需要由用户自行安装调度,并且其收集的信息十分有限。我们一直提到的session历史信息Statspack就是无法提供的。AWR大大强化了这部分信息,由于AWR收集的信息十分完备,所以经常被称为“数据库的数据仓库”。
AWR信息的修改
缺省的,数据库每小时采样一次AWR数据,保留7天,这些定义是可以被修改的。DBA可以通过DBMS_WORKLOAD_REPOSITORY包来控制AWR的行为。
通过如下执行可以手工创建AWR采样点,在进行测试时,在测试前后进行手工采样可以帮助我们获得完善的测试性能数据:
创建的采样点,可以通过DBA_HIST_SNAPSHOT视图来查询。
除了手工创建采样点之外,数据库也允许我们手工删除采样点,这可以通过DBMS_WORKLOAD_REPOSITORY 包中的DROP_SNAPSHOT_RANGE过程来实现,该过程需要一个采样范围输入,然后删除指定范围内的AWR采样信息:
通过MODIFY_SNAPSHOT_SETTINGS 过程,还可以调整包括快照采样频率、快照保存时间、以及捕获的SQL 数量等信息。MODIFY_SNAPSHOT_SETTINGS 主要包含三个输入参数:
PROCEDURE MODIFY_SNAPSHOT_SETTINGS
其含义分别如下:
· Interval:设置快照的收集频率,以分钟为单位,最小值为10 分钟,最大值为1 年。如果设置该参数值为0,就表示禁用AWR 特性。
· Topnsql:有两种方式指定该参数,如果给定值为NUMBER,则其含义为收集比较占用资源的SQL 数量,最小值为30,最大不超过,这个设置会覆盖系统的statistics/flush 级别设置;如果这个参数设置为VARCHAR2,则允许的定义有: DEFAULT, MAXIMUM, N,这里的N同样指采样的Top SQL数量,DEFAULT参数受statistics level 影响,在TYPICAL设置下,采样Top 30,在ALL设置下采样Top 100 ,如果定义MAXIMUM 将引起系统采样和捕获所有的SQL。
如,修改采样间隔:
同时修改采样间隔为30分钟,保留周期15天(时间以分钟计算):
AWR报告的生成
根据AWR记录的数据,我们可以通过报告来展现这些信息。报告可以通过运行脚本生成类似statspack report的AWR报告,也可以通过Package直接输出。
脚本位于$ORACLE_HOME/rdbms/admin/awrrpt.sql,报表可以通过两种形式输出:TEXT和HTML。用脚本生成AWR报告的过程与生成Statspack报告非常类似,需要以sys用户执行这个脚本,执行过程需要选择报表类型、天数(用来决定显示那几天内的snapshot)、begin_snap、end_snap以及报表名称等5个参数。
如果不想手工输入参数,可以修改$ORACLE_HOME/rdbms/admin/awrrpti.sql文件,把需要用到的5个变量设置好,在执行过程中就不必再输入了,修改过的awrrpti.sql脚本可以用于自动生成报表。
以下是一个报告生成的简单示范过程,首先Oracle会要求我们指定报告类型:
定义文件格式之后,数据库会要求输入报告包含采样的时间段:
如果定义为2天之内,则2天之内的采样都会被列出供用户选择:
完成类似问题的回答后,报告生成。
awrrpt.sql脚本实际上是调用DBMS_WORKLOAD_REPOSITORY包来生成报表,这个包中主要有两个函数用于生成报表:
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT用于生成TEXT格式报表;
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML用于生成HTML格式报表。
例如,以下命令将和之前的定义等价:
AWR比较报告的生成
除了常规的AWR报告,Oracle还支持生成AWR比较报告,该报告可以对两个时段进行比较,生成详细的对比报告,提供比较分析,非常有助于问题的发现和解决。
生成对比报告,可以调用$ORACLE_HOME/rdbms/admin/awrddrpt.sql脚本实现,在OEM中可以更直观的看到这个过程,下图在操作中选择“比较时段”:
图:选择比较时段,生成比较报告
按照提示操作,选择两个时段,即可生成一个比较报告:
图:比较报告的两个时段
生成的比较报告可以清晰的看到不同日期数据库的性能对比,以下报告显示,第一个时段DB Time为43.8分钟,第二个时段数据库的DB Time高达885.31分钟,同样是一个小时,数据库的性能存在巨大的差异:
在负载概要部分,更详细的对比显示,两个时段的Logical Reads有显著的不同,进一步分析SQL列表,就可以找到引起过高逻辑读的SQL语句:
在数据库性能调整前后,生成对比报告,是显示调整效果的最佳手段之一。
Baseline - 基线
在创建数据库比较报告时,通常选择两个时段的采样进行比较,而如果我们能够创建基于正常运行的数据库快照,在发生性能问题时,就可以将异常与正常情况进行比较,获得差异对比信息。基线-BaseLine说的就是这个含义。
创建Baseline 时,需要指定一个采样范围,指点范围中的快照会被保存下来,不会因为过期而被删除,创建Baseline 可以使用CREATE_BASELINE 过程,执行该过程时分别指定开始和结束的snap_id,然后为该baseline 定义一个名称即可,例如:
使用DROP_BASELINE 过程删除Baseline信息,删除时可以通过cascade 参数选择是否将其关联的Snapshots 级联进行删除,下例选择了级联删除,例如:
有了基线之后,AWR报告之间的对比就会更加明确和有效。
AWR报告的分析
报告和Statspack的报告极为类似,不过Oracle 10g增加了很多新的内容,我们对新的内容进行一点简单介绍。
首先报告在Top 5 Timed Events后面增加了时间模型部分,根据前面对Statspack的分析可以知道,实际上等待时间也是依据时间模型来建立的,在Oracle 10g中,时间模型被独立出来并进一步细化:
等待事件通过分类之后,可以被快速汇总,从而显示数据库瓶颈消耗在哪一类资源上:
对于这个数据库,显然主要的等待都消耗在IO上,那么调整SQL、优化IO实际上应该是优化这个系统的主要目标。
更进一步地,Oracle将操作系统的统计信息也收集计算进来,这部分信息非常重要(以前的Statspack中是不包含这部分信息的),包括了CPU的繁忙程度、IO等待情况、内存总量、CPU数量等信息,这些信息对于评价数据库的并发性能、事务处理能力等都非常重要:
在AWR报告的SQL部分,则增加了SQL ordered by Elapsed Time和SQL ordered by CPU Time部分,通过这两部分内容,Oracle将最耗时的SQL抓取了出来,那么现在AWR对SQL的采样已经包括了一下内容。
· SQL ordered by CPU Time
· SQL ordered by Elapsed Time
· SQL ordered by Executions
· SQL ordered by Gets
· SQL ordered by Parse Calls
· SQL ordered by Reads
· SQL ordered by Sharable Memory
· SQL ordered by Version Count
可以说在Oracle 10g中,Oracle对SQL的采样已经相当完备了。从Oracle 11gR2开始,在SQL采样部分还包括了SQL ordered by User I/O Wait Time和SQL ordered by Physical Reads (UnOptimized)部分,对I/O资源的使用做出了进一步的评估,从SQL ordered by User I/O Wait Time部分我们可以清晰的看到哪些SQL消耗了更高的I/O等待,对于协助诊断分析数据库具有极大的参考意义。
下图是这一新增量度的范例:
更为有趣的是,如果我们将Oracle 10g的AWR数据导入到Oracle 11gR2中,就能够在生成AWR报告中利用这一新特性。
通过EM生成AWR报告
通过Oracle 10g基于Web方式的强大EM功能,我们可以很容易地进行AWR报告的创建查看以及分析等操作。
如下图所示,在EM管理选项中有一项称为“自动工作量资料档案库”,这就是配置和管理AWR信息的地方。
EM管理选项
单击该链接,可以进入编辑管理页面,如图10-11所示,在这里可以根据需要调整快照的保留时间和收集间隔等信息。
自动工作量资料档案库编辑页面
如果要查看和管理快照,可以单击快照具体数值中的链接,进入详细页面,该详细页面会列出系统中记录的采样点,首先选择一个快照作为AWR报告的起始点,然后在下拉菜单中选择“查看报告”,单击“开始”按钮,如下图所示。
查看报告
下一步进入选择结束采样点页面,如下图所示。
选择结束快照
单击“确定”按钮,数据库即开始生成AWR报告,如下图所示。
正在创建报告
此后生成的报告和通过脚本生成的报告内容是一致的,不过是通过Web形式展现出来(当然也可以转存为本地HTML格式的报告),如下图所示。
生成的AWR报告
AWR数据的导出导入
在进行采样数据分析时,经常涉及到跨数据库的迁移,对于Statspack的采样数据,可以通过spuexp.sql脚本,按照用户模式进行导出。
awrextr.sql 脚本用于导出;awrload.sql 用户AWR数据的加载;而加载后的数据可以通过awrddrpi.sql来生成报告。也是非常方便高效的。
查看这两个脚本,可以看到其中主要调用了dbms_swrf_internal 包来完成数据的卸载和加载工作。
awrextr.sql的核心内容如下:
dbms_swrf_internal.awr_extract过程通过指定相关参数(包括导出文件名、Directory路径名、开始snapid、结束的snapid,dbid)来实现数据转储。
awrload.sql的核心内容如下:
这个脚本通过dbms_swrf_internal.awr_load过程向数据库加载数据,其中需要定义一个临时的Schema名称,加载完成之后,再通过dbms_swrf_internal.move_to_awr将数据从临时Schema转移到正式Schema中。
了解这两个脚本的核心内容之后,其使用就一目了然了。
awrextr.sql 脚本非常易用,以下是一个测试输出:
执行的说明注释部分:
列举快照信息:
定义需要导出的快照范围:
定义DataPUMP需要的路径:
定义导出文件的名称:
完成所有条件定义之后,AWR开始Extract数据,抽取数据的实质是通过一个Query条件来限制访问的数据:
完成数据抽取后,我们就可以获得一个转储的导出文件。比如将生产库的采样数据导入测试库,就可以比较两者或多者之间的性能差异或变化,是非常有效的采样数据利用手段。
将导出文件转移到目标数据库或性能分析数据库,可以通过执行awrload.sql导入到数据库中。在导入之前,首先创建一个目录指向包含导出文件的路径,如:
然后调用awrload.sql脚本执行导入:
然后需要导入的文件名称,注意输入文件名不需要包含后缀,否则会报错:
然后有一个关键步骤是创建一个中间转换Schema,缺省的名称是AWR_STAGE,这个选择缺省即可,转换完成之后会自动删除:
在选择了缺省表空间及临时表空间之后,创建用户和导入的进程自动开始:
导入的基本原则是和原来的数据不产生冲突,所以大量的判断子句被加入进来:
最后Oracle通过INSERT APPEND的方式向SYS对象追加数据,然后删除临时用户,完成导入工作:
注意:以上这个过程在Oracle 10.2.0.4及10.2.0.5中存在问题,数据导入非常缓慢,几百M的文件导入可能就需要数个小时的时间,在11g中及10.2.0.4之前的版本中不存在这个问题。10g的AWR数据可以导入到11g的数据库中,以下是一个导入范例:
导入的AWR数据,同样可以生成AWR报告,通过调用awrrpti.sql脚本即可,这个脚本会要求输入DBID和实例号,定义导入数据库相应的信息即可生成相应的报告。
对于RAC集群环境,也可以通过调用awrrpti.sql脚本,按照不同的实例号来生成不同实例的AWR报告。
如果希望了解AWR数据的存储和分布情况,可以调用awrinfo.sql来生成关于AWR数据的报告,根据报告里的snap_id分布情况,你可以选择通过手工来删除一定范围的采样数据:
这个操作很快可以完成,如果检查数据字典可以发现,Oracle仅仅修改了对应SNAPSHOT的状态,而并没有真正删除快照(在11gR2最新的版本中,会执行直接删除操作):
检查DBA_HIST_SNAPSHOT视图可以发现,这个视图的定义是只显示STATUS为0的记录:
如果需要彻底清除某个实例的AWR数据,可以通如下命令指定DBID,则该数据库的所有采样都将被清除:
多数据库实例的对比报告
在RAC环境中,数据库的采样报告包含了两个实例的采样数据,可以通过awrddrpi.sql来生成两个实例的性能对比报告。
当向数据库导入了其他实例的AWR信息之后,也可以使用这个脚本来生成不同实例的对比报告,诸如对生产环境和测试环境的比对,都可以通过类似这样的操作来实现。
AWR报告的实现
AWR的本质是通过定时采样,收集数据库的性能数据,然后通过报表进行直观展现,以下摘录一些生成报表的SQL,可以据此了解一下Oracle AWR的内部展现机制。
在使用awrrpt.sql生成报告时,会调用awrrpti.sql脚本,该脚本的主要部分为:
select output from table(dbms_workload_repository.
&fn_name( :dbid,:inst_num,:bid,:eid,:rpt_options ));
这里的fn_name是根据用户输入的选项来选择调用AWR_REPORT_HTML或AWR_REPORT_TEXT函数。
这里的AWR_REPORT_MAIN是最重要的一个函数:
该函数的主要内容如下,:
接下来数据库就会在主要的过程中调用各种SQL生成报表的各部分内容,如以下就是展现等待事件的查询:
各类SQL不再过多介绍,了解了AWR的展现原理,我们就可以灵活的去分析各种AWR数据,获得更有价值的信息。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13835.html