内存中记录的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完成,尽量减少日志生成,从而最小化数据库性能影响。

图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为起点的一系列用以追踪和诊断的数据库对象。

图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收集的信息十分完备,所以经常被称为“数据库的数据仓库”。




