Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1179604
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2007-12-26 11:22:38

log buffer空间的使用机制

    SGA中的日志缓冲在内部分为日志块使用。log_buffer参数必须是日志块大小的倍数,在某些os上,这个值会在实例系统时被round为恰当的值。在大多数时间,日志缓冲中的每个块被映射到在线日志文件的一个块上。

如下:

   

    日志缓冲将一直以这种方式循环直到i映射到日志文件的最后一个块。其中b指示的是在日志切换后,映射到缓冲的基磁盘块是block 2。

 

LGWR写的时间

    有两种类型的LGWR写,后台写和同步写,不同他们都要求其他进程必须等待他们完成。

    LGWR后台写可以由以下两种方法之一触发。当一个进程在日志缓冲中分配空间时,将计算使用的日志缓冲块数。该计算是基于上面的两个sga变量,并且在redo allocation latch保护的情况下执行。如果使用的块数大于等于_log_io_size参数声明的值,并且LGWR当前未活动,那么LGWR将会被唤醒以执行后台写。_log_io_size默认为1/3的缓冲大小。使用使用的日志缓冲数超过了该值,那么redo allocation latch将会被释放并且将使用redo writing latch检查lgwr是否为active。

    在lgwr等待被唤醒时,将在rdbms ipc message上沉睡,直到3秒过时。如果超时后并且LGWR发现有一些重做可写,那么后台写将会执行。

    日志同步写通常发生在事务的结尾。并且除非包含提交标记的日志块被刷新到磁盘,否则事务将不可恢复。因此进程在完成事务继续前,必须等待lgwr刷新块到磁盘上。进程因此唤醒LGWR并在log file sync上沉睡直到1秒超时。如果多个提交在不同事务中发生,那么这些提交标记将会以一个同步写刷新到磁盘。称为组提交。

    等待日志同步写的其他唯一进程只有DBWn,除非那个块的最近改变的重做被刷新到重做日志文件,否则DBWn将无法写块到磁盘。因此如果在重做写之前实例失败,将没有办法回滚未提交的改变,因为相应于撤销的重做没有被写入,而且已经是相同的撤销写重做条目的一部分。

    为了防止这种情况,Oracle在缓冲头结构的每个当前模式数据库块维护一个最近改变。其存储为RBA(重做块地址),由日志文件序列号,日志文件块号,和偏移量组成。在缓冲头结构中有三种重做块地址--low RBA, the recovery RBA and the high RBA。此时使用的是high RBA。在dbwn批量写入数据库块时,DBWn将寻找需要同步的最高high RBA。然后得到redo allocation latch确保请求的块地址已经被写入日志文件。否则将唤醒LGWR并在log file sync上等待。

 

log buffer太小的提示

    如果日志缓冲太小,在重做日志产生期间将发生log buffer space等待,LGWR可能停止开始写重做除非_log_io_size的阈值扩展,并且在LGWR完成写并释放一些空间之前日志缓冲的剩余空间可能已经被填充。

    事实上,日志缓冲应该足够大以处理所有产生的重做日志,而不会产生任何的log buffer space等待。通常在日志切换后会产生大量的重做,在那段时间里会禁止重做的产生,因此会聚集起来同时要求分配日志空间。

log buffer太大的提示

    如果日志缓冲太大,那么_log_io_size的阈值也将很大,后台写也将很少被激活。这意味着所有的重做都将是以sync被刷新出去的,log file sync将花费比其他更多的时间。这会影响commit的响应时间,同时也会影响dbwn。

 

_log_io_size的设置

    通常在log buffer space和log file sync之间不必花费太多的时间进行调整。可以同时具有很大的log_buffer避免log buffer space等待,较小的_log_io_size最小化log file sync等待并减少延迟。

    但是_log_io_size参数也不能太小以至于使LGWR过分活跃,LGWR在每次写之前/之后都将使用redo allocation latch,如果LGWR过分活跃,将会增加redo allocation latch的竞争,同时也会浪费CPU在很多小的重做写上,并且频繁的运行也将调用额外的上下文切换。这些都会导致LGWR 系统优先级的下降,从而降低LGWR的性能。

    对于裸日志文件,或者使用直接IO的文件系统,_log_io_size的最优值通常是刚好小于OS支持的最大物理I/O;对于不使用直接IO的,通常稍微更小一点比较合理;

    _log_io_size参数的设置必须以块为单位,而log_buffer则是以字节为单位设置的。而且理由说设置较小的_log_io_size浪费较大的log_buffer设置。而且重做缓冲占的内存一般都很小。

阅读(2157) | 评论(1) | 转发(0) |
0

上一篇:sga详解

下一篇:ora-12535问题

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

chinaunix网友2008-01-13 15:53:56

图呢?