052-16&17
16.Note the following functionalities of various background processes:
1: Record the checkpoint information in data file headers.--CKPT
2: Perform recovery at instance startup.--SMON
3: Cleanup unused temporary segments.--SMON
4: Free the resources used by a user process when it fails.--PMON
5: Dynamically register database services with listeners.--PMON
6: Monitor sessions for idle session timeout.--PMON
Which option has the correct functionalities listed for a background process?
A.Archiver Process (ARCn): 1, 2, 5
B.System Monitor Process (SMON): 1, 4, 5
C.Process Monitor Process (PMON): 4, 5, 6
D.Database Writer Process (DBWn): 1, 3, 4
17. Note the functionalities of various background processes:
1: Perform recovery at instance startup. --SMON
2: Free the resources used by a user process when it fails.--PMON
3: Cleanup the database buffer cache when a process fails.--PMON
4: Dynamically register database services with listeners.--PMON
5: Monitor sessions for idle session timeout.--PMON
6: Cleanup unused temporary segments. --SMON
7: Record the checkpoint information in control file.--CKPT
Which option has the correct functionalities listed for a background process?
A.Checkpoint (CKPT): 1, 2, 5
B.System Monitor (SMON): 1, 6
C.Process Monitor (PMON): 4, 6, 7
D.Database Writer (DBWR): 1, 3, 4
首先看一下 Oracle体系结构详解
SMON(System Monitor):安装和打开数据库,实例恢复也是由此进程完成的
PMON(Process Monitor):进程监视器,主要监视服务器进程。前面提到过,专有服务器体系模式下,用户进程和服务器进程是一对一的关系,如果某个会话发生异常,PMON会销毁对应的服务器进程,回滚未提交的事务,并回收会话专有的PGA内存区域。
CKPT(Checkpoint Process):CKPT负责发起检查点信号,手动设置检查点的语法:
1
|
SQL> alter system checkpoint ; |
检查点可强制DBWn写入脏缓冲区,当数据库崩溃后,由于大量脏缓冲区未写入数据文件,在重新启动时,需要由SMON进行实例恢复,实例恢复需要提取和应用重做日志记录,提取的位置就是从上次检查点发起的位置开始的(检查点之前的数据已经被强制写入到数据文件中去了),这个位置称为RBA(redo byte address),CKPT会不断将这个位置更新到控制文件中去(以确定实例恢复需要从哪儿开始提取日志记录)。
数据库写入器(DBWn)
数据库写入器是Oracle的一个后台进程,所谓后台进程是相对于前台进程(服务器进程)来讲的。DBWn的"n"意味着一个实例是可以有多个数据库写入器的。
作用:简而言之,DBWn的作用就是将变脏了的缓冲区从数据库缓冲区缓存中写入到磁盘中的数据文件中去。
数据库缓冲区缓存这块内存区域和数据库写入器这块是比较重要的概念,别的数据库产品像mySql也都有对应的实现,只不过叫法不一样罢了。了解这块的时候,要时刻意识到会话是不会直接更新磁盘数据的,会话的更新,插入,删除包括查询等都是先作用到缓冲区上,随后,DBWn会将其中的脏缓冲区转储到磁盘上去。
DBWn什么时候写入?
DBWn是个比较懒的进程,它会尽可能少的进行写入,在以下四种情况它会执行写入:
a.没有任何可用缓冲区(不得不写啊)
b.脏缓冲区过多
c.3秒超时(最晚3秒会执行一次写入)
d.遇到检查点,即checkPoint(检查点),检查点是个Oracle事件,遇到检查点,DBWn会执行写入。比如实例有序关闭的时候会有检查点,DBWn会将所有脏缓冲区写入到磁盘上去的,这很容易理解,要保持数据文件的一致性。
注意:
从上述DBWn的几个写入时机,我们能意识到,DBWn的写入不是直接依赖于会话的更新操作的。不是一有脏缓冲区,它就执行写入。而且,DBWn执行写入跟commit操作也没有任何关系,不要以为commit操作的影响结果会实时流入到磁盘中去。
DBWn采用极懒算法进行写入,原因我们应该要清楚:频繁的磁盘IO对系统的压力很大,如果DBWn很积极地去写入磁盘,那对系统性能的影响就太大了,换个角度想,如果DBWn很勤快的写磁盘,那么数据库缓冲区存在的意义也就不大了。
当然,讲到这儿,我们可能会意识到一个问题,DBWn如此懒地进行数据转储,如果在某一时刻,数据库缓冲区缓存内存在着大量的脏缓冲区(生产环境中,这是常态),也就是有大量的未commit和已commit的数据还在内存中,没有持久化到磁盘中,然后突然系统断电了,这种情况下,数据是不是就丢掉了?数据当然不会丢失,这就引出了重做日志(redo log)的概念,接下来,我们就来谈谈对应重做日志的内存结构和后台进程。
ARCn(Archiver)
归档进程,这个进程是可选的,如果数据库配置为归档模式,这个进程就是必须的。所谓归档,就是将重做日志文件永久保存(生产库一般都会配置为归档模式)到归档日志文件中。归档日志文件和重做日志文件作用是一样的,只不过重做日志文件会不短被重写,而归档日志文件则保留了关于数据更改的完整的历史记录。