(关于Oracle10g AWR使用方法及分析见:http://www.taoyoyo.net/ttt/post/301.html )
一、AWR概述
Oracle 在10g以前的使用的是 Statspack做性能故障诊断的。Oracle Database 10g 提供了一个显著改进的工具:自动工作负载信息库 (AWR)。
Oracle 建议用户用这个取代 Statspack。AWR 实质上是一个 Oracle 的内置工具,和数据库一起安装。
数据库装好后,快照由一个称为 MMON 的新的后台进程及其从进程自动地每小时采集一次(snap)
它采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题。
为了节省空间,采集的数据在 7 天后自动清除。快照频率和保留时间都可以由用户修改。它产生两种类型的输出:文本格式(类似于 Statspack 报表的文本格式但来自于 AWR 信息库)和默认的 HTML 格式(拥有到部分和子部分的所有超链接),从而提供了非常用户友好的报表。
AWR 使用几个表来存储采集的统计数据,所有的表都存储在新的名称为 SYSAUX 的特定表空间中的 SYS 模式下,并且以 WRM$_* 和 WRH$_* 的格式命名,H 代表“历史数据 (historical)”而 M 代表“元数据 (metadata)”。
前一种类型(WRM$_*)存储元数据信息(如检查的数据库和采集的快照),
后一种类型(WRH$_*)保存实际采集的统计数据。
在这些表上构建了几种带前缀 DBA_HIST_ 的视图,这些视图可以用来编写您自己的性能诊断工具。
视图的名称直接与表相关;例如,视图 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上构建的。
select t.view_name from dba_views t where t.view_name like ^DBA_HIST%^
AWR 历史表采集的信息比 Statspack 多许多,这些信息包括表空间使用率、文件系统使用率、甚至操作系统统计数据。这些表的完整的列表可以从数据字典中看到。
Version 10.2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
===
二,认识 ASH (Active Session History)
2.1 ASH (Active Session History) 体系结构
在Oracle10g之前,当前会话记录保存在v$session中;处于等待状态的会话会被复制一份放在v$session_wait中。当该连接断开后,其原来的连接信息在v$session和v$session_wait中就会被删除。没有视图能提供有关session在历史上的每个时间点上都在做什么,以及在等待什么资源。原来的v$session及v$session_wait只是显示当前session正在执行什么SQL及等待什么资源。
从Oracle10g开始,Oracle提供了Active Session History (ASH)来解决这个问题。 每隔1秒钟ASH都会将当前活动的session的信息记录在SGA的一个缓冲区(循环使用)中。在ASH中,这个过程称为采样(Sampling)。ASH缺省每一秒收集一下v$session中活动会话的情况,记录会话等待的事件,不活动的会话不会被采样, 间隔时间由 _ash_sampling_interval 参数确定 .
在10g中新出现了一个视图:v$session_wait_history。这个视图保存了每个活动session在v$session_wait中最近10次的等待事件. 但这对于一段时期内的数据性能状况的监测是远远不够的,为了解决这个问题,在10g中还新添加了一个视图:v$active_session_history。这就是ASH(active session history)。
2.2 ASH采用的策略 ---
典型的情况下,为了诊断当前数据库的状态,需要最近的五到十分钟的详细信息。然而,由于记录session的活动信息是很费时间和空间的,ASH采用的策略是: 保存处于等待状态的活动session的信息,每秒从v$session_wait及v$session中采样一次,并将采样信息保存在内存中(注意:ASH的采样数据是保存在内存中)。
2.3 ASH的工作原理 ---
对于Active Session的采样(每秒收集相关视图中的信息)数据存放在SGA中,SGA中分配给ASH的大小可以从v$sgastat中查询(Shared Pool下ASH buffers),该空间可以循环使用,如果需要,以前的信息可以被新的信息覆盖。要把所有session的所有活动记录下来是非常消耗资源的。因此ASH只能从V$SESSION 等少数相关视图中获取那些活动的session的信息。ASH每隔1秒收集session信息时,不是通过SQL语句完成的,而是采用直接访问内存的方式,相对更高效。
因为每秒需要采样数据,所以ASH缓存里数据量非常大,将他们全部刷新到磁盘上的话,会非常消耗磁盘空间,因此在将ASH缓存中的数据刷新到AWR相关表中的时候, 采取以下策略:
1. MMON 默认每隔60分钟 (可以调整) 将ash buffers 中的数据的1/10 flush到磁盘 。
2. MMNL 默认当ash buffers 满 66% 的时候将ash buffers 中的 1/10 的数据写入磁盘 (具体1/10是哪些数据,遵循FIFO原则) 。
3. MMNL 写入的采用数据百分比 10% 表示的是写入磁盘的数据占 ash buffers 中采样数据量的百分比 (而不是占ash buffers 总大小的比例)
4. 为了节省空间,AWR中采集的数据默认在7天后自动清除。
具体参考隐含参数:
_ash_sampling_interval:每秒钟采样一次
_ash_size:定义的ASH Buffer最小值,默认为1M
_ash_enable:启用ASH采样
_ash_disk_write_enable:将采样数据写入磁盘
_ash_disk_filter_ratio:写入磁盘的采样数据占ASH buffer里总采样数据的百分比,默认10%
_ash_eflush_trigger:ASH buffer满了多少以后会写出,默认66%
_ash_sample_all:如果设置为TRUE,则所有会话都会被采样,包括那些处于空闲等待的会话。默认是FALSE。
ASH缓存是SGA中一个固定大小的区域,每个CPU对应2M空间。ASH缓存最大不能超过shared pool的
5% 或者是 sga_target 的2% 。
ASH buffers中的数据查询: v$active_session_history
ASH buffers中的数据刷新到表: wrh$_active_session_history
上表相关视图 : dba_hist_active_sess_history
2.4 访问ASH ---
通过v$active_session_history视图可以获取相关数据,也可以通过此视图获得
一些性能方面的信息 。
-----------
采样信息
-----------
SAMPLE_ID 取样ID
SAMPLE_TIME 取样时间
IS_AWR_SAMPLE 是否是AWR采样数据,基本是1/10数据
----------------------
唯一标识session的信息
----------------------
SESSION_ID 对应 V$SESSION下的SID
SESSION_SERIAL# 唯一标识一个session的objects
SESSION_TYPE 表示是后台还是前台程序FOREGROUND/BACKGROUND
USER_ID Oracle user identifier; maps to V$SESSION.USER#
SERVICE_HASH Hash that identifies the Service; maps to V$ACTIVE_SERVICES.NAME_HASH
PROGRAM 操作程序
MODULE 操作程序对应的软件及版本
ACTION
CLIENT_ID Client identifier of the session
----------------------
session执行的SQL语句信息
----------------------
SQL_ID 在取样时正在执行的SQL的ID
SQL_CHILD_NUMBER 在取样时正在执行的SQL的子游标Number
SQL_PLAN_HASH_VALUE SQL计划hash值
SQL_OPCODE 指出SQL语句处于哪个阶段的操作 对应V$SESSION.COMMAND
QC_SESSION_ID
QC_INSTANCE_ID
----------------------
session等待状态
----------------------
SESSION_STATE session状态WAITING/ON CPU
WAIT_TIME
----------------------
session等待事件信息
----------------------
EVENT
EVENT_ID
EVENT#
SEQ#
P1
P2
P3
TIME_WAITED
----------------------
session等待的对象信息
----------------------
CURRENT_OBJ#
CURRENT_FILE#
CURRENT_BLOCK#
===
三、AWR (Automatic Workload Repository)
ASH的采样数据是保存在内存中。而分配给ASH的内存空间是有限的,当所分配空间占满后,旧的记录就会被覆盖掉;而且数据库重启后,所有的这些ASH信息都会消失。
这样,对于长期检测oracle的性能是不可能的。在Oracle10g中,提供了永久保留ASH信息的方法,这就是AWR(automatic workload repository)。Oracle建议用AWR取代Statspack (10gR2中还是保留了statspack).
3.1 ASH到AWR
ASH到AWR的过程可以用下面图标简单描述:
v$session --> v$session_wait --> v$session_wait_history(其实没有这一步)--> v$active_session_history (ASH) --> wrh$_active_session_history (AWR)--> dba_hist_active_sess_history
v$session代表数据库活动的开始,是为源起;
v$session_wait视图用以实时记录活动session的等待情况,是当前信息;
v$session_wait_history是对v$session_wait的简单增强,记录活动session的最近10次等待;
v$active_session_history是ASH的核心,用以记录活动session的历史等待信息,每秒采样1次,这部分内容记录在内存中,期望值是记录1个小时的内容;
wrh$_active_session_history是v$active_session_history在AWR的存储池,
v$active_session_history中记录的信息会被定期(每小时1次)地刷新到负载库中,并缺省保留一个星期用于分析;
dba_hist_active_sess_history视图是wrh$_active_session_history视图和其他几个视图的联合展现,我们通常通过这个视图进行历史数据的访问。
上面有谈到ASH通过MMON,MMNL后台进程默认每隔1个小时从ASH Buffers中采样一次数据,那么采集来的这些数据存储在哪里呢 ?
AWR用多个表来存储采集的性能统计数据,表都存储在SYSAUX表空间中SYS用户下,并且以WRM$_*和 WRH$_*,WRI$_*, WRR$_* 的格式命名。AWR的历史数据主要存储在基础表wrh$_active_session_history
(分区表).
WRM$_* 类型存储AWR的元数据信息(如检查的数据库和采集的快照),M代表metadata
WRH$_* 类型保存采样快照的历史统计数据。H代表“历史数据”
WRI$_* 类型表示存储数据库建议功能(advisor)相关的数据
WRR$_* 代表的是11g新功能Workload Capture以及Workload Replay相关信息
在这些表上构建了几种带前缀DBA_HIST_ 的视图,这些视图可以用来编写您自己的性能诊断工具。视图的名称直接与表相关;例如,视图 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上构建的。
注意: ASH保存了系统最新的处于等待的会话记录,可以用来诊断数据库的当前状态;而AWR中的信息最长可能有1小时的延迟(虽然可以手工调整),所以其采样信息并不能用于诊断数据库的当前状态,但可以用来作为一段时期内数据库性能调整的参考。
3.2 设置 AWR
要使用AWR必须设置STATISTICS_LEVEL参数,共有三个值:BASIC,TYPICAL,ALL。
A. typical -- 默认值,启用所有的自动化功能,并会为此收集数据库里所需要的相关信息。收集的信息包括: Buffer Cache Advice, MTTR Advice,TimedStatistics, Segment Level Statistics , PGA Advice .....等等,可以通过 select statistics_name , activation_level from v$statistics_level order by 2; 来查询收集的信息 。 Oracle建议使用默认值typical 。
B. all -- 如果设置为all, 那么除了typical之外,还会收集额外的信息,包括plan execution statistics 和Timed OS statistics(参考A中的SQL查询语句). 在该设置下,可能为了收集诊断信息而消耗过多服务器资源。
C. basic -- 关闭所有自动化功能。
3.3 AWR相关:数据,收集及管理
3.3.1 数据
其实AWR记录的信息不仅是ASH,还可以收集到数据库运行的各方面统计信息和等待信息,用以诊断分析。
AWR的采样方式是,以固定的时间间隔为其所有重要的统计信息和负载信息执行一次采样,并将采样信息保存在AWR中。可以这样说:ASH中的信息被保存到了AWR中的视图wrh$_active_session_history中。ASH是AWR的真子集。
这些采样数据都存储在SYSAUX表空间中, 当SYSAUX表空间满后,AWR将自动覆盖掉旧的信息,并在警告日志中记录一条相关信息:
ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_3533490838_1522 by 128 in tablespace SYSAUX
3.3.2 收集及管理
AWR永久地保存系统的性能诊断信息,由SYS用户拥有。一段时间后,你可能想清除掉这些信息;有时候为了性能诊断,你可能需要自己定义采样频率来获取系统快照信息。
Oracle 10g在包dbms_workload_repository中提供了很多过程,通过这些过程,你可以管理快照并设定基线等。
通过修改retention参数可以修改awr信息的保留期限。默认的是七天,最小的值是一天。
如果把retention设置为零,自动清除就关闭了.如果awr发现sysaux空间不够,它通过删除那些最老部分的快照来重新使用这些空间.同时, 也会给dba发一条警告,告诉sysaux空间不够了(在alert log中).通过修改interval参数可以修改awr信息的采样频率。最小的值是10分钟,默认的是60分钟.典型的值是10,20,30,60,120等等。
把interval设为0则关闭
自动捕捉快照.如将收集间隔时间改为30 分钟一次。并且保留5天时间(注:单位都是为分钟)
MMON收集快照的频率(每小时)和采集的数据保留时间(7天)都可以由用户修改。
查看: select * from dba_hist_wr_control;
例如: 修改为收集快照频率20分钟,保留数据2天:
begin
dbms_workload_repository.modify_snapshot_settings(interval=> 20,
retention => 2 * 24 * 60);
end;
===
四、RAC环境中的AWR
在rac环境,每个快照包含集群的所有的节点(因为存储在共享的数据库中,不是在每个实例).每个节点的快照数据有相同的snap_id, 但靠实例id来区分。一般地,rac中的快照是在同一时间捕捉的。
你也可以使用database control来进行手工的快照。手工的快照支持系统产生的自动快照。
===
五、ADDM
自动数据库诊断监控: ADDM的引入有了这个AWR这个“数据仓库”之后,Oracle自然可以在此基础之上实现更高级别的智能应用,更大程度地发挥AWR的信用,这就是Oracle 10g引入的另外一个功能自动数据库诊断监控程序(Automatic Database Diagnostic Monitor,ADDM),通过ADDM,Oracle试图使数据库的维护、管理和优化工作变得更加自动和简单。
ADDM可以定期检查数据库的状态,根据内建的专家系统,自动确定潜在的数据库性能瓶颈,并提供调整措施和建议。由于这一切都是内建在Oracle数据库系统之内的,其执行效率很高,几乎不影响数据库的总体性能。 新版的Database Control可以以一种方便直观的形式提供ADDM的结果和建议,并引导管理员逐步实施ADDM的建议,快速解决性能问题。
【版權聲明】
本文爲原創,遵循CC 4.0 BY-SA版權協議!轉載時請附上原文鏈接及本聲明。
原文鏈接:https://tdlib.com/am.php?t=YZ49FRXoFgj9 Tag: Oracle Oracle优化 AWR TTTBLOG