切出的归档日志小于设置的redo大小

数据库产生大量的小日志,原因和log_buffer的大小和redo log file size有关。为了说明这个问题,我们先来看看从log buffer开始写redo log file的过程:

(1)写redo log buffer

在pga中产生redo entry(即change record,包含data change vector和undo change vector),服务器进程需要先获取redo copy latch,接着再获取redo allocation latch,分配log buffer。在分配的log buffer 之后,释放redo allocation latch,然后再将redo entry写入到log buffer,最后释放redo copy latch。

(2)redo strand

为了减少redo allocation latch的等待,提高并发,orale将redo buffer分成若干小的buffer,每份小的buffer叫strand(我们姑且称其为public strand,因为在10g之后,在shared pool中又划了一块private strand区域,我们先不讨论private strand。),每个strand有一个redo allocation latch保护。使得log buffer的分配从单个变成并发。

redo strand的个数为cpu_count/16,因此,在某些高cpu_count的环境下,redo strand的个数就会比较多了。在一个cpu_count为256的环境中,redo strand为16个。

(3)写log file

完成redo copy之后,进程需要获得Redo Writing Latch去检查lgwr是否active,如果已经active,则释放redo writing latch。lgwr负责将redo buffer中的信息写入到redo file,触发条件为超时3秒,3分之一满logbuffer,commit等等。

注意log file的大小和log buffer之间有密切关系影响log file的大小,也影响后续的archive log的大小。

(4)log file size 和log buffer size

log file size的大小由建redo的时候设置,这个大小可以人为的设定。

log buffer size的大小,即为public strand的总大小,即log buffer大小=每个strand的大小×strand的个数。

而log buffer 可以设置,也可以不设置,在默认没有显式设置的情况下,log buffer的每个strand的大小=128k×cpu_count。而设置了log buffer的大小之后,log buffer大小=每个strand的大小×strand的个数,这个等式还是成立,strand的个数不变,只是每个strand的大小改变了。

我们来看看某数据库的情况:

b)在显式设置log_buffer的情况:

c)改变log_buffer的大小,再次检验每个strand的大小、strand的个数如何变化:

由于log file是lgwr写log buffer到文件,因此他们之间有对应的关系,当切换一个日志到新的日志时,我们分两种情况进行讨论:

因此,综上所述,我们的总体原则是让log file size 大于log buffer size,而log buffer size的大小由于和CPU有关,目前的主机性能非常强大,几百个CPU已经是很正常的现象,所以算出来的默认的log buffer往往会很大,我的建议是100G左右的SGA,大约显式的设置log buffer为96M或者128M。当然,这只是一个参考值,如果有log buffer space的等待,那还是得继续加大log buffer。

参考文档:

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据