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倍,验证了上诉理论。