DBWn基础

DBWn基础

Database Writer (DBWn):

根据图片我们就可以知道DBWn是一个负责把database buffer cache里的数据写入到disk的进程。

目 前为止我们其实已经介绍了很多和DBWn有关的东西。我们知道database管理数据的最小单位是data block,我们知道data block是一组OS block的集合,OS block构成了datafile,其实也就是data block组成了datafile,我们知道一个或多个datafile称为一个tablespace,在tablespace里我们每建立一张表就申请 了一个segment,当一个segment需要新的空间就添加一个extent,而一个extent就是一组连续的data block。

我 们还知道SGA中有一个内存区域叫Database buffer cache,他通过把最常用的block缓存起来,希望能够被其他的用户重(chong)用,以提高性能。我们也提过buffer cache不仅是一个读入的缓存区也是一个写入的缓存区,当用户修改一个block的时候,用户只是在buffer cache里进行了修改。我们唯一没有介绍的就是Oracle是如何把buffer cache里面被修改过的数据写入到datafile里面的。------这就是DBWn唯一需要做的工作。

DBWn < ------ > DataBase Writer n,如果你只配置一个DBWR进程,n就是0,Oracle允许你设置多达20个DBWR进程(DBW0 . . . DBW9, DBWa . . . DBWj),这个后台进程唯一的作用就是把buffer cache中的修改过的数据写入到磁盘。让我们举个例子:
1. 我要在我的表中查找name是以‘Li’开头的纪录,于是我运行:select name from sometable where name like ‘Li%’;
2. 首先Oracle检查我需要的数据block在不在buffer cache中,如果不在,则从disk把相应的block读入buffer cache。并且返回我的查询结果。
3. 我发现返回的结果是“Lii, Xinyu”,多了一个字母i,于是执行update sometable set name=‘Li, Xinyu’ where name=‘Lii, Xinyu’;
4. Oracle在内存里修改了block的内容,这时候这个block变成‘dirty’的。
5. 我输入commit; 这时候Oracle把我的这个事务相关redo信息写入磁盘-----我们很快就会涉及这部分的细节。
6. 包含name=‘Li, Xinyu’的block就留在cache里并可以被后续的用户访问,同时等待DBWn进程在需要的时候把它写入到disk。

那么,DBWn什么时候被触发呢?我们的slide上列出了很多种可能,但以下两种是最重要的:
• Checkpoint的时候
• 当我们在buffer cache中没有足够的free buffer的时候。
• 通过把数据先在cache中修改,并由DBWn后台进程在必要或方便的时候把数据写入到磁盘,可以明显提高用户修改数据的性能,因为对用户而言,当数据在内存被修改后,用户的操作就已经完成了,其他的工作由Oracle的后台进程们来保证。
• 你应该可以理解,当buffer cache中没有足够的free buffer的时候,Oracle需要从disk读取新的数据并覆盖当前buffer cache中一些block,这时候需要触发DBWn进程,因为对于dirty block你必须先把它写入disk,才能重用它所占用的buffer。

那么如果我们有足 够的free buffer,那我们还需不需要触发DBWn呢?因为如果总是把数据放在内存中,当你的server突然关机,你将会丢失所有内存中的数据!尽管 Oracle的redo log和LGWR后台进程可以保证我们有足够的redo信息来恢复你丢失的数据,但如果需要恢复的数据太多,这个恢复的过程也是比较漫长的,所以 Oracle会定期执行一个叫做checkpoint操作,这个checkpoint操作就会通知DBWn把buffer cache中的Dirty数据写入磁盘。

你可能感兴趣的:(DB)