--- layout: post title: AWR Introduction category : Oracle tags : [Oracle, Database, DBA, Performance] --- Oracle Database 10g 提供了一个新的工具:(AWR:Automatic Workload Repository)。Oracle 建议用户用这个取代 Statspack。AWR 实质上是一个 Oracle 的内置工具,它采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题。 与 Statspack 不同,快照由一个称为 `MMON` 的新的后台进程及其从进程自动地每小时采集一次。为了节省空间,采集的数据在 7 天后自动清除。快照频率和保留时间都可以由用户修改。它产生两种类型的输出:文本格式(类似于 Statspack 报表的文本格式但来自于 AWR 信息库)和默认的 HTML 格式(拥有到部分和子部分的所有超链接),从而提供了非常用户友好的报表。 AWR 使用几个表来存储采集的统计数据,所有的表都存储在新的名称为`SYSAUX` 的特定表空间中的 `SYS` 模式下,并且以 `WRM$_*` 和 `WRH$_*` 的格式命名。前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。H 代表“历史数据 (historical)”而 M 代表“元数据 (metadata)”。 在这些表上构建了几种带前缀`DBA_HIST_` 的视图,这些视图可以用来编写您自己的性能诊断工具。视图的名称直接与表相关;例如,视图 `DBA_HIST_SYSMETRIC_SUMMARY` 是在`WRH$_SYSMETRIC_SUMMARY` 表上构建的。 ### 注意 `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) - - - ## AWR使用 运行awr报告 SQL> @?/rdbms/admin/awrrpt Current Instance ~~~~~~~~~~~~~~~~ DB Id DB Name Inst Num Instance ----------- ------------ -------- ------------ 1193549399 DBTEST 1 DBTEST 指定报告类型 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 ------------ -------- ------------ ------------ ------------ * 1193549399 1 DBTEST DBTEST oradb.tp-lin k.net Using 1193549399 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 ------------ ------------ --------- ------------------ ----- DBTEST DBTEST 2409 14 Mar 2013 00:00 1 2410 14 Mar 2013 01:00 1 2411 14 Mar 2013 02:00 1 2412 14 Mar 2013 03:00 1 2413 14 Mar 2013 04:00 1 2414 14 Mar 2013 05:00 1 2415 14 Mar 2013 06:00 1 2416 14 Mar 2013 07:00 1 2417 14 Mar 2013 08:00 1 2418 14 Mar 2013 09:00 1 2419 14 Mar 2013 10:00 1 2420 14 Mar 2013 11:00 1 2421 14 Mar 2013 12:00 1 2422 14 Mar 2013 13:00 1 2423 14 Mar 2013 14:00 1 指定生产报告所需快照的起始和结束编号 Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enter value for begin_snap: 2418 Begin Snapshot Id specified: 2418 Enter value for end_snap: 2421 End Snapshot Id specified: 2421 指定生成的报告名 Specify the Report Name ~~~~~~~~~~~~~~~~~~~~~~~ The default report file name is awrrpt_1_2418_2421.html. To use this name, press to continue, otherwise enter an alternative. Enter value for report_name: Using the report name awrrpt_1_2418_2421.html ... ... Report written to awrrpt_1_2418_2421.html - - - ## AWR报告分析 这部分内容,可以参考statspack report的分析,这2个内容都差不多。 AWR报告样例,可以参考[eygle](http://www.eygle.com)的[AWR报告分析之二:ges inquiry response](http://www.eygle.com/pdf/awrrpt_1_143_157.html); statspack报告可以参考[Dave](http://blog.csdn.net/tianlesoftware)的[statspack安装使用和report分析](http://blog.csdn.net/tianlesoftware/article/details/4682329)。 ## AWR操作 ### AWR保存策略 SQL> col snap_interval for a20 SQL> col retention for a20 SQL> select * from dba_hist_wr_control; DBID SNAP_INTERVAL RETENTION TOPNSQL ---------- -------------------- -------------------- ---------- 1193549399 +00000 01:00:00.0 +00008 00:00:00.0 DEFAULT 以上结果表示,每小时产生一个SNAPSHOT,保留8天。 ### 调整AWR配置 AWR配置都是通过`dbms_workload_repository`包进行配置。 调整AWR产生snapshot的频率和保留策略,如将收集间隔时间改为30 分钟一次。并且保留5天时间(单位为分钟): SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60); 关闭AWR,把interval设为0则关闭自动捕捉快照 SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>0); 手工创建一个快照 SQL> exec dbms_workload_repository.create_snapshot(); 查看快照 SQL> select * from sys.wrh$_active_session_history; 手工删除指定范围的快照 SQL> exec dbms_workload_repository.drop_snapshot_range(low_snap_id => 973, high_snap_id => 999, dbid => 262089084); 创建baseline,保存这些数据用于将来分析和比较 SQL> exec dbms_workload_repository.create_baseline(start_snap_id => 1003, end_snap_id => 1013, 'apply_interest_1'); 删除baseline SQL> exec dbms_workload_repository.drop_baseline(baseline_name => 'apply_interest_1', cascade => FALSE); 将AWR数据导出并迁移到其它数据库以便于以后分析 SQL> exec dbms_swrf_internal.awr_extract(dmpfile => 'awr_data.dmp', mpdir => 'DIR_BDUMP', bid => 1003, eid => 1013); 迁移AWR数据文件到其他数据库 SQL> exec dbms_swrf_internal.awr_load(schname => 'AWR_TEST', dmpfile => 'awr_data.dmp', dmpdir => 'DIR_BDUMP'); 把AWR数据转移到SYS模式中: SQL> exec dbms_swrf_internal.move_to_awr(schname => 'TEST'); ## 错误 在学习AWR配置调整过程中,出现了一例异常,如下。 ### ORA-13541 SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>7*24*60); BEGIN dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>7*24*60); END; * ERROR at line 1: ORA-13541: system moving window baseline size (691200) greater than retention (604800) ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 174 ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 222 ORA-06512: at line 1 SQL> select 691200/24/60/60 baseline,604800/24/60/70 retention from dual; BASELINE RETENTION ---------- ---------- 8 6 检查当前系统移动窗口的基线设置 SQL> SELECT dbid, baseline_name, baseline_type, moving_window_size from dba_hist_baseline; DBID BASELINE_NAME BASELINE_TYPE MOVING_WINDOW_SIZE ---------- -------------------- ------------- ------------------ 1193549399 SYSTEM_MOVING_WINDOW MOVING_WINDOW 8 根据以上信息,即移动窗口(moving window baseline)的大小大于数据保留(retention)时间,故报`ORA-13541`。要弄清楚这两者之间的关系,必须要弄清楚几个概念。这里仅作简单的理解:AWR是通过比较不同时间点的性能数据来分析系统的运行状态的,所选取的时间点跨度(最大值即移动窗口的大小)必须在这些性能数据的保留周期之内,否则会出现以上异常。 这里调整下以上两个参数的大小,使移动窗口的大小,这个值要等于或小于AWR保留天数即可。 如调整移动窗口大小,从8天改为7天: SQL> exec dbms_workload_repository.modify_baseline_window_size(window_size=>7); PL/SQL procedure successfully completed. SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>7*24*60); PL/SQL procedure successfully completed. 如调整保留时间,从7改为8天: SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>7*24*60); BEGIN dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>7*24*60); END; * ERROR at line 1: ORA-13541: system moving window baseline size (691200) greater than retention (604800) ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 174 ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 222 ORA-06512: at line 1 SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30,retention=>8*24*60); PL/SQL procedure successfully completed. #### 基线(Baselines) 基线包含了一个特定时间范围的性能数据,用来在性能问题发生时,与其他类似的时间段进行比较。基线中的快照会被自动AWR清除进程排除,并无限期保留。 oracle数据库中包含了三种类型的基线: ##### 1.固定基线(Fixed Baselines) 固定基线相当于被指定的过去的一个固定的、连续的时间范围。在创建固定基线以前,要慎重考虑这个时间段,因为基线代表了一个理想状态的系统状态。之后,你可以用这个基线和其他基线或者某个时间范围内的快照来分析性能上的退化情况。 ##### 移动窗口基线(Moving Window Baseline) 移动窗口基线相当于AWR保留期间内存在的所有AWR数据。在使用自适应阈值时,这将很有用处,因为数据库可以使用AWR保留期间的所有AWR数据来计算出度量阈值。oracle数据库自动维护一个系统定义的移动窗口基线。系统定义的移动窗口基线的默认窗口大小等于当前AWR保留的时间,默认为8天。如果你要使用自适应阈值,可以考虑使用更大的移动窗口,例如30天,可以更精确地计算出阈值。你可以改变移动窗口的大小,这个值要等于或小于AWR保留天数。因此若你需要增大移动窗口的大小,首先需要增加AWR的保留时间。 ##### 基线模板(Baseline Templates) 你可以创建一个基线,作为未来一个时间连续的时间段可以使用的基线模板。有两种类型的基线模板:单一的和重复的。你可以为未来一个单独的连续时间段的基线创建单一基线模板。如果你要提前准备获取一个未来的时间段,这个技术会很有用处。例如,你安排好要在周末进行一个系统测试,并准备获取AWR数据,这种情况下,你可以创建一个单一基线模板,用以在测试时自动获取该时间范围内的数据。你也可以使用重复基线模板来创建或者删除一个重复的时间计划,当你想自动获取一个连续的时间范围,这将很有用。例如,你可能希望在一个月里的每周一早晨获取AWR数据,这种情况下,你可以创建一个重复基线模板来自动为每个周一创建基线,并且在设置了过期时间(例如一个月)后,自动删除过期的基线。 ## 参考 * [Oracle AWR 简介](http://blog.csdn.net/wildwave/article/details/6838906) * [Oracle AWR 说明](http://blog.csdn.net/tianlesoftware/article/details/4682300) * [AWR报告分析之二:ges inquiry response](http://www.eygle.com/pdf/awrrpt_1_143_157.html) * [AWR报告样例](http://www.eygle.com/pdf/awrrpt_1_143_157.html) * [statspack安装使用和report分析](http://blog.csdn.net/tianlesoftware/article/details/4682329)