oracle 产生awr 报告

数据库的性能分析大致分为2类:
1.会话级别 如果能确定某个会话性能问题(也可能是某个用户向你提出的一个操作缓慢的申告),就针对会话做分析。最常见的分析是对这个会话做一个sql_trace或者10046事件,通过trace文件来定位问题所在。
2.系统级别、实例级别;如果确定会话有问题就从实例级别来分析问题所在。可以查看一些动态视图比如v$sysstat,v$system_events;为了查询实例里面的整体性能情况可能要查询多方面的信息:如sql比如i/o比如等待,需要查询非常多的视图。oracle 10g下的性能采集工具:AWR(Automatic Workload Repository)自由运行在oracle的后台进程自动、定期收集数据库的性能数据,并将其数据保存起来,每1小时awr会生成一次性能数据快照,为DBA提供某个时刻的数据库性能分析处理信息。
这个目录一定要记住:
$ORACLE_HOME/RDBMS/admin;它下面有许多的sql脚本,用于管理数据库的;
awr的脚本就是:awrrpt.sql
oracle@/opt/oracle/product/10.2.0/db_5/RDBMS/ADMIN$ sqlplus / as sysdba @awrrpt.sql;
Statspack报告:在$ORACLE_HOME/RDBMS/ADMIN/下的cpcreate.sql
/opt/oracle/product/10.2/db_1/rdbms/admin这个是它的管理目录

它的oracle家目录就是/opt/oracle//product/10.2/db_1/
%%%
oracle@linux-lsdx:~/product/10.2/db_1/rdbms/admin> sqlplus / as sysdba @awrrpt.sql
SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 9月 6 21:03:19 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options


Current Instance
~~~~~~~~~~~~~~~~

   DB Id    DB Name      Inst Num Instance
----------- ------------ -------- ------------
 1242342279 ORCL                1 orcl


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:
%%%
Enter value for report_type:

Type Specified:  html


Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
* 1242342279        1 ORCL         orcl         linux-lsdx

Using 1242342279 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:
%%%
Enter value for num_days: 1

Listing the last day's Completed Snapshots

                                                        Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
orcl         ORCL              3037 06 9月  2010 00:00     1
                               3038 06 9月  2010 01:00     1
                               3039 06 9月  2010 02:00     1
                               3040 06 9月  2010 03:00     1
                               3041 06 9月  2010 04:00     1
                               3042 06 9月  2010 05:00     1
                               3043 06 9月  2010 06:00     1
                               3044 06 9月  2010 07:00     1
                               3045 06 9月  2010 08:00     1
                               3046 06 9月  2010 09:01     1
                               3047 06 9月  2010 10:01     1
                               3048 06 9月  2010 11:00     1
                               3049 06 9月  2010 12:00     1
                               3050 06 9月  2010 13:00     1
                               3051 06 9月  2010 14:00     1
                               3052 06 9月  2010 15:00     1
                               3053 06 9月  2010 16:00     1
                               3054 06 9月  2010 17:00     1
                               3055 06 9月  2010 18:00     1
                               3056 06 9月  2010 19:01     1
                               3057 06 9月  2010 20:00     1
                               3058 06 9月  2010 21:00     1

 

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap:
%%%
3039

3040
两个时间点的awr
指定路径/tmp/myawr20100906.html
就生成了一个报告出来;
另外oracle还提供了一个脚本awrrpti.sql使用这个脚本可以直接生成其数据库或者其它数据库实例上的awr报告;
oracle@linux-lsdx:~/product/10.2/db_1/rdbms/admin> ll awrrpti.sql
-rw-rw---- 1 oracle oinstall 7575 Apr 18  2005 awrrpti.sql
@@@@@@

常见的等待事件:
1> buffer busy waits;
这个事件产生仅仅说明了一个会话在等待一个buffer(数据块),但是导致这现象的原因有许多种,常见的2种是:
1。当一个会话试图修改一个数据块,但这个数据块正在被另一个会话修改时;
2。当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读取到内
oracle操作的最小单位是块(block),即使要修改一条记录,也需要对这条记录所在的这个数据块做操作。当对这个数据块做修改时候,其它会话将被阻止对这个数据块上的数据做修改(即使其他用户修改的不是当前用户修改的数据)但是可以以一致性的方式来读取这个数据块。当前用户修改完这个数据块后,将会立即释放掉加在这个数据块上的排他锁定,这样另一个会话就可以继续修改它,修改操作时一个非常短暂的时间,这种加锁的机制,叫latch;
当会话修改一个数据块时,是按照以下步骤来完成的:
1。以排他的方式获得这个数据块(latch);
2。修改这个数据块;
3。释放latch;
buffer busy waits等待事件常见于数据库中存在热块的时候,当多个用户频繁地读取或者修改同样的数据块时,这个等待事件就会产生。如果等待事件很长,我们就通过AWR或者Statpack报告中可以看到。
这个等待事件包含3个参数:
File#:等待访问数据块所在的文件id号;
Blocks:等待访问的数据块号;
Id:在10g之前,这个值表示一个等待事件的原因,10g以后则表示等待事件的类别;
存中;

¥¥¥¥
2> buffer latch
内存中数据块的存放位置是在一个Hash列表(cache buffer chains)当中的。当一个会话需要访问某个数据块时,它首先要搜索这个Hash列表,从列表中获得数据块的地址,然后通过这个地址去访问需要的数据块,这个列表oracle会使用一个Latch来保护它的完整性。当一个会话需要访问列表时,需要获取一个Latch,只有这样,才能保证这个列表在这个会话的浏览中不会发生改变。
产生buffer latch的等待事件主要原因是:
1。buffer chains 太长,导致会话搜索这个列表花费时间太长,使其他的会话处于等待状态;
2。同样的数据块被频繁访问,就是我们通常说的热块问题。
如果buffer chains 太长,我们可以使用多个buffer pool 的方式来创建更多的buffer chains,或者使用参数DB_BLOCK_LRU_LATCHES来增加Latch的数量,以便更多的会话可以获得Latch。这两种方法可以同时使用。
等待事件包含两个参数:
latch addr:会话申请的Latch在SGA中的虚拟地址,通过以下sql语句可以根据这个地址找到Latch名称;

select * from v$latch a,v$latchname b where addr=latch addr and a.latch#=b.latch#;

chain#:buffer chains hash 列表中的索引值,当这个参数的值等于s 0xfffffff时,说明当前的会话正在等待一个LRU Latch;

3> control file parallel write
当数据库有多个控制文件的拷贝时,oracle需要保证信息同步地写到各个控制文件当中,这是一个并行的物理操作过程,因此控制文件并行写,当发生这样的操作时,就会产生control file parallel write 等待事件。
控制文件频繁写入的原因有很多,比如:
1。日志切换太过频繁,导致控制文件信息相应地需要更频繁更新。
2。系统i/o出现瓶颈,导致所有的i/o出现等待。
当系统出现日志切换过于频繁的情形时,可以考虑适当地增大日志文件的大小来降低日志切换的频率。
当系统出现大量的control fileparallel write 等待事件时,可以通过比如降低控制文件的拷贝数量,将控制文件的拷贝存放在不同的物理磁盘上的方法来缓解i/o征用。
等待事件包含三个参数。
1。file:oracle 要写入的控制文件个数。
2。Blocks:写入控制文件的数据块数目。
3。Requests:写入控制请求的i/o次数。

4>control file sequential read
当数据库需要读取控制文件上的信息时,会出现这个等待事件,因为控制文件的信息是顺序写的,所以读取的时候也是顺序的,因此为控制文件顺序读,它经常发生在以下情况:
1。备份控制文件。
2。RAC环境下不同的实例之间控制文件的信息共享。
3。读取控制文件的文件头信息。
4。读取控制文件的其它信息。
这个等待事件包含以下3个参数:
File#:要读取信息的控制文件的文件号。
Block#:读取控制文件信息的起始数据块号。
Blocks:需要读取的控制文件数据块的数目。

5>db file parallel read
这是一个容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行DML)没有关系。这个事件发生在数据库恢复的时候,当有一些数据块需要恢复的时候,oracle会以并行的方式把他们从数据文件中读入到内存进行恢复操作。
这个等待事件包含三个参数。
Files:操作需要读取的文件个数。
Blocks:操作需要读取的数据块个数。
Requests:操作需要执行的i/o次数。

6>db file parallel write
这是一个后台等待事件。同样和用户的并行操作没有关系,由后台DBWR进程DBWR产生的,当后台进程写入脏数据块的时候,会产生这个等待。DBWR 会批量将脏数据并行写入到磁盘的相应数据文件中,在这个批次作业完成之前,DBWR将出现这个等待事件。如果仅仅是一个等待事件,对用户的操作并没有太大影响,当伴随出现free buffer waits 等待事件,说明此时内存中可用的空间不足,这时候将会影响到用户的操作,比如影响到用户将数据块读入到内存中。
当出现db file parallel write 等待事件时候,可用通过启用操作系统的异步I/O方式来缓解这个等待。当使用异步I/O时,DBWR不再需要一直等待数据块全部写入到磁盘上,它只需要等到数据写入到一个百分比之后,就可以继续进行后续操作。
这个等待事件包含2个参数:Requests:操作需要执行的I/O次数;Timeouts:等待的超时时间;

7>db file scattered read
这个等待事件在实际生产数据库中经常可以看到,这是一个用户操作引起的等待事件,当用户发出每次I/0需要读取多个数据块这样的SQL操作时,会产生这个等待事件,最常见的是2种情况全表扫描(FTS,Full Table Scan)和索引快速扫描(IFFS,Index Fast Full Scan)。
这个名称的scattered(发散)可能会导致很多人认可它是scattered的方式来读取数据块的,其实相反,当发生这种等待事件时,SQL的操作都是顺序读取数据块的,比如FTS或者IFFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。
其实这里scattered指的是读取的数据块在内存中的存放方式,它们被读取到内存中后,是以分散方式存放在内存中的,而不是连续的。
db file scattered read 包含3个参数:
File:要读取的数据块所在数据文件的文件号;
Block#:要读取的起始数据块号;
Blocks:需要读取的数据块数目;

8>db file sequential read
这个等待事件在实际生产数据库中非常常见,当oracle需要每次I/O只读单个数据块这样的操作时,会产生这个等待事件。最常见的情况有索引的访问(除IFFS以外的方式),回滚操作,以ROWID的方式访问表中的数据,重建控制文件,对文件头做DUMP等。
这里面的sequential(顺序)也并非指的是oracle按照顺序的方式来访问数据,和db file scattered read 一样,它指读取数据块在内存中医连续方式存放的,不用误导。
这个等待事件包含3个参数:
File#:要读取的数据块所在的数据文件的文件号;
Block#:要读取的起始数据块号;
Blocks:需要读取的数据块数目(在这里应该等于1);

9> db file single write
这个等待事件只发生在一种情况下,就是oracle更新数据文件头信息时(比如发生checkpoint)
当这个等待事件很明显时,要考虑是不是数据库的数据文件数量太大,导致oracle需要花较长时间来做所有文件头的更新操作(checkpoint)。
包含3个参数:
File#:需要更新的数据块所在数据文件的文件号;
Blocks#:需要更新的数据块号;
Blocks:需要更新的数据块数目(通常来说应该等于1);

10> direct path read
这个等待事件发生在会话将数据块直接读取到PGA中而不是SGA中的情况,这些被读取的数据通常是这个会话的私有数据,所以不需要放到SGA作为共享数据,因为这样做没有意义。这些数据通常是来自于临时段上的数据,比如一个会话SQL的排序数据,并行执行过程中间产生的数据,以及Hash join,Merge join产生的排序数据,因为这些数据只对当前的SQL会话有意义,所以不需要放在SGA中。
当发生direct path read 等待事件时,意味着磁盘上有大量的临时数据产生,比如排序,并行执行等待操作,或者意味着PGA中空闲空间不足。
direct path read 包含3个参数:
descriptior address:一个指针,指向当前会话正在等待的一个direct read I/O;
first dba:descriptior address 中最旧的一个I/O数据块的地址;
block cnt:descriptor address 上下文涉及的有效buffer数量;

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

转载于:http://blog.itpub.net/23141985/viewspace-702403/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值