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

oracle性能优化终极武器——AWR(自动负载信息库)

原创 eygle 2019-12-09
1342

内存中记录的ASH信息始终是有限的,为了保存历史数据,这些信息最终需要写入磁盘。这些历史信息的存储,引出了Oracle 10g的另外一个新特性:自动负载信息库(Automatic Workload Repository,AWR)

AWR缺省地被安装到Oracle 10g数据库中,用于收集关于该特定数据库的操作统计信息和其他统计信息。Oracle以固定的时间间隔(默认为每小时一次)为其所有重要统计信息和负载信息执行一次快照,并将这些快照存储在AWR中。
这些信息在AWR中保留给定的时间(默认为一周),然后被清除。执行快照的频率及其保持时间都可以自定义,以满足不同环境的独特需要。

AWR的采样间隔及信息保留等信息可以通过dba_hist_wr_control视图查询得到:

SQL> select * from dba_hist_wr_control;

      DBID SNAP_INTERVAL        RETENTION                      TOPNSQL
---------- -------------------- ------------------------------ ----------
3965153484 +00000 01:00:00.0    +00007 00:00:00.0              DEFAULT

AWR的采样工作由后台进程MMON每60分钟执行一次,ASH信息同样会被采样写出到AWR负载库。虽然ASH buffers被设计为保留1小时的信息,但是很多时候这个内存是不足够的,当ASH buffers写满之后,另外一个后台进程MMNL将会主动将ASH信息写出。

由于数据量巨大,把所有的ASH数据写到磁盘上是不可接受的。一般是在写到磁盘的时候过滤这个数据,写出的数据占采样数据的10%,写出时通过direct-path insert完成,尽量减少日志生成,从而最小化数据库性能影响。

3.png
图1 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
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 RETENTION                      NUMBER                  IN     DEFAULT
 INTERVAL                       NUMBER                  IN     DEFAULT
 TOPNSQL                        NUMBER                  IN     DEFAULT
 DBID                           NUMBER                  IN     DEFAULT

ASH信息的写出比例受一个隐含参数控制:

SQL> @GetHparDes.sql
Enter value for par: filter_ratio
old   6:    AND x.ksppinm LIKE '%&par%'
new   6:    AND x.ksppinm LIKE '%filter_ratio%'

NAME                           VALUE      DESCRIB
------------------------------ ---------- ------------------------------------------------
_ash_disk_filter_ratio         10         Ratio of the number of in-memory samples to the
                                          number of samples actually written to disk

写出到AWR负载库的ASH信息记录在AWR的基础表wrhactive_session_hist中,wrhactive_session_hist是一个分区表,Oracle会自动进行数据清理。

wrh$active_session_hist记录的这些历史信息可以通过dba_hist_active_sess_history视图进行聚合查询,通过简化后的图10-9来看一下Oracle以session为起点的一系列用以追踪和诊断的数据库对象。

4.png
图2 一系列用以追踪和诊断的数据库对象

简单总结一下:

  • V$SESSION代表数据库活动的开始,是为源起;
  • V$SESSION_WAIT视图用以实时记录活动session的等待情况,是当前信息;
  • VSESSION_WAIT_HISTORY是对VSESSION_WAIT的简单增强,记录活动SESSION的最近10次等待;
  • V$ACTIVE_SESSION_HISTORY是ASH的核心,用以记录活动session的历史等待信息,每秒采样一次,这部分内容记录在内存中,期望值是记录一个小时的内容;
  • WRH_ACTIVE_SESSION_HISTORY是VACTIVE_SESSION_HISTORY在AWR的存储地,V$ACTIVE_SESSION_HISTORY中记录的信息会被定期(每小时一次)的刷新到负载库中,并缺省保留一个星期用于分析。
  • DBA_HIST_ACTIVE_SESS_HISTORY视图是WRH$_ACTIVE_SESSION_HISTORY视图和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。

可以看到,关于session信息的记录,Oracle从不同的粒度进行了增强,目的只有一个,那就是全面真实地记录、监控和反映数据库的运行状况。

AWR记录的信息还远不止于此,通过系统的自动采样,AWR可以收集数据库运行的各方面统计信息及等待等重要数据,提供给数据库诊断分析使用。当然AWR的信息需要独立存储,在Oracle 10g中,新增的SYSAUX表空间是这类信息的存储地:

SQL> select OCCUPANT_NAME,OCCUPANT_DESC,SCHEMA_NAME,SPACE_USAGE_KBYTES/1024 "MB"
  2  from V$SYSAUX_OCCUPANTS WHERE OCCUPANT_NAME LIKE '%AWR%'
  3  /
OCCUPANT_NAME OCCUPANT_DESC                                    SCHEMA_NAME    MB
------------  ----------------------------------------------   ----------     -----          
SM/AWR    Server Manageability - Automatic Workload Repository   SYS          250.875

在Oracle 10g之前的版本中,类似的功能是由Statspack实现,但是Statspack需要由用户自行安装调度,并且其收集的信息十分有限。我们一直提到的session历史信息Statspack就是无法提供的。AWR大大强化了这部分信息,由于AWR收集的信息十分完备,所以经常被称为“数据库的数据仓库”。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论