Oracle的体系结构(四)

基本上所有的关于Oracle的书籍中,对后台进程的描述都会涉及PMON、SMON、LGWR、DBWn和CKPT这个五个进程,但都甚少解释,为什么这五个进程很重要。

DBWn进程是负责完成对数据文件的修改的落实工作的,哪是谁负责把数据块从数据文件加载到buffer cache的?答案是服务进程(server process)。

事务没有提交,事务所涉及的对数据文件的修改是否会落实到磁盘?相信还是有人会被这个问题绕进去。我们姑且不论答案是什么,这个问题,其实可以用另一个方式来问,事务的提交和写数据文件有什么关系?

答案是,事务是否提交与修改是否是落实磁盘没有关系。想象一个场景,一个insert操作,需要写100G的数据到数据文件中,但是buffer cache指有1G的大小。这里延伸出另一个很有意思的问题,假设数据文件本来只有1G的,进行insert操作后(没有提交),数据文件被撑到100G,如果roll back,数据文件是否会收缩?答案还是否定的,因此roll back只是逻辑上的roll back,并不是物理上的。

继续上面的问题,既然事务提交的并不会保证同时完成对数据文件的修改,那如何保证不丢失已久提交的数据。答案是日志,事务提交时,DB会等到LGWR把log buffer中的所有东西都落实到了log file上是才会给到client提交已久成功的信息。

教科书上告诉我们,有很多触发LGWR的条件,比如,commit,log buffer的内容大于1m,log buffer 1/3满等,但是,你思考过吗,为什么要定义这些触发条件,出发点是什么?为了更好的理解的这个问题,可以尝试理解另一个问题:commit和roll back哪个操作更快一些?或者这样问,一个会产生100G的日志的insert操作,与另一个只有1M日志产生的insert相比,他们提交事务的时间差别大吗?

有了上面的基础,CKPT的存在就变的理所当然了。因为,因为,因为,数据文件写和日志文件写是异步操作。如果没有CKPT,DB crash之后的恢复时间将是不可预测的。

思考:数据块中的scn和数据文件头中的scn有什么关系?


-- 待续



你可能感兴趣的:(Oracle的体系结构(四))