Oracle Database_buffer_cache大小的设置及依据

这篇文章是参考甲骨论老相老师的教学视频:
http://v.youku.com/v_show/id_XMzkyMjA5NTEy.html
所做的学习笔记

1.介绍DBWR写进程.
之前介绍过Database buffer cache的作用流程了,参考下图:
Oracle Database_buffer_cache大小的设置及依据 - 饥民 - 饥民2011

具体可以参考我之前的学习笔记:
http://nvd11.blog.163.com/blog/static/200018312201302695451760/

但上面这个流程只提到了用户客户端读取数据的流程, 并没有提到修改数据..

1.1 用户修改数据后, 对应buffer会变成1个脏buffer
 
    当用户修改数据,并且提交后, 数据就会写入对应buffer, 该buffer的数据就跟dbf文件中的block不一致了, 所以就成了1个脏buffer.
     并且这个脏buffer会被加入到database buffer cache中的 LRUW链 和 checkpoint queue链中.(参考http://nvd11.blog.163.com/blog/static/200018312201301875752730/)

1.2 这时server process就直接提示用户修改完成,可以进行下1个动作了.
      Server Process就会进行1个动作,  并不负责将这个脏buffer写入dbf文件.

1.3 负责将脏buffer写入dbf文件的是后台的DBWR进程
       而DBWR进程就会隔一段时间触发一次(例如3秒1次), 将LRUW的冷端若干个脏buffer写入dbf文件, 当然也会有其他原因会额外触发DBWR进程, 例如数据库十分繁忙, database buffer cache里脏buffer太多,  要清理一部分脏buffer才能将新的block写入database buffer cache.

1.4 将脏buffer写入dbf文件动作交由后台进程的原因.
       原因都很简单了, 因为Server process的快慢直接影响用户的使用感受,  而将脏buffer写入dbf文件的动作是1个很耗时间的物理写动作, 所以会延时分批地交由后台进程DBWR处理.   而通常物理读无法避免, 很多时候用户必须等待物理读才能得到数据,所以物理读是Server process负责的.

大概流程如下图啦:
Oracle Database_buffer_cache大小的设置及依据 - 饥民 - 饥民2011



所以DBWR是Oracle保证database buffer cache中的脏块能及时 合理地写入数据文件的一个后台进程.

1.5 查看服务器的DBWR进程:

Oracle Database_buffer_cache大小的设置及依据 - 饥民 - 饥民2011
 
 如上图那个就是dbwr进程了, 不过既然他的名字是dbw0, 也就是它可以是dbw1.. dbw2, 也就是可以存在多个dbwr进程了.

查看数据库dbwr进程个数:
Oracle Database_buffer_cache大小的设置及依据 - 饥民 - 饥民2011

可以用下面命令来设置dbwr的个数:
alter system set db_writer_processes = 2 scope=spfile;
然后重启啦

不过, dbwr个数绝不是越多越好, 一般是cpu的核心个数除以8.  也就是服务器如果有2个8核cpu的话可以考虑将dbwr个数设置为2,因为dbwr是1个十分耗cpu资源的进程啦.



2. 设置database buffer cache大小

     这个, 跟shared pool的设置很类似, 也就是有两种设置方法
     1. 设置sga_taget, Oracle会自动分配database buffer cache的大小
     2. 手动设置database buffer cache大小

     通常生产中我们会执行第2中,也就是手动的设置

2.1 查看当前buffer cache大小

     可以用下面语句来查看当前database buffer cache的当前实际大小:
select component,current_size,min_size from v$sga_dynamic_components;
如图:
Oracle Database_buffer_cache大小的设置及依据 - 饥民 - 饥民2011

可以见到
Default buffer cache就是当前的database buffer cache的大小啦
当然我这个测试数据库不正常啦, 才70m多 而我的sga_target 是628m的.

正常来讲, buffer cache的大小一般占 sga大小的1/2 到2/3
老相老师说一般直接设置在sga 2/3就ok了



2.2 设置当前buffer cache大小
一般来讲先设置sga_max_size大小. 然后设置sga_target 大小,
alter system set sga_max_size = 2G scope = both;
重启数据库
alter system set sga_target = 2G;
alter system set db_buffer_cache = 1.3G scope =both;


也可以参考Oracle db_advice来设置database buffer cache的大小:
执行如下语句:
select size_for_estimate as "Cache Size MB",
       size_factor,
       buffers_for_estimate as Buffers,
       estd_physical_read_factor est_read_fator,
       estd_physical_reads estd_phy_read,
       estd_physical_read_time est_phy_read_t
       from v$db_cache_advice
       where name='DEFAULT'
         and block_size = (select value from v$parameter
                                        where name='db_block_size');


如下图:
Oracle Database_buffer_cache大小的设置及依据 - 饥民 - 饥民2011

其中buffers列是buffer的个数啦,  倒数最后两列分别是物理读次数和物理读时间
可以看到随着buffer cache大小变大, 物理读时间不断减少,

生产中选物理读时间最小那个临界值对应的buffer cache一般就ok了.
我这个渣测试数据库没什么参考意义啦~




 

 
posted @ 2013-04-02 00:57  Gateman  阅读(1860)  评论(0编辑  收藏  举报