log buffer

      log buffer 是SGA中一块循环使用的内存区域,它一般很小,因为有4个条件能够触发log buffer 中的redo 写入到log file中,缺省的设置为512kb,或者128kb*cpu_count (cpu_count由ORACLE自动设置,一般不需要更改)的最大值。

在10g中ORACLE会自动调整它的值,他遵循这样一个原则,log_buffer+fixed size 是granule size 的整数倍(其实不能完全的说是整数倍,如果是一倍,那么他们的比值可能为0.999...如果是2倍,那么他们的比值可能是1.999......以此类推)。

一般的granule value 为4194304 ,也就是4m,而fixed size 一般为 1.2m ,这个值不确定,也不精确,根据不同的平台有所差异,而默认的log_buffer+fixed size 的大小为 granule size 的整数倍,所以默认的情况下你看见的log_buffer大小约为6.67m或者为2.7M。

所以如果我们手动的设置log_buffer的值,那么ORACLE会将它加上fixed size 然后除以granule ,得到一个值,然后四舍五入,看最接近哪个整数,然后就取最接近的那个值。

      其实一般默认情况下的log_buffer的大小够用了,查看Log_buffer是否需要调整,可以查看数据库是否有大量的log buffer space等待事件出现(一般通过AWR报表)。我们知道,redo log 最开始是在pga中的uga产生的(数据库一般是专有模式),oracle会把它拷贝到SGA中的log_buffer中去,如果log_buffer过小,或者lgwr不能够快速将redo 写入到log file中,那么就会产生log buffer space等待事件,遇到此类问题,可以增加 log_buffer大小,调整log file 到裸设备,I/0快的磁盘中。

      查看granule size

SQL> select * from v$sgainfo where name='Granule Size';

NAME                                  BYTES RES
-------------------------------- ---------- ---
Granule Size                        4194304 No
      查看  fixed size (show sga ,或者 v$sgainfo视图)

SQL> show sga

Total System Global Area  629145600 bytes
Fixed Size                  1262392 bytes
Variable Size             167775432 bytes
Database Buffers          457179136 bytes
Redo Buffers                2928640 bytes

SQL> select * from v$sgainfo where name='Fixed SGA Size';

NAME                                  BYTES RES
-------------------------------- ---------- ---
Fixed SGA Size                      1262392 No
SQL> select (2928640+1262392)/4194304 from dual;

(2928640+1262392)/4194304
-------------------------
               .999219894  可以看到(fixed size + log_buffer) /granule size 约为1倍,验证了上诉理论。

posted on 2009-10-26 16:37  如果蜗牛有爱情  阅读(192)  评论(0编辑  收藏  举报

导航