四、AWR的几个帮

4.1 Snapshots( 快照)

  前面操作报表生成时,snap这个关键字已经出现过黑多黑多次了,想必你对它充满了疑惑,这个东西是哪尬来的咋来的谁让它来的呢?事实上,Snap是Snapshot的简写,这正是AWR在自动性方面的体现,虽然你没有创建,但是AWR自动帮你创建了(当然也可以手动创建snapshot),并且是定时(每小时)创建,定期清除(保留最近7天)。

  Snapshots 是一组某个时间点时历史数据的集合,这些数据就可被ADDM(Automatic Database Diagnostic Monitor)用来做性能对比。默认情况下,AWR能够自动以每小时一次的频率生成Snapshots性能数据,并保留7天,,如果需要的话,DBA可以通过DBMS_WORKLOAD_REPOSITORY过程手动创建、删除或修改snapshots。

    提示:调用DBMS_WORKLOAD_REPOSITORY包需要拥有DBA权限。

4.1.1  手动创建Snapshots

  手动创建Snapshots,通过DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT过程,例如:

    SQL> exec dbms_workload_repository.create_snapshot();

    PL/SQL procedure successfully completed.

  然后可以通过DBA_HIST_SNAPSHOT 视图查看刚刚创建的Snapshots信息。

4.1.2  手动删除Snapshots

  删除Snapshots是使用DBMS_WORKLOAD_REPOSITORY包的另一个过程:DROP_SNAPSHOT_RANGE,该过程在执行时可以通过指定snap_id的范围的方式一次删除多个Snapshots,例如:

    SQL> select count(0) from dba_hist_snapshot where snap_id between 7509 and 7518;

      COUNT(0)

    ----------

            10

    SQL> begin

      2   dbms_workload_repository.drop_snapshot_range(

      3     low_snap_id => 7509,

      4     high_snap_id => 7518,

      5     dbid => 3812548755);

      6  end;

      7  /

    PL/SQL procedure successfully completed.

    SQL> select count(0) from dba_hist_snapshot where snap_id between 7509 and 7518;

      COUNT(0)

    ----------

             0

  注意当snapshots被删除的话,与其关联的ASH记录也会级联删除。

4.1.3  修改Snapshots设置

  通过MODIFY_SNAPSHOT_SETTINGS过程,DBA可以调整包括快照收集频率、快照保存时间、以及捕获的SQL数量三个方面的设置。分别对应MODIFY_SNAPSHOT_SETTINGS的三个参数:

  • Retention :设置快照保存的时间,单位是分钟。可设置的值最小为1天,最大为100年。设置该参数值为0的话,就表示永久保留收集的快照信息。
  • Interval :设置快照收集的频率,以分钟为单位。可设置的值最小为10分钟,最大为1年。如果设置该参数值为0,就表示禁用AWR特性。
  • Topnsql :指定收集的比较占用资源的SQL数量,可设置的值最小为30,最大不超过100000000。

  查看当前快照收集的相关设置,可以通过DBA_HIST_WR_CONTROL视图查看,例如:

    SQL> select * from dba_hist_wr_control;

     

          DBID SNAP_INTERVAL            RETENTION            TOPNSQL

    ---------- ------------------------ -------------------- ----------

    3812548755 +00000 01:00:00.0        +00007 00:00:00.0    DEFAULT

  又比如通过MODIFY_SNAPSHOT_SETTTINGS过程修改snap_intrval的设置:

    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

    ---------- ------------------------ -------------------- ----------

    3812548755 +00000 02:00:00.0        +00007 00:00:00.0    DEFAULT

4.2 Baselines( 基线)

  Baseline ,直译的话叫做基线,顾名思义的方式理解,就是用于比较的基本线。因为Baseline中包含指定时间点时的性能数据,因此就可以用来与其它时间点时的状态数据做对比,以分析性能问题。

  创建Baseline时,Snapshots是做为其中的一个组成部分存在,因此一般来说当AWR自动维护快照时,如果定义过baseline,与baseline相关的快照不会被删除,即使是过期的快照,这样就相当于手动保留了一份统计数据的历史信息,DBA可以在适当的时间将其与现有的快照进行对比,以生成相关的统计报表。

  用户可以通过DBMS_WORKLOAD_REPOSITORY包中的相关过程,手动的创建或删除Baseline。

4.2.1  创建Baseline

  创建Baseline使用CREATE_BASELINE过程,执行该过程时分别指定开始和结果的snap_id,然后为该baseline定义一个名称即可,例如:

    SQL> BEGIN

      2    DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id => 7550,

      3                                             end_snap_id   => 7660,

      4                                             baseline_name => ¨am_baseline¨);

      5  END;

      6  /

    PL/SQL procedure successfully completed.

    SQL> select dbid,baseline_name,start_snap_id,end_snap_id from dba_hist_baseline;

          DBID BASELINE_NAME        START_SNAP_ID END_SNAP_ID

    ---------- -------------------- ------------- -----------

    3812548755 am_baseline                   7550        7660

4.2.2  删除Baseline

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

    SQL> BEGIN

      2    DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => ¨am_baseline¨,

      3                                           cascade       => true);

      4  END;

      5  /

    PL/SQL procedure successfully completed.

    SQL> select * from dba_hist_baseline;

    no rows selected

    SQL> select * from dba_hist_snapshot where snap_id between 7550 and 7660;

    no rows selected

  如上例中所示,删除时指定了cascade参数值为true,对应的snap也被级联删除了。