首先介绍下DBWn(和DBWR是一个概念,DBWR就是database writer,就是写数据文件的进程, 后来允许多进程写data file,所以改成DBWn了):
DBWn:数据块写进程,负责将Oracle数据库缓冲区的脏缓冲写到数据文件内(脏缓冲是已经被修改,但未写入数据文件的数据)为了保证缓冲区能有空余缓冲供用户使用
DBWn会根据LRU(最近最少使用)算法找出相应的脏缓冲,并将其写入数据文件,初始参数DB_WRITER_PROCESSES,可以设定Oracle的DBWn进程个数(最大20)
DBWn在将脏缓冲写入的时候,一次可以写入多个数据块的数据
DBWn触发的条件:
1、当dirty list达到一定数量(阀值25%),,导致Server Proceess通知DBWn写赃数据
2、当扫描LRU list达到一定数量还未找到free buffer 时,停止搜索free buffer,直接通知DBWn写脏数据
3、checkpoint写数据
通常数据的访问和修改都是需要通过buffer cache来完成的,当一个server process访问数据的时候,首先需要确定的是,我们所需要的数据在buffer cache是否存在,如果存在我们还需要根据data buffer的状态来判断是否进行db block gets 还是consistent gets,如果不存在,则我们需要在buffer cache中寻找足够