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

AWR 报告深度解读:AWR的原理和基本功能

原创 eygle 2019-08-28
15138

为了系统化的梳理 AWR 的知识体系,我们整理了一个系列文章,希望从原理、使用到 AWR 报告的解读,给读者展示全面的 AWR 知识体系,本文是这个系列文章的开篇。


自动负载信息库(Automatic Workload Repository,AWR)是在Oracle 10g中被引入的,缺省地被安装到Oracle10g数据库中,用于收集关于该特定数据库的操作统计信息和其他统计信息。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完成,尽量减少日志生成,从而最小化数据库性能影响。


通过下图,可以直观地理解ASH与AWR的关系。

 

1.png


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的基础表wrh$active_session_hist中,wrh$active_session_hist是一个分区表,Oracle会自动进行数据清理。


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

 

2.png

一系列用以追踪和诊断的数据库对象


简单总结一下:


· 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表空间是这类信息的存储地:

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


AWR信息的修改


缺省的,数据库每小时采样一次AWR数据,保留7天,这些定义是可以被修改的。DBA可以通过DBMS_WORKLOAD_REPOSITORY包来控制AWR的行为。


通过如下执行可以手工创建AWR采样点,在进行测试时,在测试前后进行手工采样可以帮助我们获得完善的测试性能数据:

SQL> exec dbms_workload_repository.create_snapshot();
PL/SQL procedure successfully completed.


创建的采样点,可以通过DBA_HIST_SNAPSHOT视图来查询。


除了手工创建采样点之外,数据库也允许我们手工删除采样点,这可以通过DBMS_WORKLOAD_REPOSITORY 包中的DROP_SNAPSHOT_RANGE过程来实现,该过程需要一个采样范围输入,然后删除指定范围内的AWR采样信息:

SQL> select snap_id from DBA_HIST_SNAPSHOT where rownum < 6;
SNAP_ID
----------
      3860
      3886
      3887
      3888
      3889
SQL> exec dbms_workload_repository.drop_snapshot_range(low_snap_id=>3860,high_snap_id=>3889);
PL/SQL procedure successfully completed.
SQL> select snap_id from DBA_HIST_SNAPSHOT where rownum < 6;
   SNAP_ID
----------
      3890
      3891
      3892
      3893
      3894


通过MODIFY_SNAPSHOT_SETTINGS 过程,还可以调整包括快照采样频率、快照保存时间、以及捕获的SQL 数量等信息。MODIFY_SNAPSHOT_SETTINGS 主要包含三个输入参数:

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


其含义分别如下:


· Retention:设置快照保存的时间,单位是分钟,最小值为1 天,最大值为100年。如果该参数值设置为0 ,则表示永久保留快照信息。

· Interval:设置快照的收集频率,以分钟为单位,最小值为10 分钟,最大值为1 年。如果设置该参数值为0,就表示禁用AWR 特性。

· Topnsql:有两种方式指定该参数,如果给定值为NUMBER,则其含义为收集比较占用资源的SQL 数量,最小值为30,最大不超过100000000,这个设置会覆盖系统的statistics/flush 级别设置;如果这个参数设置为VARCHAR2,则允许的定义有: DEFAULT, MAXIMUM, N,这里的N同样指采样的Top SQL数量,DEFAULT参数受statistics level 影响,在TYPICAL设置下,采样Top 30,在ALL设置下采样Top 100 ,如果定义MAXIMUM 将引起系统采样和捕获所有的SQL。


如,修改采样间隔:

SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>120);
PL/SQL procedure successfully completed.
SQL> select * from dba_hist_wr_control;
      DBID SNAP_INTERVAL                  RETENTION            TOPNSQL
---------- ------------------------------ -------------------- ----------
2310943069 +00000 02:00:00.0              +00007 00:00:00.0    DEFAULT


同时修改采样间隔为30分钟,保留周期15天(时间以分钟计算):

SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>15*24*60);
PL/SQL procedure successfully completed.


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会要求我们指定报告类型:


SQL> @?/rdbms/admin/awrrpt
Current Instance
~~~~~~~~~~~~~~~~
   DB Id    DB Name      Inst Num Instance
----------- ------------ -------- ------------
 3243092624 SMSBOSS             1 smsboss
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: text
Type Specified:  text


定义文件格式之后,数据库会要求输入报告包含采样的时间段:

Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
* 3243092624        1 SMSBOSS      smsboss      db480-6
Using 3243092624 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 <return> without
specifying a number lists all completed snapshots.
Enter value for num_days: 2


如果定义为2天之内,则2天之内的采样都会被列出供用户选择:

Listing the last 2 days of Completed Snapshots
                                                        Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
smsboss      SMSBOSS          10735 15 Mar 2007 00:01      1
                              10736 15 Mar 2007 01:00      1
                              10737 15 Mar 2007 02:00      1
                              10738 15 Mar 2007 03:00      1
。。。。。。。。。。
                              10750 15 Mar 2007 15:00      1
                              10751 15 Mar 2007 16:00      1
                              10752 15 Mar 2007 17:00      1
                              10753 15 Mar 2007 18:00      1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 10735
Begin Snapshot Id specified: 10735
Enter value for end_snap: 10750
End   Snapshot Id specified: 10750


完成类似问题的回答后,报告生成。


awrrpt.sql脚本实际上是调用DBMS_WORKLOAD_REPOSITORY包来生成报表,这个包中主要有两个函数用于生成报表:


DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT用于生成TEXT格式报表;

DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML用于生成HTML格式报表。


例如,以下命令将和之前的定义等价:

select * from
table(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(3243092624,1,10735,10756));


AWR比较报告的生成


除了常规的AWR报告,Oracle还支持生成AWR比较报告,该报告可以对两个时段进行比较,生成详细的对比报告,提供比较分析,非常有助于问题的发现和解决。

生成对比报告,可以调用$ORACLE_HOME/rdbms/admin/awrddrpt.sql脚本实现,在OEM中可以更直观的看到这个过程,下图在操作中选择“比较时段”:

 

3.png

图:选择比较时段,生成比较报告


按照提示操作,选择两个时段,即可生成一个比较报告:

 

4.png

图:比较报告的两个时段


生成的比较报告可以清晰的看到不同日期数据库的性能对比,以下报告显示,第一个时段DB Time为43.8分钟,第二个时段数据库的DB Time高达885.31分钟,同样是一个小时,数据库的性能存在巨大的差异:

 

5.png


在负载概要部分,更详细的对比显示,两个时段的Logical Reads有显著的不同,进一步分析SQL列表,就可以找到引起过高逻辑读的SQL语句:

 

在数据库性能调整前后,生成对比报告,是显示调整效果的最佳手段之一。


Baseline - 基线

在创建数据库比较报告时,通常选择两个时段的采样进行比较,而如果我们能够创建基于正常运行的数据库快照,在发生性能问题时,就可以将异常与正常情况进行比较,获得差异对比信息。基线-BaseLine说的就是这个含义。


创建Baseline 时,需要指定一个采样范围,指点范围中的快照会被保存下来,不会因为过期而被删除,创建Baseline 可以使用CREATE_BASELINE 过程,执行该过程时分别指定开始和结束的snap_id,然后为该baseline 定义一个名称即可,例如:


1 SQL> BEGIN
  2   DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id =>3890,
  3   end_snap_id => 3894,
  4   baseline_name => 'baseline01');
  5  END;
  6  /
PL/SQL procedure successfully completed.
SQL> col baseline_name for a30
SQL> select dbid,baseline_name,start_snap_id,end_snap_id from dba_hist_baseline;
      DBID BASELINE_NAME                  START_SNAP_ID END_SNAP_ID
---------- ------------------------------ ------------- -----------
2310943069 baseline01                              3890        3894


使用DROP_BASELINE 过程删除Baseline信息,删除时可以通过cascade 参数选择是否将其关联的Snapshots 级联进行删除,下例选择了级联删除,例如:


SQL> BEGIN
  2   DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name =>'baseline01',cascade => true);
3  END;
  4  /
PL/SQL procedure successfully completed.


有了基线之后,AWR报告之间的对比就会更加明确和有效。


AWR报告的分析


报告和Statspack的报告极为类似,不过Oracle 10g增加了很多新的内容,我们对新的内容进行一点简单介绍。


首先报告在Top 5 Timed Events后面增加了时间模型部分,根据前面对Statspack的分析可以知道,实际上等待时间也是依据时间模型来建立的,在Oracle 10g中,时间模型被独立出来并进一步细化:


Time Model Statistics             DB/Inst: SMSBOSS/smsboss  Snaps: 10735-10756
-> Total time in database user-calls (DB Time): 24514.6s
-> Statistics including the word "background" measure background process
   time, and so do not contribute to the DB time statistic
-> Ordered by % or DB time desc, Statistic name
Statistic Name                                       Time (s) % of DB Time
------------------------------------------ ------------------ ------------
sql execute elapsed time                             24,813.6        101.2
DB CPU                                               12,885.3         52.6
PL/SQL execution elapsed time                           362.3          1.5
parse time elapsed                                       61.0           .2
connection management call elapsed time                  38.9           .2
hard parse elapsed time                                  19.9           .1
hard parse (sharing criteria) elapsed time                4.3           .0
sequence load elapsed time                                2.0           .0
PL/SQL compilation elapsed time                           1.2           .0
failed parse elapsed time                                 0.2           .0
repeated bind elapsed time                                0.1           .0
hard parse (bind mismatch) elapsed time                   0.1           .0
DB time                                              24,514.6          N/A
background elapsed time                               3,050.2          N/A
background cpu time                                     664.4          N/A
          -------------------------------------------------------------

等待事件通过分类之后,可以被快速汇总,从而显示数据库瓶颈消耗在哪一类资源上:

Wait Class                        DB/Inst: SMSBOSS/smsboss  Snaps: 10735-10756
-> s  - second
-> cs - centisecond -     100th of a second
-> ms - millisecond -    1000th of a second
-> us - microsecond - 1000000th of a second
-> ordered by wait time desc, waits desc
                                                                  Avg
                                      %Time       Total Wait    wait     Waits
Wait Class                      Waits  -outs         Time (s)    (ms)      /txn
-------------------- ---------------- ------ ---------------- ------- ---------
User I/O                    2,435,546     .0            6,996       3       1.4
System I/O                    786,339     .0            2,398       3       0.4
Configuration                   1,800   37.3              217     121       0.0
Commit                         13,264     .0              124       9       0.0
Network                       828,998     .0               80       0       0.5
Concurrency                     1,092     .0               74      68       0.0
Other                          85,958     .0               10       0       0.0
Application                     8,484     .0                9       1       0.0
         -------------------------------------------------------------


对于这个数据库,显然主要的等待都消耗在IO上,那么调整SQL、优化IO实际上应该是优化这个系统的主要目标。


更进一步地,Oracle将操作系统的统计信息也收集计算进来,这部分信息非常重要(以前的Statspack中是不包含这部分信息的),包括了CPU的繁忙程度、IO等待情况、内存总量、CPU数量等信息,这些信息对于评价数据库的并发性能、事务处理能力等都非常重要:

Operating System Statistics       DB/Inst: SMSBOSS/smsboss  Snaps: 10735-10756
Statistic                                       Total
-------------------------------- --------------------
AVG_BUSY_TIME                                 627,108
AVG_IDLE_TIME                               6,927,000
AVG_IOWAIT_TIME                               291,066
AVG_SYS_TIME                                  155,566
AVG_USER_TIME                                 470,269
BUSY_TIME                                   1,256,735
IDLE_TIME                                  13,856,519
IOWAIT_TIME                                   584,638
SYS_TIME                                      313,671
USER_TIME                                     943,064
LOAD                                                0
OS_CPU_WAIT_TIME                              106,200
RSRC_MGR_CPU_WAIT_TIME                              0
VM_IN_BYTES                                    57,344
VM_OUT_BYTES                                        0
PHYSICAL_MEMORY_BYTES                   4,165,320,704
NUM_CPUS                                            2
          -------------------------------------------------------------

在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等待,对于协助诊断分析数据库具有极大的参考意义。


下图是这一新增量度的范例:

 

7.png


更为有趣的是,如果我们将Oracle 10g的AWR数据导入到Oracle 11gR2中,就能够在生成AWR报告中利用这一新特性。


通过EM生成AWR报告


通过Oracle 10g基于Web方式的强大EM功能,我们可以很容易地进行AWR报告的创建查看以及分析等操作。


如下图所示,在EM管理选项中有一项称为“自动工作量资料档案库”,这就是配置和管理AWR信息的地方。

 

8.png

EM管理选项


单击该链接,可以进入编辑管理页面,如图10-11所示,在这里可以根据需要调整快照的保留时间和收集间隔等信息。

 

9.png

自动工作量资料档案库编辑页面


如果要查看和管理快照,可以单击快照具体数值中的链接,进入详细页面,该详细页面会列出系统中记录的采样点,首先选择一个快照作为AWR报告的起始点,然后在下拉菜单中选择“查看报告”,单击“开始”按钮,如下图所示。


10.png

查看报告


下一步进入选择结束采样点页面,如下图所示。

 

11.png

选择结束快照


单击“确定”按钮,数据库即开始生成AWR报告,如下图所示。

 

12.png

正在创建报告


此后生成的报告和通过脚本生成的报告内容是一致的,不过是通过Web形式展现出来(当然也可以转存为本地HTML格式的报告),如下图所示。

 

13.png

生成的AWR报告


AWR数据的导出导入


在进行采样数据分析时,经常涉及到跨数据库的迁移,对于Statspack的采样数据,可以通过spuexp.sql脚本,按照用户模式进行导出。


而AWR的数据相对复杂,不能通过简单的用户模式导出,但是Oracle提供了两个脚本:

awrextr.sql 脚本用于导出;awrload.sql 用户AWR数据的加载;而加载后的数据可以通过awrddrpi.sql来生成报告。也是非常方便高效的。

查看这两个脚本,可以看到其中主要调用了dbms_swrf_internal 包来完成数据的卸载和加载工作。


awrextr.sql的核心内容如下:

begin
  /* call PL/SQL routine to extract the data */
  dbms_swrf_internal.set_awr_dbid(-2);
  dbms_swrf_internal.awr_extract(dmpfile  => :dmpfile,
                                 dmpdir   => :dmpdir,
                                 bid      => :bid,
                                 eid      => :eid,
                                 dbid     => :dbid);
  dbms_swrf_internal.clear_awr_dbid;
end;
/


dbms_swrf_internal.awr_extract过程通过指定相关参数(包括导出文件名、Directory路径名、开始snapid、结束的snapid,dbid)来实现数据转储。


awrload.sql的核心内容如下:

begin
  /* call PL/SQL routine to load the data into the staging schema */
  dbms_swrf_internal.set_awr_dbid(-2);
  dbms_swrf_internal.awr_load(schname  => :schname,
                              dmpfile  => :dmpfile,
                              dmpdir   => :dmpdir);
  dbms_swrf_internal.clear_awr_dbid;
end;
/
begin
  /* call PL/SQL routine to move the data into AWR */
  dbms_swrf_internal.set_awr_dbid(-2);
  dbms_swrf_internal.move_to_awr(schname => :schname);
  dbms_swrf_internal.clear_awr_dbid;
end;
/


这个脚本通过dbms_swrf_internal.awr_load过程向数据库加载数据,其中需要定义一个临时的Schema名称,加载完成之后,再通过dbms_swrf_internal.move_to_awr将数据从临时Schema转移到正式Schema中。


了解这两个脚本的核心内容之后,其使用就一目了然了。


awrextr.sql 脚本非常易用,以下是一个测试输出:

[oracle@dbrac1 admin]$ sqlplus "/ as sysdba" @?/rdbms/admin/awrextr.sql
    SQL*Plus: Release 10.2.0.4.0 - Production on Sun Aug 1 23:39:37 2010
    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Disclaimer: This SQL/Plus script should only be called under
    the guidance of Oracle Support.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


执行的说明注释部分:

~~~~~~~~~~~~~
    AWR EXTRACT
    ~~~~~~~~~~~~~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~  This script will extract the AWR data for a range of snapshots  ~
    ~  into a dump file.  The script will prompt users for the         ~
    ~  following information:                                          ~
    ~     (1) database id                                              ~
    ~     (2) snapshot range to extract                                ~
    ~     (3) name of directory object                                 ~
    ~     (4) name of dump file                                        ~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Databases in this Workload Repository schema
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       DB Id     DB Name      Host
    ------------ ------------ ------------
    * 3368702614 NAPDB        dbrac1
    * 3368702614 NAPDB        dbrac2
    The default database id is the local one: '3368702614'.  To use this
    database id, press <return> to continue, otherwise enter an alternative.
    Enter value for dbid:
    Using 3368702614 for Database ID
    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 <return> without
    specifying a number lists all completed snapshots.
    Enter value for num_days:


列举快照信息:

Listing all Completed Snapshots
    DB Name        Snap Id    Snap Started
    ------------ --------- ------------------
    NAPDB            22492 01 Aug 2010 10:00
                     22493 01 Aug 2010 11:00
                     22494 01 Aug 2010 12:00
                     22495 01 Aug 2010 13:00
                     22496 01 Aug 2010 14:00
                     22497 01 Aug 2010 15:00
                     22498 01 Aug 2010 16:00
                     22499 01 Aug 2010 17:00
                     22500 01 Aug 2010 18:00
                     22501 01 Aug 2010 19:00
                     22502 01 Aug 2010 20:00
                     22503 01 Aug 2010 21:00
                     22504 01 Aug 2010 22:00
                     22505 01 Aug 2010 23:00


定义需要导出的快照范围:

  Specify the Begin and End Snapshot Ids
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Enter value for begin_snap: 22338
    Begin Snapshot Id specified: 22338
    Enter value for end_snap: 22505
    End   Snapshot Id specified: 22505


定义DataPUMP需要的路径:

Specify the Directory Name
    ~~~~~~~~~~~~~~~~~~~~~~~~~~
    Directory Name                 Directory Path
    ------------------------------ -------------------------------------------------
    ADMIN_DIR                      /opt/oracle/product/10.2.0/db/md/admin
    DUMP                           /opt/oracle/backup/
    WORK_DIR                       /opt/oracle/product/10.2.0/db/work
    Choose a Directory Name from the above list (case-sensitive).
    Enter value for directory_name: DUMP
    Using the dump directory: DUMP

定义导出文件的名称:

Specify the Name of the Extract Dump File
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    The prefix for the default dump file name is awrdat_22338_22505.
    To use this name, press <return> to continue, otherwise enter
    an alternative.
    Enter value for file_name:
    Using the dump file prefix: awrdat_22338_22505
    |
    | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |  The AWR extract dump file will be located
    |  in the following directory/file:
    |   /opt/oracle/backup/
    |   awrdat_22338_22505.dmp
    | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


完成所有条件定义之后,AWR开始Extract数据,抽取数据的实质是通过一个Query条件来限制访问的数据:

    |  *** AWR Extract Started ...
    |
    |  This operation will take a few moments. The
    |  progress of the AWR extract operation can be
    |  monitored in the following directory/file:
    |   /opt/oracle/backup/
    |   awrdat_22338_22505.log
    |
    WHERE (dbid, snap_id) IN (SELECT dbid, snap_id FROM SYS.WRM$_SNAPSHOT WHERE DBID = 3368702614 AND SNAP_ID >=
    22338 AND SNAP_ID <= 22505 AND STATUS   = 0 AND BL_MOVED = 1)
    Table List String Length: 2212
    ('WRM$_WR_CONTROL', 'WRM$_DATABASE_INSTANCE', 'WRM$_SNAPSHOT', ....'WRH$_ACTIVE_SESSION_HISTORY_BL')
    Starting "SYS"."SYS_EXPORT_TABLE_01":
    Estimate in progress using BLOCKS method...
    Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
    Total estimation using BLOCKS method: 125.4 MB
    Processing object type TABLE_EXPORT/TABLE/TABLE
    Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
    Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
    Processing object type TABLE_EXPORT/TABLE/COMMENT
    Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
    . . exported "SYS"."WRH$_SQL_PLAN"                       1.425 MB    3969 rows
    . . exported "SYS"."WRH$_WAITCLASSMETRIC_HISTORY"        5.969 MB   88231 rows
......................
    . . exported "SYS"."WRR$_FILTERS"                            0 KB       0 rows
    Master table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
    ******************************************************************************
    Dump file set for SYS.SYS_EXPORT_TABLE_01 is:
    /opt/oracle/backup/awrdat_22338_22505.dmp
    Job "SYS"."SYS_EXPORT_TABLE_01" successfully completed at 23:41:54


完成数据抽取后,我们就可以获得一个转储的导出文件。比如将生产库的采样数据导入测试库,就可以比较两者或多者之间的性能差异或变化,是非常有效的采样数据利用手段。


将导出文件转移到目标数据库或性能分析数据库,可以通过执行awrload.sql导入到数据库中。在导入之前,首先创建一个目录指向包含导出文件的路径,如:


SQL> create or replace directory eygle as 'E:\AWRData';
Directory created.


然后调用awrload.sql脚本执行导入:

SQL> @?/rdbms/admin/awrload
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Disclaimer: This SQL/Plus script should only be called under
the guidance of Oracle Support.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~
AWR LOAD
~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~  This script will load the AWR data from a dump file. The   ~
~  script will prompt users for the following information:    ~
~     (1) name of directory object                            ~
~     (2) name of dump file                                   ~
~     (3) staging schema name to load AWR data into           ~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Specify the Directory Name
~~~~~~~~~~~~~~~~~~~~~~~~~~
Directory Name                 Directory Path
------------------------------ -------------------------------------------------
DATA_PUMP_DIR                  D:\oracle\admin\enmo\dpdump\
EYGLE                          E:\AWRData
ORACLE_OCM_CONFIG_DIR          D:\oracle\10.2.0\ccr\state
Choose a Directory Name from the list above (case-sensitive).
Enter value for directory_name: EYGLE
Using the dump directory: EYGLE

首先列出的是目录名,选择我们之前建好,指向包含导出文件的路径。


然后需要导入的文件名称,注意输入文件名不需要包含后缀,否则会报错:


Specify the Name of the Dump File to Load
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please specify the prefix of the dump file (.dmp) to load:
Enter value for file_name: awrdat_46145_46197
Loading from the file name: awrdat_46145_46197.dmp

然后有一个关键步骤是创建一个中间转换Schema,缺省的名称是AWR_STAGE,这个选择缺省即可,转换完成之后会自动删除:


Staging Schema to Load AWR Snapshot Data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The next step is to create the staging schema
where the AWR snapshot data will be loaded.
After loading the data into the staging schema,the data will be transferred into the AWR tables in the SYS schema.
The default staging schema name is AWR_STAGE.To use this name, press <return> to continue, otherwise enteran alternative.
Enter value for schema_name:
Using the staging schema name: AWR_STAGE
Choose the Default tablespace for the AWR_STAGE user
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Choose the AWR_STAGE users's default tablespace.  This is thetablespace in which the AWR data will be staged.
TABLESPACE_NAME                CONTENTS  DEFAULT TABLESPACE
------------------------------ --------- ------------------
EYGLE                          PERMANENT
SYSAUX                         PERMANENT *
USERS                          PERMANENT
Pressing <return> will result in the recommended default tablespace (identified by *) being used.
Enter value for default_tablespace:
Using tablespace SYSAUX as the default tablespace for the AWR_STAGE
Choose the Temporary tablespace for the AWR_STAGE user
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Choose the AWR_STAGE user's temporary tablespace.
TABLESPACE_NAME                CONTENTS  DEFAULT TEMP TABLESPACE
------------------------------ --------- -----------------------
TEMP                           TEMPORARY *
Pressing <return> will result in the database's default temporary 
tablespace (identified by *) being used.
Enter value for temporary_tablespace:
Using tablespace TEMP as the temporary tablespace for AWR_STAGE


在选择了缺省表空间及临时表空间之后,创建用户和导入的进程自动开始:


... Creating AWR_STAGE user
|
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|  Loading the AWR data from the following
|  directory/file:
|   E:\AWRData
|   awrdat_46145_46197.dmp
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|  *** AWR Load Started ...
|
|  This operation will take a few moments. The
|  progress of the AWR load operation can be
|  monitored in the following directory/file:
|   E:\ AWRData
|   awrdat_46145_46197.log


导入的基本原则是和原来的数据不产生冲突,所以大量的判断子句被加入进来:

WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_SERVICE_STAT)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_SERVICE_STAT_BL)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_SYSMETRIC_HISTORY)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_FILEMETRIC_HISTORY)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_WAITCLASSMETRIC_HISTORY)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_TABLESPACE_STAT)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_TABLESPACE_STAT_BL)
WHERE (DBID, SNAP_ID) NOT IN (SELECT DBID, SNAP_ID FROM AWR_STAGE.WRH$_LOG)


最后Oracle通过INSERT APPEND的方式向SYS对象追加数据,然后删除临时用户,完成导入工作:


INSERT /*+ APPEND */ INTO SYS.WRM$_SNAP_ERROR (SNAP_ID, DBID, INSTANCE_NUMBER, TABLE_NAME, ERROR_NUMBER)
SELECT SNAP_ID, DBID, INSTANCE_NUMBER, TABLE_NAME, ERROR_NUMBER FROM AWR_STAGE.WRM$_SNAP_ERROR WHERE (DBID,
SNAP_ID, INSTANCE_NUMBER, TABLE_NAME) NOT
IN (SELECT DBID, SNAP_ID, INSTANCE_NUMBER, TABLE_NAME FROM SYS.WRM$_SNAP_ERROR)
UPDATE SYS.WRM$_SNAPSHOT s1 SET status = 0, error_count = (SELECT count(*) FROM SYS.wrm$_snap_error s2 WHERE
s1.dbid    = s2.dbid AND s1.snap_id = s2.snap_id AND s1.instance_number = s2.instance_number)  WHERE status 
1   AND BITAND(snap_flag, 2) != 0
AND (dbid, snap_id) IN (SELECT dbid, snap_id FROM AWR_STAGE.WRM$_SNAPSHOT)
Finished MOVE_TO_AWR procedure
... Dropping AWR_STAGE user
End of AWR Load


注意:以上这个过程在Oracle 10.2.0.4及10.2.0.5中存在问题,数据导入非常缓慢,几百M的文件导入可能就需要数个小时的时间,在11g中及10.2.0.4之前的版本中不存在这个问题。10g的AWR数据可以导入到11g的数据库中,以下是一个导入范例:


SQL> create or replace directory dadi as 'E:\AWRStat';
SQL> @?/rdbms/admin/awrload
~~~~~~~~~~
Specify the Directory Name
~~~~~~~~~~~~~~~~~~~~~~~~~~
Directory Name                 Directory Path
------------------------------ -------------------------------------------------
DADI                           E:\AWRStat
DATA_PUMP_DIR                  D:\oracle\admin\eyglee\dpdump\
Choose a Directory Name from the list above (case-sensitive).
Enter value for directory_name: DADI
Using the dump directory: DADI
Enter value for file_name: awrdat_49018_50602
Loading from the file name: awrdat_49018_50602.dmp
Enter value for schema_name:
Using the staging schema name: AWR_STAGE
TABLESPACE_NAME                CONTENTS  DEFAULT TABLESPACE
------------------------------ --------- ------------------
SYSAUX                         PERMANENT *
USERS                          PERMANENT
Enter value for default_tablespace:
Using tablespace SYSAUX as the default tablespace for the AWR_STAGE
Choose the Temporary tablespace for the AWR_STAGE user~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Choose the AWR_STAGE user's temporary tablespace.
TABLESPACE_NAME                CONTENTS  DEFAULT TEMP TABLESPACE
------------------------------ --------- -----------------------
TEMP                           TEMPORARY *
Pressing <return> will result in the database's default temporary
tablespace (identified by *) being used.
Enter value for temporary_tablespace:
Using tablespace TEMP as the temporary tablespace for AWR_STAGE
... Creating AWR_STAGE user
|
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|  Loading the AWR data from the following
|  directory/file:
|   E:\AWRStat
|   awrdat_49018_50602.dmp
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|  *** AWR Load Started ...
|
|  This operation will take a few moments. The
|  progress of the AWR load operation can be
|  monitored in the following directory/file:
|   E:\AWRStat
|   awrdat_49018_50602.log
|
... Dropping AWR_STAGE user
End of AWR Load


导入的AWR数据,同样可以生成AWR报告,通过调用awrrpti.sql脚本即可,这个脚本会要求输入DBID和实例号,定义导入数据库相应的信息即可生成相应的报告。

SQL> @?/rdbms/admin/awrrpti
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:
Type Specified:  html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
  3944144691        1 CCICDB       ccicdb       ccicdbsrv5
* 572103006         1 ENMO         enmo         EYGLEE
Enter value for dbid: 3944144691
Using 3944144691 for database Id
Enter value for inst_num: 1
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 <return> without
specifying a number lists all completed snapshots.
Enter value for num_days: 2
Listing the last 2 days of Completed Snapshots
                                                        Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
ccicdb       CCICDB           46421 19 Oct 2010 00:00      1
                              46422 19 Oct 2010 00:15      1
                              46423 19 Oct 2010 00:30      1
                              46424 19 Oct 2010 00:45      1

对于RAC集群环境,也可以通过调用awrrpti.sql脚本,按照不同的实例号来生成不同实例的AWR报告。


如果希望了解AWR数据的存储和分布情况,可以调用awrinfo.sql来生成关于AWR数据的报告,根据报告里的snap_id分布情况,你可以选择通过手工来删除一定范围的采样数据:

SQL> select min(snap_id), max(snap_id)
  2  from dba_hist_snapshot
  3  where dbid = 3944144691;
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
       45189        47802
SQL> exec dbms_workload_repository.drop_snapshot_range(45189, 47802, 3944144691)
PL/SQL procedure successfully completed.
SQL> select * from dba_hist_snapshot where dbid = 3944144691;
no rows selected


这个操作很快可以完成,如果检查数据字典可以发现,Oracle仅仅修改了对应SNAPSHOT的状态,而并没有真正删除快照(在11gR2最新的版本中,会执行直接删除操作):

SQL> select dbid, status, count(*)
  2  from wrm$_snapshot
  3  group by dbid, status;
      DBID     STATUS   COUNT(*)
-------------- ---------------- --------------------
3812548755          0    89
  96312462         0    50
3944144691          2    2614


检查DBA_HIST_SNAPSHOT视图可以发现,这个视图的定义是只显示STATUS为0的记录:

SQL> select text  
  2  from dba_views
  3  where view_name = 'DBA_HIST_SNAPSHOT';
TEXT
--------------------------------------------------------------------------------
select snap_id, dbid, instance_number, startup_time,
       begin_interval_time, end_interval_time,
       flush_elapsed, snap_level, error_count
from WRM$_SNAPSHOT
where status = 0


如果需要彻底清除某个实例的AWR数据,可以通如下命令指定DBID,则该数据库的所有采样都将被清除:

SQL> exec dbms_swrf_internal.unregister_database(3944144691)
PL/SQL procedure successfully completed.

多数据库实例的对比报告


在RAC环境中,数据库的采样报告包含了两个实例的采样数据,可以通过awrddrpi.sql来生成两个实例的性能对比报告。


当向数据库导入了其他实例的AWR信息之后,也可以使用这个脚本来生成不同实例的对比报告,诸如对生产环境和测试环境的比对,都可以通过类似这样的操作来实现。


以下是awrddrpi.sql调用过程的一个简要列举:


SQL> @?/rdbms/admin/awrddrpi
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Enter value for report_type:html
Type Specified:  html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
  3944144691        1 CCICDB       ccicdb       ccicdbsrv5
* 572103006         1 ENMO         enmo         EYGLEE
Database Id and Instance Number for the First Pair of Snapshots
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for dbid: 3944144691
Enter value for inst_num: 1
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for num_days: 1
Listing the last day's Completed Snapshots
                                                        Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
ccicdb       CCICDB           46421 19 Oct 2010 00:00      1
                              46422 19 Oct 2010 00:15      1
                              46423 19 Oct 2010 00:30      1
                              46424 19 Oct 2010 00:45      1
                              46425 19 Oct 2010 01:00      1
Specify the First Pair of Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 46421
Enter value for end_snap: 46422
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
  3944144691        1 CCICDB       ccicdb       ccicdbsrv5
* 572103006         1 ENMO         enmo         EYGLEE
Database Id and Instance Number for the Second Pair of Snapshots
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for dbid2: 572103006
Enter value for inst_num2: 1
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for num_days2: 1
Listing the last day's Completed Snapshots
                                                        Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
enmo         ENMO               111 02 Nov 2010 14:26      1
                                112 02 Nov 2010 14:27      1
                                113 02 Nov 2010 15:00      1
Specify the Second Pair of Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap2:


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_HTML函数的内容如下,其主要内容是调用了另外一个过程DBMS_SWRF_REPORT_INTERNAL:
  
FUNCTION AWR_REPORT_HTML(L_DBID     IN NUMBER,
                       L_INST_NUM IN NUMBER,
                       L_BID      IN NUMBER,
                       L_EID      IN NUMBER,
                      L_OPTIONS  IN NUMBER DEFAULT 0)
  RETURN AWRRPT_HTML_TYPE_TABLE PIPELINED
  IS
    I NUMBER;
    ARR DBMS_SWRF_REPORT_INTERNAL.OUTPUT_TABLE;
 BEGIN
    ARR := DBMS_SWRF_REPORT_INTERNAL.AWR_REPORT_MAIN(L_DBID, L_INST_NUM, L_BID, L_EID,
                 L_OPTIONS, DBMS_SWRF_REPORT_INTERNAL.TRUE_I);
    FOR I IN ARR.FIRST..ARR.LAST LOOP
       PIPE ROW(AWRRPT_HTML_TYPE(SUBSTR(ARR(I), 1,
                DBMS_SWRF_REPORT_INTERNAL.HTML_REPORT_LINESIZE)));
    END LOOP;
    DBMS_SWRF_REPORT_INTERNAL.REPORT_CLEANUP();
  END AWR_REPORT_HTML;

   

这里的AWR_REPORT_MAIN是最重要的一个函数:

  FUNCTION AWR_REPORT_MAIN(L_DBID     IN NUMBER,
                           L_INST_NUM IN NUMBER,
                           L_BID      IN NUMBER,
                           L_EID      IN NUMBER,
                           L_OPTIONS  IN NUMBER DEFAULT OPT_NULL,
                           TO_HTML    IN BINARY_INTEGER DEFAULT TRUE_I)
 RETURN OUTPUT_TABLE;


该函数的主要内容如下,:

FUNCTION AWR_REPORT_MAIN(L_DBID     IN NUMBER,
                           L_INST_NUM IN NUMBER,
                           L_BID      IN NUMBER,
                          L_EID      IN NUMBER,
                           L_OPTIONS  IN NUMBER DEFAULT OPT_NULL,
                           TO_HTML    IN BINARY_INTEGER DEFAULT TRUE_I)
  RETURN OUTPUT_TABLE  --返回一个输出表内容
  IS
  BEGIN
    REPORT_CLEANUP();
CHECK_PARAMETERS(L_DBID,L_INST_NUM,L_BID,L_EID);    
    
   SET_THRESHOLD;    
REPORT_INIT(L_DBID, L_INST_NUM, L_BID, L_EID, RPT_STATS, RPT_PARAMS,                RPT_TIME_VALS); --报表初始化
    IF (TO_HTML = TRUE_I) THEN
       BEGIN_REPORT_TAGS('AWR Report');
    END IF;
    REPORT_SUMMARY(L_DBID, L_INST_NUM,
                   L_BID, L_EID, L_OPTIONS, TO_HTML, FALSE_I); --生成报表概要
   DISPLAY_SUBTREES_OF(MAIN_REPT, TO_HTML, L_OPTIONS, L_DBID,
                       L_INST_NUM, L_BID, L_EID);  --生成报表其他部分
   DISPLAY_SUBTREES_OF(RAC_REPT, TO_HTML, L_OPTIONS, L_DBID,
                       L_INST_NUM, L_BID, L_EID); --生成报表的RAC部分信息
   
   APPEND_ROW(END_REPORT);
  IF (TO_HTML = TRUE_I) THEN
      END_REPORT_TAGS();
   END IF;
   RETURN RPT_ROWS;
  END AWR_REPORT_MAIN;


接下来数据库就会在主要的过程中调用各种SQL生成报表的各部分内容,如以下就是展现等待事件的查询:

     SELECT EVENT, WAITS, TIME,
            DECODE(WAITS, NULL, TO_NUMBER(NULL),
                          0,    TO_NUMBER(NULL),
                         TIME/WAITS*1000) AVGWT,
            PCTWTT, WAIT_CLASS
      FROM (SELECT EVENT, WAITS, TIME, PCTWTT, WAIT_CLASS
           FROM (SELECT E.EVENT_NAME                           EVENT,
                          E.TOTAL_WAITS - NVL(B.TOTAL_WAITS,0)   WAITS,
                         (E.TIME_WAITED_MICRO -
                           NVL(B.TIME_WAITED_MICRO,0)) / 1000000 TIME,
                          100 * (E.TIME_WAITED_MICRO -
                                       NVL(B.TIME_WAITED_MICRO,0)) /
                                 RPT_STATS(STAT_DBTIME)          PCTWTT,
                          E.WAIT_CLASS                           WAIT_CLASS
                    FROM DBA_HIST_SYSTEM_EVENT B,
                         DBA_HIST_SYSTEM_EVENT E
                   WHERE B.SNAP_ID(+)          = L_BID
                     AND E.SNAP_ID             = L_EID
                      AND B.DBID(+)             = L_DBID
                     AND E.DBID                = L_DBID
                      AND B.INSTANCE_NUMBER(+)  = L_INST_NUM
                     AND E.INSTANCE_NUMBER     = L_INST_NUM
                     AND B.EVENT_ID(+)         = E.EVENT_ID
                      AND E.TOTAL_WAITS         > NVL(B.TOTAL_WAITS,0)
                     AND E.WAIT_CLASS         != 'Idle'
                  UNION ALL
                   SELECT 'CPU time'                             EVENT,
                       TO_NUMBER(NULL)                        WAITS,
                          RPT_STATS(STAT_CPU_TIME)/1000000       TIME,
                          100 * RPT_STATS(STAT_CPU_TIME) /
                                         RPT_STATS(STAT_DBTIME)  PCTWTT,
                          NULL                                   WAIT_CLASS
                    FROM DUAL
                    WHERE RPT_STATS(STAT_CPU_TIME) > 0)
             ORDER BY TIME DESC, WAITS DESC)
      WHERE ROWNUM <= TOP_N_EVENTS;


各类SQL不再过多介绍,了解了AWR的展现原理,我们就可以灵活的去分析各种AWR数据,获得更有价值的信息。




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

评论