问题:
A . It is possible to have multiple database writers in an Oracle instance.
B . It writes dirty buffers, if any, to data files whenever a checkpoint occurs.
C . It writes dirty buffers, if any, to data files whenever a transaction commits.
D . It writes dirty buffers, if any, to data files before the log writer (LGWR) writes.
● 参考解析
数据库写进程(DBWn) 可以将缓冲区的内容写入数据文件。DBWn进程负责将数据库缓冲区高速缓存中经过修改的缓冲区(脏数据缓冲区)写入磁盘。虽然对于大多数系统来说,一个数据库写进程(DBW0) 已经足够,但如果系统需要频繁修改数据,则可以配置附加进程(DBW1到DBW9以及DBWa到DBWj)以改进写性能(A正确,可以有很多个dbwr进程)。这些附加DBWn进程在单处理器系统中没有用。
当数据库缓冲区高速缓存中的某个缓冲区被修改时,系统会将其标记为脏数据缓冲区,并将其添加到按SCN 顺序存放的灰数据缓冲区的LRUW(LRU 写)列表中。因此,该顺序与为这些更改的缓冲区写入重做日志的重做操作的顺序相匹配。当缓冲区高速缓存中的可用缓冲区的数量低于某个内部阈值(达到服务器进程发现很难获取可用缓冲区的程度)时,DBWn会将灰数据缓冲区写入数据文件,写入顺序与按照LRUW 列表的顺序修改灰数据缓冲区的顺序相同。 SGA 包含的内存结构具有重做流中的某个位置的重做字节地址(RBA),当实例发生故障时,将从该位置开始恢复。此结构充当指向重做的指针,并且由CKPT 进程按照每三秒一次的频率写入控制文件。由于DBWn按照SCN 顺序写入灰数据缓冲区,而重做按照SCN 顺序执行,因此每当DBWn从LRUW 列表写脏数据缓冲区时,还会将SGA 内存结构中保持的指针前移,以便实例恢复(如果需要)从近似正确的位置开始读取重做,并避免不需要的I/O。这称为―增量检查点‖。
注:还有其它一些DBWn可能会执行写操作的情况,例如,当表空间被设置为只读或被置于脱机状态时。在这些情况下,不会出现增量检查点,因为仅属于相应数据文件的灰数据缓冲区在写入数据库时的顺序与SCN 顺序无关。
LRU 算法将更频繁访问的块保存在缓冲区高速缓存中,这样,在将缓冲区写入磁盘时,缓冲区不大可能包含将很快有用的数据。
DB_WRITER_PROCESSES初始化参数指定DBWn进程数。DBWn进程的最大数目为20。
如果用户在启动过程中未指定该进程数,Oracle DB 将根据CPU 和处理器组的数量来决定如何设置DB_WRITER_PROCESSES。
在以下情况下,DBWn进程将脏数据缓冲区写入磁盘:
• 当服务器进程在扫描阈值数目的缓冲区之后找不到干净的可重用缓冲区时,通知DBWn执行写操作。DBWn在执行其它处理的同时,将灰数据缓冲区异步写入磁盘。
•DBWn定期写缓冲区以推进检查点。检查点是重做线程(日志)中开始执行实例恢复的位置。该日志位置由缓冲区高速缓存中最旧的脏数据缓冲区确定。
在所有情况下,DBWn均执行成批(多块)写操作以提高效率。多块写操作中写入的块数因操作系统而异。 C答案:是LGWR进程
D答案:LGWR先记,DBWR后写。
LGWR 的写入速度通常足够快,可以确保缓冲区中始终有空间可供新条目使用,即使对重做日志的访问量很大时也是如此。LGWR 将缓冲区的一个连续部分写入磁盘。 LGWR 在以下情况下执行写操作: • 用户进程提交事务处理时
• 重做日志缓冲区的三分之一已满时 • 重做日志缓冲区达到1M的redo条目
• 在DBWn进程将经过修改的缓冲区写入磁盘(如果需要)之前 • 每隔3 秒
必须在与缓冲区更改相关联的所有重做记录写入磁盘后,DBWn才可以向磁盘写入经过修改的缓冲区(先行写协议)。