原文: DBA的思想天空-p20
DBWR进程执行将数据块缓冲区写人数据文件的工作,是负责缓冲存储区管理的一个0racleDBWR 的主要任务后台进程。在修改 DB Cache 中的某个缓冲区时,会将它标志为“DIRTY”是将这些标为“DIRTY”的缓冲区写人磁盘,使缓冲区保持“CLEAN”。
由于缓冲区填入数据库或被用户进程弄脏,未用的缓冲区数目会减少,最终可能导致用户进程从磁盘读入块到内存存储区时无法找到未用的缓冲区。DBWR将管理缓冲存储区,使用户进程总能得到未用的缓冲区。
Oracle采用 LRU算法(最近最少使用算法)保持内存中的数据块是最近使用的,使 IO最小。
下列情况预示 DBWR要将弄脏的缓冲区写入磁盘。
1. 当服务器进程将一缓冲区移人“DIRTY”链,此“DIRTY’链达到临界长度时,该服务器进程将通知DBWR进行写入操作。这个临界长度是数据库隐含参数_DB_BLOCK_WRITE_BATCH值的一半。
2. 服务器进程在LRU表中查找可用的数据块缓冲时,如果在查找了参数_DB_BLOCK_MAX_SCAN_CNT所定义数量的缓冲区后,仍没有查到未用的缓冲区,那么它将会停止查找,并通知DBWR进行数据写入。DBWR每次休眠时都会设置定时器,如果出现超时(每次3秒),DBWR将通知自身。当出现检查点时,LGWR将通知DBWR进行写入操作。在前两种情况下,DBWR将“DIRTY”链中的块写人磁盘,每次可写的块数由初始化参数_DB_BLOCK_WRITE_BATCH所指定。如果“DIRTY”链中没有该参数指定块数的缓冲区,DBWR将从 LRU表中查找另外一个“DIRTY”缓冲区。
3. 如果 DBWR在3秒内未活动,则出现超时。在这种情况下,DBWR对LRU表查找指定数目的缓冲区,将所找到的任何弄脏的缓冲区写入磁盘。每当出现超时,DBWR就查找一个新的缓冲区组。每次由 DBWR查找的缓冲区的数目是初化参数_DB_BLOCK_WRITE_BATCH值的两倍。如果数据库空运转,最终 DBWR会将全部缓冲区存储区写入磁盘。
4. 在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘,而DBWR负责将指定的缓冲区写入磁盘。
在某些平台上,如果有多个CPU,那么一个实例可设置多个DBWR。在这样的实例中,DB Cache 被分为多个区,每个 DBWR管理一个或者几个 DB Cache分区。这种结构可以让一些数据块写入一个磁盘,另一些数据块写入其他磁盘,从而提升并发写入的性能。参数 DB_WRITERS可以控制 DBWR 进程的个数。