AWR

--===================================================================
1. 数据库性能分析及优化
------------------------------------------------------------
DB 性能分析

目的:快速准确查找核心性能问题,并分析问题原因。

需要的能力: 1.通过发生的现象,分析因果关系的能力。
             2.性能分析所必要的数据收集,筛选,分析的能力。
            
            
能力1,需要理解 Oracle 架构
能力2,10g以后可以使用如下方法。
       1)AWR 数据
       2)动态视图,数据字典,元数据
       3)生成SQL跟踪文件
      
------------------------------------------------------------
AWR 概念

AWR(Automatic Workload Repository)

直译:自动工作负荷关联储存仓库

数据库生成后Open时,无需其他设置自动执行,通过 MMON,MMNL 后台进程收集数据,存储在 SYSAUX 表空间。
AWR快照是默认周期是1小时,保存7天。

AWR收集的信息: 1.DB等待事件 及 统计信息
               2.系统统计信息
               3.数据库负荷信息
               4.SQL执行信息
               5.活动Session信息
              
              
AWR数据保存在表 WRH$_* , WRM$_* 里, 可以通过字典 DBA_HIST_* 查询。

------------------------------------------------------------
活用 AWR 数据

可以做:1)掌握 DB 运行状态 (DBA_HIST_OSSTAT)
       2)解决性能问题
       3)分析性能趋势
      
      
--===================================================================
2. AWR 管理
------------------------------------------------------------
AWR 快照管理

快照:是从内存保存到硬盘时,保存点的AWR数据。

包:DBMS_WORKLOAD_REPOSITORY

快照生成:
BEGIN
    DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT([FLUSH_LEVEL => 'flush_level']);
END;
/

快照删除:
BEGIN
    DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(LOW_SNAP_ID => snap_id , HIGH_SNAP_ID => snap_id [,DBID => dbid]) ;
END;
/

快照设定变更:
BEGIN
    DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS([RETENTION => retention_time][,INTERVAL => interval_time][,TOPNSQL => topn_sql_number]) ;
END;
/

BASELINE 生成:
BEGIN
    DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(START_SNAP_ID => snap_id , END_SNAP_ID => snap_id , BASELINE_NAME => 'baseline_name'[,DBID => dbid]) ;
END;
/

BASELINE 删除:
BEGIN
    DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(BASELINE_NAME => 'baseline_name' [,CASCADE => true|false][,DBID => dbid]) ;
END;
/

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

快照生成:
--AWR 收集信息使用默认参数:TYPICAL
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

--AWR 收集信息使用参数:ALL
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(FLUSH_LEVEL => 'ALL');

STATISTICS_LEVEL 参数:
该参数是设定 AWR收集信息等级,10g以后开始增加使用。

TYPICAL: AWR基本统计数据收集,默认值。
ALL: AWR基本统计数据 + OS 统计数据 + 执行计划数据
BASIC: 不收集统计数据

如果设定为 BASIC 不收集统计数据,而且下面10g新功能不能使用。
1. AWR 快照自动执行
2. 数据库自动诊断监视工具 ADDM(Automatic Database Diagnostic Monitor)
3. 自动共享内存管理 ASMM(Automatic Shared Memory Management)
4. 优化器自动统计信息收集
5. MTTR Advisor

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

查看快照:

SELECT SNAP_ID
       ,INSTANCE_NUMBER
       ,TO_CHAR(STARTUP_TIME,'YYYY-MM-DD HH24:MI') INST_START
       ,TO_CHAR(BEGIN_INTERVAL_TIME,'YYYY-MM-DD HH24:MI') BEGIN
       ,TO_CHAR(END_INTERVAL_TIME,'YYYY-MM-DD HH24:MI') END
       ,SNAP_LEVEL
FROM   DBA_HIST_SNAPSHOT
ORDER BY INSTANCE_NUMBER,SNAP_ID DESC ;
/

其中:SNAP_LEVEL 1 : TYPICAL , 2:ALL

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

查看收集快照时发生的错误信息:
SELECT * FROM DBA_HIST_SNAP_ERROR
ORDER BY SNAP_ID DESC ;
/

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

快照删除:

-- 删除 ID 为 1 到 10 的 快照
BEGIN
    DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(LOW_SNAP_ID => 1 , HIGH_SNAP_ID => 10 ) ;
END;
/

LOW_SNAP_ID:要删除的快照开始ID
HIGH_SNAP_ID:要删除的快照结束ID
DBID:DB的ID,默认null,默认值时选择当前登录数据库ID

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

快照设定变更:

默认设定:
AWR快照周期:60分钟
AWR快照保存期间:7天
项目部收集SQL数:TOP 30个

-- 保留60天,周期30分钟,收集前 100个SQL 的设定例子
BEGIN
    DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(RETENTION => 60*24*60 ,INTERVAL => 30 ,TOPNSQL =>'100' ) ;
END;
/

参数说明:
INTERVAL: 快照周期是分钟为单位,默认值是NULL,NULL是维持上次设定结果,接收参数类型是 NUMBER
RETENTION: 快照保存期间是分钟为单位,默认值是NULL,NULL是维持上次设定结果,接收参数类型是 NUMBER
TOPNSQL: 指定 Elapse时间,CPU使用时间,ParseCall次数,Sharable Memore,Version Count 的项目收集的SQL数量,
         各项目别倒序排序,保存设定数量的SQL。接收参数类型是 NUMBER 或 VARCHAR2,默认值是NULL,NULL是维持上次设定结果。
DBID: 默认null,默认值时选择当前登录数据库ID。

参数详细说明:
INTERVAl:可以设定,最小10分钟, 最大1年,如设定为0,系统将不会自动收集快照信息,而且手工收集快照也无法使用。
RETENTION:可以设定,最小1天,最大100年,如设定为0,系统将永久保存。
TOPNSQL:1)NUMBER 时,可以设定,最少30个,最多1亿个(100,000,000)。
         2)VARCHAR2 时,DEFAULT:默认值,如果AWR收集等级是 TYPICAL,则30个,如果是ALL,则100个。
                        MAXINUM:保存游标缓冲里的所有SQL。
                        数字:与NUMBER类型用法相同。


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

查看快照设定:

SELECT * FROM DBA_HIST_WR_CONTROL

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

BASELINE 生成:

BASELINE: 是为了AWR数据比较用设定的基础快照区间。

-- 设定 快照ID 为 1000 到 1010 的区间为快照基本区间,起名为:BL_NAME
BEGIN
    DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(START_SNAP_ID => 1000 , END_SNAP_ID => 1010 , BASELINE_NAME => 'BL_NAME') ;
END;
/

参数说明:
START_SNAP_ID: 区间开始快照ID,接收参数类型是 NUMBER ,没有默认值。
END_SNAP_ID: 区间结束快照ID,接收参数类型是 NUMBER ,没有默认值。
BASELINE_NAME: 基础快照区间名称,接收参数类型是 VARCHAR2 ,没有默认值。
DBID: 默认null,默认值时选择当前登录数据库ID。

awrddrpt.sql
awrdrpti.sql

基础快照区间, 即使超过了 RETENTION 指定的区间,也不会被删除。

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

BASELINE 删除:

-- 删除 名为 BL_NAME 的 BASELINE,并删除相对应快照。
BEGIN
    DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(BASELINE_NAME => 'BL_NAME' ,CASCADE => true) ;
END;
/

参数说明:
BASELINE_NAME:基础快照区间名称,接收参数类型是 VARCHAR2 ,没有默认值。
CASCADE:删除BASELINE时,指定是否一起删除区间对应的快照,接收参数类型是 BOOLEAN,如果选择 TRUE,则对应快照一起删除,
         默认值是 FALSE。
DBID: 默认null,默认值时选择当前登录数据库ID。

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

查看 BASELINE 信息:

SELECT * FROM DBA_HIST_BASELINE;

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

AWR 数据备份及恢复

AWR 备份

awrextr.sql

步骤:
1) SQL>@?/rdbms/admin/awrextr.sql
2) 输入 DBID
3) 输入要显示今天到几天内的快照。如输入1,则最近24小时内快照。
4) 输入要备份快照区间,如输入 123 ~ 133 则备份这个区间的快照。
5) 输入输出目录名
6) 输入备份镜像文件名


--
CREATE OR REPLACE DIRECTORY PUMP_AWR AS '/PUMP';
--
GRANT READ, WRITE ON DIRECTORY PUMP_AWR TO PUBLIC ;
--
DROP DIRECTORY PUMP_AWR

AWR 恢复

awrload.sql

限制:不能恢复到与备份时的DBID相同的DBID上,即只能恢复到其他DBID上. 否则 ORA-20107 .

步骤:
1) SQL>@?/rdbms/admin/awrload.sql
2) 输入输出目录名
3) 输入备份镜像文件名
4) 输入临时用户名,如果直接回车,默认用户 AWR_STAGE
5) 输入表空间
6) 输入临时表空间


--===================================================================
3. 生成 AWR 报告
------------------------------------------------------------

生成 AWR 报告

V$ 开始的动态视图是实例开始的时候开始收集,到终止为止持续增加。实例终止的时候重置为0.
执行AWR快照的时候,内存的数据会保存在硬盘上,AWR报告是通过设定开始快照ID与结束快照ID,
计算这个区间段等待事件发生次数及统计信息差异值来生成报告。

如果10:00实例重启了一次,那将无法生成9:00到11:00的AWR报告的,因为等待事件及统计信息都重置过了,
AWR报表就没有意义了。

AWR 报告可以通过包 DBMS_WORKLOAD_REPOSITORY 或Oracle提供的脚本生成。所有 AWR相关脚本在下面目录。

$ORACLE_HOME/rdbms/admin/


用途别分类如下;

用途              脚本
AWR DB 报告       awrrpt.sql    , awrrpti.sql
AWR DB 比较报告   awrddrpt.sql  , awrddrpi.sql
AWR SQL 报告      awrsqrpt.sql  , awrsqrpi.sql
AWR 信息查询报告   awrinfo.sql
ASH 报告          ashrpt.sql    , ashrpti.sql
ADDM 报告         addmrpt.sql   , addmrpti.sql
其它              awrddinp.sql  , awrinput.sql  ,  awrinpnmp.sql

------------------------------------------------------------
生成 AWR DB 报告
               
需要的权限:
SELECT ANY DICTIONARY 权限
SYS.DBMS_WORKLOAD_REPOSITORY 包执行权限

awrrpt.sql   :执行脚本的实例的AWR DB 报告
awrrpti.sql :指定DBID或实例的AWR DB 报告


awrrpt.sql 步骤:
1) SQL>@?/rdbms/admin/awrrpt.sql
2) 选择输出类型,HTML 或 TEXT, 默认HTML
3)选择输出几天内的快照
4)输入开始快照ID和结束快照ID
5)指定报表输出文件名


AWR_REPORT_TEXT
AWR_REPORT_HTML

查看 DBID:
SELECT * FROM V$DATABASE ;

生成 AWR DB 报告:(HTML)
SELECT OUTPUT FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1345435618,1,91020,91028));

结果保存到记事本,保存为 .html 文件即可。

生成 AWR DB 报告:(TEXT)
SELECT OUTPUT FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(1345435618,1,91020,91028));

------------------------------------------------------------
生成 AWR DB 比较报告
               
awrddrpt.sql
awrddrpti.sql

awrddrpt.sql 步骤:
1) SQL>@?/rdbms/admin/awrddrpt.sql
2) 选择输出类型,HTML 或 TEXT, 默认HTML,推荐用 HTML 。
3)选择第一个统计输出几天内的快照
4)输入第一个统计开始快照ID和结束快照ID
5)选择第二个统计输出几天内的快照
6)输入第二个统计开始快照ID和结束快照ID
7)指定报表输出文件名

AWR_DIFF_REPORT_HTML
AWR_DIFF_REPORT_TEXT


生成 AWR DB 比较报告:(HTML)
SELECT OUTPUT FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_DIFF_REPORT_HTML(1345435618,1,91020,91028,1345435618,1,90804,90812));

结果保存到记事本,保存为 .html 文件即可。

------------------------------------------------------------
生成 AWR SQL 报告

awrsqrpt.sql
awrsqrpti.sql

awrsqrpt.sql 步骤:
1) SQL>@?/rdbms/admin/awrsqrpt.sql
2) 选择输出类型,HTML 或 TEXT, 默认HTML,推荐用 HTML 。
3)选择输出几天内的快照
4)输入开始快照ID和结束快照ID
5) 输入 SQL ID
6)指定报表输出文件名

------------------------------------------------------------
生成 AWR 信息查询报告

awrinfo.sql

通过这个可以确认的信息有;
* AWR 快照信息
* 顾问构成信息
* ASH使用信息

awrinfo.sql 步骤:
1) SQL>@?/rdbms/admin/awrinfo.sql
2)指定报表输出文件名


------------------------------------------------------------
其他生成 AWR 报告相关脚本

awrddinp.sql : awrddrpti.sql 里被调用。
awrinput.sql : awrrpti.sql , awrsqrpi.sql  里被调用。
awrinpnm.sql : awrrpti.sql , awrsqrpi.sql  里被调用。


--===================================================================
4. AWR DB 报告分析及优化
------------------------------------------------------------

AWR DB 报告分析

可分为两类:
1)简报 : AWR 收集信息,实例环境状态等简报,可以快速定位问题所在。
2)详细报告:DB状态项目别详细列出,可以对问题详细分析。


分析方法如下;
------------------------------------------------------------
简报

简报可以分为5种类型;
1) DB环境  : 开始到 Cache Sizes 前。
2) 内存    : Cache Sizes 
               Instance Efficiency Percentages (Target 100%)
3) 负载    : Load Profile
4) 等待事件 :Top 5 Timed Foreground Events
5) RAC :Global Cache Load Profile
          Global Cache Efficiency Percentages (Target local+remote 100%)
          Global Cache and Enqueue Services - Workload Characteristics
          Global Cache and Enqueue Services - Messaging Statistics


------------------------------------------------------------
Instance 信息:

DB Name         DB Id    Instance     Inst Num Startup Time    Release     RAC
------------ ----------- ------------ -------- --------------- ----------- ---
MCS           1345435618 mcs1                1 27-Mar-16 16:48 11.2.0.3.0  YES

Host Name        Platform                         CPUs Cores Sockets Memory(GB)
---------------- -------------------------------- ---- ----- ------- ----------
bjmcspd1         AIX-Based Systems (64-bit)         64    16             124.50


DB Name       :DB 名                 DB_NAME
DB Id         :DB ID                 DBID
Instance      :Instance 名           INSTANCE_NAME         
Inst Num      :Instance 号           INSTANCE_NUMBER
Startup Time  :Instance 开始时间      STARTUP_TIME
Release       :Oracle 版本信息        VERSION
RAC           :是否 RAC               PARALLEL
Host Name     :操作系统名             HOST_NAME
Platform      :平台                   
CPUs          :逻辑CPU数
Cores         :CPU核数
Sockets       :CPU插槽
Memory(GB)    :物理内存


SELECT * FROM V$INSTANCE;


------------------------------------------------------------
AWR 快照信息:


              Snap Id      Snap Time      Sessions Curs/Sess
            --------- ------------------- -------- ---------
Begin Snap:     91020 20-Jun-16 08:20:10       474      11.2
  End Snap:     91028 20-Jun-16 11:00:40       495      11.1
   Elapsed:              160.50 (mins)
   DB Time:            3,076.18 (mins)
  
  
Snap Id      : 快照ID
Snap Time    : 快照执行时间 
Sessions     : 快照执行时Session数
Curs/Sess    : 快照执行时Sessions使用的平均游标数
Elapsed      : 两个快照之间的时间(单位:分钟)
DB Time      : 两个快照之间的 DB Time (单位:分钟)

CUP 利用率 = DB Time/CPUs/Elapsed = 3040.76/64/160.04 = 0.296875


SELECT T1.SNAP_ID
       ,T1.END_INTERVAL_TIME
       ,T3.SESSIONS
       ,ROUND(T3.CURSORS/T3.SESSIONS,1) AS "Curs/Sess"
       ,ROUND(EXTRACT(DAY FROM T1.END_INTERVAL_TIME - LAG(T1.END_INTERVAL_TIME)OVER(ORDER BY T1.SNAP_ID)) * 60 *24 +
              EXTRACT(HOUR FROM T1.END_INTERVAL_TIME - LAG(T1.END_INTERVAL_TIME)OVER(ORDER BY T1.SNAP_ID)) * 60  +
              EXTRACT(MINUTE FROM T1.END_INTERVAL_TIME - LAG(T1.END_INTERVAL_TIME)OVER(ORDER BY T1.SNAP_ID)) +
              EXTRACT(SECOND FROM T1.END_INTERVAL_TIME - LAG(T1.END_INTERVAL_TIME)OVER(ORDER BY T1.SNAP_ID))/60
             ,2) AS "Elapsed(mins)"
       ,ROUND((T2.VALUE - LAG(T2.VALUE)OVER(ORDER BY T1.SNAP_ID))/1000000/60,2) AS "DB Time(mins)"
FROM   DBA_HIST_SNAPSHOT T1
       ,DBA_HIST_SYS_TIME_MODEL T2
       ,(
        SELECT T3.DBID,T3.INSTANCE_NUMBER,T3.SNAP_ID
               ,SUM(DECODE(T3.STAT_NAME,'logons current',VALUE)) Sessions
               ,SUM(DECODE(T3.STAT_NAME,'opened cursors current',VALUE)) cursors
        FROM   DBA_HIST_SYSSTAT T3
        WHERE  T3.STAT_NAME IN ( 'logons current','opened cursors current')
        AND    T3.SNAP_ID IN (91020,91028)
        AND    T3.INSTANCE_NUMBER = 1
        AND    T3.DBID = 1345435618
        GROUP BY T3.DBID,T3.INSTANCE_NUMBER,T3.SNAP_ID
       ) T3
WHERE  T1.SNAP_ID IN (91020,91028)
AND    T1.INSTANCE_NUMBER = 1
AND    T1.DBID = 1345435618
AND    T1.DBID = T2.DBID
AND    T1.INSTANCE_NUMBER = T2.INSTANCE_NUMBER
AND    T1.SNAP_ID = T2.SNAP_ID
AND    T2.STAT_NAME = 'DB time'
AND    T1.DBID = T3.DBID
AND    T1.INSTANCE_NUMBER = T3.INSTANCE_NUMBER
AND    T1.SNAP_ID = T3.SNAP_ID
ORDER BY T1.SNAP_ID;


------------------------------------------------------------
Cache Sizes:

                       Begin        End
                  ---------- ----------
    Buffer Cache:    46,080M    46,080M  Std Block Size:         8K
Shared Pool Size:    10,240M    10,240M      Log Buffer:   110,148K


  
Buffer Cache      : Buffer Cache 大小
Shared Pool Size  : 共享池大小
Std Block Size    : db_block_size 参数设定的值,基本Block大小
Log Buffer        : Redo Log Buffer 大小

如果使用 SGA 的自动管理(ASMM)功能,开始和结束两个点的快照 Buffer Cache 和 Shared Pool Size 可能不一样,但 Log Buffer 不变。


SELECT T1.DBID,T1.INSTANCE_NUMBER,T1.SNAP_ID
       ,MAX(CASE WHEN T1.PARAMETER_NAME = 'db_cache_size' THEN T1.VALUE/1024/1024 END) AS "Buffer Cache(MB)"
       ,MAX(CASE WHEN T1.PARAMETER_NAME = 'shared_pool_size' THEN T1.VALUE/1024/1024 END) AS "Shared Pool Size(MB)"
       ,MAX(CASE WHEN T1.PARAMETER_NAME = 'db_block_size' THEN T1.VALUE/1024 END) AS "Std Block Size(K)"
       ,MAX(CASE WHEN T2.NAME = 'log_buffer' THEN T2.BYTES/1024 END) AS "Log Buffer(K)"
FROM   DBA_HIST_PARAMETER T1
       ,DBA_HIST_SGASTAT T2
WHERE  T1.PARAMETER_NAME IN ('db_cache_size','shared_pool_size','db_block_size')
AND    T2.NAME = 'log_buffer'
AND    T1.DBID = T2.DBID
AND    T1.INSTANCE_NUMBER = T2.INSTANCE_NUMBER
AND    T1.SNAP_ID = T2.SNAP_ID
AND    T1.DBID = 1345435618
AND    T1.INSTANCE_NUMBER = 1
AND    T1.SNAP_ID IN (91020,91028)
GROUP BY T1.DBID,T1.INSTANCE_NUMBER,T1.SNAP_ID
ORDER BY T1.SNAP_ID;


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13696961/viewspace-2120849/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13696961/viewspace-2120849/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值