Chinaunix首页 | 论坛 | 博客
  • 博客访问: 419279
  • 博文数量: 148
  • 博客积分: 3191
  • 博客等级: 中校
  • 技术积分: 1232
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-11 15:25
文章分类

全部博文(148)

文章存档

2011年(148)

我的朋友

分类: Oracle

2011-08-17 17:15:51

AWR

一、概述
awr(Automatic Workload Repository)是oracle 10g推出的一个强有力的信息收集工具,它比之前的statspack有显著的改进,收集的信息也更多、更全面,使用方法也更简单。

二、安装
awr是默认安装的,装好了10g的数据库就已经可以使用awr了。

三、配置
awr默认每个小时收集一次统计信息,并且保留7天的数据。awr配置信息可以从以下视图查询:
SQL> select * from dba_hist_wr_control;

DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- ---------------------------- ----------------------- ----------
3939087858 +00000 00:10:00.0 +00002 00:00:00.0 DEFAULT

awr与statspack不同,它不是由job来调度的,而是由MMON来定期收集的。

SQL> show parameter job

NAME TYPE VALUE
-------------------------- ----------- --------------------
job_queue_processes integer 10

SQL> select count(1) from dba_jobs;

COUNT(1)
----------
0

我们可以用dbms_workload_repository.modify_snapshot_settings来修改默认配置
SQL> desc dbms_workload_repository.modify_snapshot_settings
Parameter Type Mode Default?
--------- -------- ---- --------
RETENTION NUMBER IN Y --设定awr信息保留多长时间,单位是分钟,默认是60分钟
INTERVAL NUMBER IN Y --设定收集时间间隔,单位是分钟,默认是1周
TOPNSQL NUMBER IN Y --设定取多少条耗费资源的sql
DBID NUMBER IN Y

如把awr设置为10分钟收集一次、每次收集50条耗费资源的sql,并保留2天的收集数据,可以用如下方式修改
SQL> exec dbms_workload_repository.modify_snapshot_settings(2*24*60,10,50);

PL/SQL procedure successfully completed

可以看出配置已经改变
SQL> select * from dba_hist_wr_control;

DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------------- ----------------------- ----------
3939087858 +00000 00:10:00.0 +00002 00:00:00.0 50


四、生成报表
1、调用脚本
和statspack一样,awr也提供一个脚本来生成报表。报表的形式有两种:text和html。强烈建议生成html格式的报表,可读性非常强。
脚本位置和名称:$ORACLE_HOME/rdbms/admin/awrrpt.sql
用脚本生成awr报表的过程与生成statspack报表非常类似,你需要以sys用户执行这个脚本,执行过程需要输入报表类型、天数(用来决定显示那几天内的snapshot)、begin_snap、end_snap、以及报表名称等5个参数。
如果不不想手工输入参数,你可以修改$ORACLE_HOME/rdbms/admin/awrrpti.sql文件,把需要到的5个变量设置好,在执行过程就不用输入了。
修改awrrpti这个脚本可以让你自动生成报表。

2、直接用函数
oracle提供2个函数来生成对应的报表:
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT :生成text报表
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML :生成html报表

比如:
执行:select * from table(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(3939087858,1,2,3));
此时在屏幕上就打印出相关的信息。

其实$ORACLE_HOME/rdbms/admin/awrrpt.sql就是通过调用以上两个函数来生成报表的。


五、如何读懂报表
awr产生的报表和statspack报表有点类似,要真正读懂它,需要下很大的工夫,具体的介绍可以看:

 

 

 ADDM

一. ADDM概述
ADDM提供了一个整体的优化方案.基于一段时间内的AWR snapshots可以执行ADDM 分析,它可以帮我们诊断在这段期间内数据库可能存在的瓶颈.

ADDM分析的目标是减小吞吐量的度量值, 在这里我们将它称为"DB TIME".DB TIME是一个累积值(数据库服务器处理用户请求所花费的时间).它包括了等待时间和CPU处理的时间(针对所有活跃的用户进程而言),可以通过查询下面两个视图来获得它的值:
V$SESS_TIME_MODEL, V$SYS_TIME_MODEL

注意: ADDM不会将处理用户响应时间作为调优的目标,你应该使用"TRACE"技术来监控它.

通过减小"DB TIME", 使用同样多的系统资源,数据库服务器可以处理更多的用户请求,也就是提高了吞吐量. 通过ADDM报告的问题是按照DB time排序的.

ADDM所诊断到的问题包括这些:

1. CPU的瓶颈

2. 内存结构上的瓶颈 (SGA,PGA是否已经合理地设置 ?)

3. I/O 是否存在性能瓶颈? (I/O子系统是否工作正常 ?)

4. 高负载的SQL语句 (是否存在消耗过量系统资源的SQL ?)

5. 高负荷的PLSQL执行和编译,同时是否存在高负荷的JAVA使用?

6. RAC相关的问题: 什么是全局缓冲的热块和对象? 是否存在潜在的内联(interconnect)问题 ? 

7. 应用程序的使用是否已经达到了理想化: 是否存在下面这些问题?

     连接池的管理,  过量的解析,  应用程序层的锁竞争.

8. 数据库配置的问题:

    日志文件的大小是否合理?
     归档是否有问题?
    是否频繁的达到检查点?
    参数是否合理?

9. 并发的问题: 是否存在"缓冲区忙"的问题?

10. "热"对象以及不同程序领域内的顶级SQL.

ADDM同时也记录了没有问题的区域.

在诊断的同时,ADDM还给出了一些可能的解决方案. ADDM一般会提供多个可能的方案供DBA去选择.在产生建议的时候ADDM充分考虑到了系统变化的多样性.包括:

1. 改变硬件: 增加更多的CPU或者增强I/O子系统;

2. 数据配置: 修改初始化参数文件;

3. 变更Schema: 对一个表或索引进行哈希分区,或者使用自动的段空间管理(ASSM)

4. 更改应用程序: 例如为序列使用"缓存"选项,使用绑定变量;

5. 其它的建议:
   对于高负载的SQL,运行"SQL Tuning Advisor";
   对于热块,运行"Segment Advisor".

 

二. ADDM 分析的结果 

ADDM 分析的结果以一些"Finding"的样式来表达. 每个"Finding"都属于以下三种类型之一:

1. 问题: 描述了导致数据库性能问题的根源;

2. 征兆: 包含了可能导致其他问题的信息

3. 信息: 报告其他没有问题的模块

 

三. ADDM 样例 

四. 设置ADDM 
缺省情况下,ADDM已经被自动启用,通过初始化参数文件中的STATISTICS_LEVEL来控制.这个参数应该被设置成TYPICAL或者ALL(缺省值是TYPICAL).如果你将这个参数设置成basic,很多Oracle的特性将被屏蔽.

ADDM 对于I/O性能的评估分析在部分程度上依赖于这个DBIO_EXPECTED.  这个参数的含义是读取一个数据块所花费的平均时间(以微秒为单位). Oracle使用的是缺省值(10毫秒), 对于现在流行的硬盘来说, 这是一个比较合适的值.如果你的硬盘比较陈旧,或者你有一个非常好的RAM DISK,请修改这个值.

为了决定DBIO_EXPECTED这个参数该怎样去正确地配置,需要完成下面的步骤:
1. 基于你的机器的硬件,估量一下读取单个数据库块所花费的平均时间.
注意:这个度量应该针对随机的I/O(包括寻道的时间).传统的值应该属于5000-20000微秒这个区间.

2. 为接下来的ADDM执行设置一个时间参数.
例如:如果估计的值是8000微秒,你应该以SYS的身份执行
下面的过程:

   EXECUTE DBMS_ADVISOR.SET_DEFAULT_PARAMETER
    ('ADDM','DBIO_EXPECTED',8000);


五. 通过Oracle Enterprise Manager来访问ADDM:


六. 诊断与ADDM相关的问题: 
为了诊断数据库性能问题, ADDM分析可以跨越任意两个snapshots,只要它们满足
下面两个条件:
1. 两个快照在创建过程中没有错误并且没有被删除;

2. 两个快照期间数据库不能发生关闭和启动的事件(同statspack).

最简单的运行ADDM分析的方法就是运行Enterprise Manager.另外,也可以手工地执行 $ORACLE_HOME/rdbms/admin/addmrpt.sql以及dbms_advisor包.
这些脚本和包可以被任何用户执行,只要它们被赋予了ADVISOR的角色.

6.1 使用addmrpt.sql来运行

(译者注:和statspack包中的spreport.sql非常相似)


6.2 使用dbms_advisor包:
基本步骤:
  1) 创建一个task: dbms_advisor.create_task ;

  2) 设置相关的参数:
      START_SNAPSHOT,END_SNAPSHOT
      (通过DBMS_ADVISOR.SET_TASK_PARAMETER来完成)

  3) 执行这个task: DBMS_ADVISOR.EXECUTE_TASK

  4) 查询相关信息: DBMS_ADVISOR.GET_TASK_REPORT

可以写一个PL/SQL函数,来完成下面这些功能:
. 自动识别最接近于指定时间的snapshots
. 运行ADDM

create or replace function run_addm
(start_time in DATE,end_time in DATE)
return varchar2
is
  begin_snap number;
  end_snap   number;
  tid        number;
  tname      varchar2(30);
  tdesc      varchar2(256);
begin
  -- Find the snapshot IDs corresponding to the given input parameters
  select max(snap_id) into begin_snap
   from DBA_HIST_SNAPSHOT
    where trunc(end_interval_time,'MI')<=start_time;

  select min(snap_id) into end_snap
   from DBA_HIST_SNAPSHOT
    where trunc(end_interval_time,'MI') >=end_time;

  -- set Task name to NULL and let create_task return a unique name for
  -- this task
  tname:=' ';

  -- set description for this task
  tdesc:='run_addm( ' || begin_snap || ', ' || end_snap || ' )';

  dbms_advisor.create_task('ADDM',tid,tname,tdesc);
  dbms_advisor.set_task_parameter(tname,'START_SNAPSHOT',begin_snap);
  dbms_advisor.set_task_parameter(tname,'END_SNAPSHOT',end_snap);
  dbms_advisor.execute_task(tname);
  retuen tname;
end;
/


在SQLPLUS中调用这个函数:
时间区间: 7:00PM -9:00 PM

set pagesize 0 long 1000000 longchunksize 1000
column get_clob form a80;

variable task_name varchar(30);

begin
:task_name := run_addm(
    to_date('19:00:00 (10/20/04)','HH24:MI:SS (MM/DD/YY)'),
    to_date('21:00:00 (10/20/04)','HH24:MI:SS (MM/DD/YY)'));
end;
/

--获得addm report
select dbms_advisor.get_task_report(:task_name)
from dba_advisor_taks t
where t.task_name=:taskname
and t.owner=SYS_CONTEXT('USERENV','SESSION_USER');

注意: SQLPLUS中的系统变量long需要被设置的足够大
以便可以显示全部的ADDM REPORT,因为
dbms_advisor.get_task_report返回的是一个
CLOB.

 

七. 与 ADDM相关的视图: 
DBA_ADVISOR_TASKS
DBA_ADVISOR_LOG
DBA_ADVISOR_RECOMMENDATIONS
DBA_ADVISOR_FINDINGS

阅读(703) | 评论(0) | 转发(0) |
0

上一篇:AIX优化内容目录

下一篇:buffer cache的优化

给主人留下些什么吧!~~