转载

Ask Hoegh(5)——buffer cache和buffer有什么区别?

问:
Oracle数据库的SGA包含db block buffer cache和redo buffer等组件,那么,同样属于内存,buffer cache和buffer有区别吗?

答:首先我们对比一下db block buffer cache和redo buffer的概念和功能。

buffer cache,其中文名称为缓冲器高速缓冲存储器。按照oracle官方的说法,buffer cache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。
由于buffer cache位于物理文件系统和块设备驱动程序之间,因此,当物理文件系统需要从块设备上读取数据时,它首先试图从buffer cache中去读。如果命中,则内核就不必在去访问慢速的块设备。否则如果命中失败,也即数据不在buffer cache中,则内核从块设备上读取相应的数据块,并将其在buffer cache中缓存起来,以备下次访问之用。
类似地,但物理文件系统需要向块设备上写数据时,也是先将数据写到相应的缓冲区中,并将这个缓冲区标记为脏(dirty),然后在将来的某些时候将buffer cache中的数据真正地回写到块设备上,或者将该缓冲区直接丢弃。从而实现减少磁盘写操作的频率。
redo buffer,又叫Redo Log Buffer,是SGA中一段保存数据库修改信息的缓存。这些信息被存储在重做条目(Redo Entry)中,重做条目中包含了由于INSERT、UPDATE、DELETE、CREATE、ALTER或DROP所做的修改操作而需要对数据库重新组织或重做的必须信息。在必要时,重做条目可用于数据库恢复。重做条目是Oracle数据库进程从用户内存中拷贝到Redo Log Buffer中去的。重做条目在内存中是连续相连的。后台进程LGWR负责将Redo Log Buffer中的信息写入到磁盘上活动的重做日志文件(Redo Log File)或文件组中去的。参数LOG_BUFFER决定了Redo Log Buffer的大小。

接下
来,我们在对比一下buffer和cache的概念。
缓存(cache)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。 
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。 
两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的

从以上两组概念对比,我们就不难理解buffer cache和buffer的区别了。


~~~~~~~ the end~~~~~~~~~
hoegh
2016.02.29
正文到此结束
Loading...