AWR 生成报表
AWR介绍
AWR(Automatic Workload Repository)是Oracle Database 10g 提供的一个新的工具,用来采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题(10g之前使用的是Statspack)。
AWR生成的快照由MMON后台进程及其从进程自动地每小时采集一次。为了节省空间,采集的数据在 7 天后自动清除。快照频率和保留时间都可以由用户修改。它产生两种类型的输出:文本格式(类似于 Statspack 报表的文本格式但来自于AWR信息库)和默认的 HTML 格式(拥有到部分和子部分的所有超链接),从而提供了非常用户友好的报表。
AWR 使用几个表来存储采集的统计数据,所有的表都存储在新的名称为SYSAUX的特定表空间中的SYS模式下,并且以WRM$_*和WRH$_*的格式命名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。H代表“历史数据 (historical)”而M代表“元数据 (metadata)”。
在这些表上构建了几种带前缀 DBA_HIST_ 的视图,这些视图可以用来编写您自己的性能诊断工具。视图的名称直接与表相关;例如,视图DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上构建的。
AWR 的使用
启用AWR
在默认情况下,Oracle启用数据库统计收集这项功能(即启用AWR)。是否启用AWR由初始化参数STATISTICS_LEVEL控制。通过SHOW PARAMETER命令可以显示STATISTICS_LEVEL的当前值:
SQL> show parameter statistics_level
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
statistics_level string TYPICAL
AWR的行为受到参数STATISTICS_LEVEL的影响。这个参数有三个值:
*BASIC:awr统计的计算和衍生值关闭.只收集少量的数据库统计信息。
*TYPICAL:默认值.只有部分的统计收集.他们代表需要的典型监控oracle数据库的行为。
*ALL : 所有可能的统计都被捕捉,并且有操作系统的一些信息,这个级别的捕捉应该在很少的情况下,比如你要更多的sql诊断信息的时候才使用。
注意:
statistics_level 默认是typical,在10g中表监控是激活的,强烈建议在10g中此参数的值是typical。如果STATISTICS_LEVEL设置为basic,不仅不能监控表,而且将禁掉一些10g的新功能ASH(Active Session History)、ASSM(Automatic Shared Memory Management)、AWR(Automatic Workload Repository)、ADDM(Automatic Database Diagnostic Monitor)。
查看快照的频率和保留时间,默认为每1小时采样一次,采样信息保留时间为7天
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------- -------------------- ----------
870750245 +00000 01:00:00.0 +00007 00:00:00.0 DEFAULT
1370299695 +00000 01:00:00.0 +00007 00:00:00.0 DEFAULT
SQL> select dbid,snap_interval,snapint_num,retention from wrm$_wr_control;
DBID SNAP_INTERVAL SNAPINT_NUM RETENTION
---------- -------------------- ----------- --------------------
870750245 +00000 01:00:00.0 3600 +00007 00:00:00.0
1370299695 +00000 01:00:00.0 3600 +00007 00:00:00.0
修改快照的频率和保留时间
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>60,retention=>7*24*60);
PL/SQL procedure successfully completed.
手工取样生成快照
SQL> begin
2 dbms_workload_repository.create_snapshot();
3 end;
4 /
PL/SQL procedure successfully completed.
通过dba_hist_snapshot可以查找产生的快照
1 select
2 snap_id,
3 dbid,
4 to_char(startup_time,'yy-mm-dd hh24:mi:ss') db_start_time,
5 to_char(begin_interval_time,'yy-mm-dd hh24:mi:ss') interval_start,
6 to_char(end_interval_time,'yy-mm-dd hh24:mi:ss') interval_end
7 from dba_hist_snapshot
8* where end_interval_time > (sysdate - 60/1440)
SQL> /
SNAP_ID DBID DB_START_TIME INTERVAL_START INTERVAL_END
---------- ---------- ----------------- ----------------- -----------------
154 870750245 14-07-17 09:07:05 14-07-17 14:07:00 14-07-17 15:07:00
155 870750245 14-07-17 09:07:05 14-07-17 15:07:00 14-07-17 15:07:39
2 rows selected.
wrh$_active_session_history和dba_hist_active_sess_history记录着更加详细的信息
SQL> select count(*) from wrh$_active_session_history;
COUNT(*)
----------
1198
SQL> select count(*) from dba_hist_active_sess_history;
COUNT(*)
----------
472
删除指定范围内的快照,此处把生成的snap_id为154和155快照删除
SQL> begin
2 dbms_workload_repository.drop_snapshot_range(low_snap_id=>154,high_snap_id=>155,dbid=>870750245);
3 end;
4 /
SQL> select
2 snap_id,
3 dbid,
4 to_char(startup_time,'yy-mm-dd hh24:mi:ss') db_start_time,
5 to_char(begin_interval_time,'yy-mm-dd hh24:mi:ss') interval_start,
6 to_char(end_interval_time,'yy-mm-dd hh24:mi:ss') interval_end
7 from dba_hist_snapshot
8 where end_interval_time > (sysdate - 60/1440)
9 /
no rows selected
获取采样数据存放位置
采样数据都存储在SYSAUX表空间中,并且以WRM$_*和WRH$_*的格式命名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。当SYSAUX表空间满后,AWR将自动覆盖掉旧的信息,并在警告日志中记录一条相关信息。
SQL> select table_name from dba_tables where table_name like 'WRM$_%';
TABLE_NAME
------------------------------
WRM$_WR_CONTROL
WRM$_SNAP_ERROR
WRM$_SNAPSHOT
WRM$_DATABASE_INSTANCE
WRM$_BASELINE
5 rows selected.
基线(baseline)是一种机制,这样你可以在重要时间的快照信息集做标记。一个基线定义在一对快照之间,快照通过他们的快照序列号识别。每个基线有且只有一对快照。一次典型的性能调整实践从采集量度的基准线集合、作出改动、然后采集另一个基准线集合开始。可以比较这两个集合来检查所作的改动的效果。在 AWR 中,对现有的已采集的快照可以执行相同类型的比较。
比如五分钟前对一个SQL进行了优化,想看一下优化后的效果,期间我做了三次快照:
1 select
2 snap_id,
3 dbid,
4 to_char(startup_time,'yy-mm-dd hh24:mi:ss') db_start_time,
5 to_char(begin_interval_time,'yy-mm-dd hh24:mi:ss') interval_start,
6 to_char(end_interval_time,'yy-mm-dd hh24:mi:ss') interval_end
7 from dba_hist_snapshot
8* where end_interval_time > (sysdate - 5/1440)
SQL> /
SNAP_ID DBID DB_START_TIME INTERVAL_START INTERVAL_END
---------- ---------- ----------------- ----------------- -----------------
161 870750245 14-07-17 09:05:11 14-07-17 16:14:24 14-07-17 16:15:35
162 870750245 14-07-17 09:05:11 14-07-17 16:15:35 14-07-17 16:17:41
160 870750245 14-07-17 09:05:11 14-07-17 16:11:22 14-07-17 16:14:24
SQL优化时间如果是在16:14开始,我们不妨在16:14之前(即id在159-160之间)设置一个基线sql_adjust_begin:
SQL> exec dbms_workload_repository.create_baseline(159,160,'sql_adjust_begin');
PL/SQL procedure successfully completed.
如果SQL优化时间在16:15就结束,那再在结束后找个时间设置一个基线sql_adjust_end,这样,就可以通过对比两个基线相关的快照,来确定优化的效果。
SQL> exec dbms_workload_repository.create_baseline(161,162,'sql_adjust_end');
PL/SQL procedure successfully completed.
查看基线信息
SQL> select * from wrm$_baseline;
DBID BASELINE_ID BASELINE_NAME START_SNAP_ID END_SNAP_ID
---------- ----------- -------------------- ------------- -----------
870750245 1 sql_adjust_begin 159 160
870750245 2 sql_adjust_end 161 162
dba_hist_baseline中也记录着基线的信息
SQL> desc dba_hist_baseline;
Name Null? Type
----------------------------------------- -------- ----------------------------
DBID NOT NULL NUMBER
BASELINE_ID NOT NULL NUMBER
BASELINE_NAME VARCHAR2(64)
START_SNAP_ID NUMBER
START_SNAP_TIME TIMESTAMP(3)
END_SNAP_ID NUMBER
END_SNAP_TIME TIMESTAMP(3)
删除基线
分析之后使用drop_baseline()来删除基准线;快照将保留(也可级联删除)。此外,当清除例程开始删除旧的快照时,与基准线相关的快照不会被清除,从而允许进行进一步的分析。
SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'sql_adjust_begin',cascade=>false);
PL/SQL procedure successfully completed.
如果cascade设置成true将连通快照一起删除
SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'sql_adjust_end',cascade=>true);
PL/SQL procedure successfully completed.
1 select
2 snap_id,
3 dbid,
4 to_char(startup_time,'yy-mm-dd hh24:mi:ss') db_start_time,
5 to_char(begin_interval_time,'yy-mm-dd hh24:mi:ss') interval_start,
6 to_char(end_interval_time,'yy-mm-dd hh24:mi:ss') interval_end
7 from dba_hist_snapshot
8* where snap_id > 155
SQL> /
SNAP_ID DBID DB_START_TIME INTERVAL_START INTERVAL_END
---------- ------------ ----------------- ----------------- -----------------
156 870750245 14-07-17 09:05:11 14-07-17 15:39:01 14-07-17 16:10:01
157 870750245 14-07-17 09:05:11 14-07-17 16:10:01 14-07-17 16:10:12
158 870750245 14-07-17 09:05:11 14-07-17 16:10:12 14-07-17 16:11:14
159 870750245 14-07-17 09:05:11 14-07-17 16:11:14 14-07-17 16:11:22
160 870750245 14-07-17 09:05:11 14-07-17 16:11:22 14-07-17 16:14:24
5 rows selected.
此时有关基线sql_adjust_end的连个快照161和162已经被删除
产生AWR报告
AWR报告其实就是一张数据库健康体检表,它显示了数据库健康的各项指标。Oracle可以产生两种类型的AWR报告:文本格式和HTML 格式。HTML格式的报告更受欢迎。
AWR报告也分很多种,有针对整个数据库的AWR报告,有针对某个实例的AWR报告(在集群环境),有针对单条SQL语句的AWR报告。通过运行Oracle自带的SQL脚本产生AWR报告,只是产生不同的AWR报告,需要运行不同的脚本。
比如生成整库的报告需要执行awrrpt.sql 脚本
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
870750245 ORCL_DUP 1 orcl_dup
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
Enter value for report_type: html //此处输入报告的类型
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
------------ -------- ------------ ------------ ------------
1370299695 1 ORCL orcl localhost.lo
caldomain
* 870750245 1 ORCL_DUP orcl_dup localhost.lo
caldomain
* 870750245 1 ORCL_DUP orcl_dup node1
Using 870750245 for database Id
Using 1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing without
specifying a number lists all completed snapshots.
Enter value for num_days: 1 //设置分析的报告时间范围
Listing the last day's Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level
------------ ------------ --------- ------------------ -----
orcl_dup ORCL_DUP 146 17 Jul 2014 09:15 1
147 17 Jul 2014 10:00 1
148 17 Jul 2014 10:52 1
149 17 Jul 2014 11:13 1
150 17 Jul 2014 11:16 1
151 17 Jul 2014 12:00 1
152 17 Jul 2014 13:00 1
153 17 Jul 2014 14:00 1
156 17 Jul 2014 16:10 1
157 17 Jul 2014 16:10 1
158 17 Jul 2014 16:11 1
159 17 Jul 2014 16:11 1
160 17 Jul 2014 16:14 1
163 17 Jul 2014 17:00 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 153 //选择开始的snap序号
Begin Snapshot Id specified: 153
Enter value for end_snap: 156 //选择结束快照序号
End Snapshot Id specified: 156
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrrpt_1_153_156.html. To use this name,
press to continue, otherwise enter an alternative.
Enter value for report_name:
Enter value for report_name: awr_report_2014-07-17_153-156_01.rep //报告名
会在当前路径下生成报表,将报表用浏览器打开即可
[oracle@node1 ~]$ ls
afiedt.buf awr_report_2014-07-17_153-156_01.rep
生成其他的AWR报告执行不同的脚本即可:
awrrpt.sql :生成指定快照区间的统计报表;
awrrpti.sql :生成指定数据库实例,并且指定快照区间的统计报表;
awrsqlrpt.sql :生成指定快照区间,指定SQL语句(实际指定的是该语句的SQLID)的统计报表;
awrsqrpi.sql :生成指定数据库实例,指定快照区间的指定SQL语句的统计报表;
awrddrpt.sql :指定两个不同的时间周期,生成这两个周期的统计对比报表;
awrddrpi.sql :指定数据库实例,并指定两个的不同时间周期,生成这两个周期的统计对比报表;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29320885/viewspace-1221355/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29320885/viewspace-1221355/