Oracle 日志原理剖析

这篇文章是参考甲骨论老相老师的教学视频
http://v.youku.com/v_show/id_XMzk0NjYxNzgw.html
所做的学习笔记
 

作为1个DBA, 需要学习许多数据库知识, 但是目的无非两大部分.
1. 保持数据库数据的一致性
2. 优化数据库性能


而日志系统只对应第1点,日志系统就是用来保持数据的一致性的.

我们先回顾下之前讲过的sql语句执行流程
Oracle 日志原理剖析 - 饥民 - 饥民2011

如上图.可以见到:
1. 产生日志的原因是Buffer cache里发生的数据改动.
2. buffer cache里数据改动产生的日志被写入Redo log buffer(日志缓存)里.
3. 后台进程LGWR会将redo log buffer里的日志写入到硬盘上的日志文件(物理IO)



        而且之前我们讲过,Buffer cache是由许多个大小为1个block size 的buffer组成的. 所以buffer cache里的数据改动实际上就是buffer的改动.


       从逻辑上看,我们可以假定Buffer cache存在一名记录者. 这名记录者可以实施地观察出buffer cache哪1个buffer被修改, 在那个时间点被修改, 并严格按照修改时间顺序把被修改的buffer的改动记录下来.''

如下图:
      3. 并不关心buffer是被哪个session修改的      3. 并不关心buffer是被哪个session修改的Oracle 日志原理剖析 - 饥民 - 饥民2011

     当然,实际上Database Buffer Cache中是不存在记录者这个东西的.
     不过这两个逻辑也让我们明白三点:

     1. 日志记录的单位是buffer.
     2. 严格按照buffer被修改的时间顺序来记录.
     3. 并不关心buffer是被哪个session修改的

      从实际上看, buffer cache里的buffer是被server process修改的, 一旦server process修改了1个buffer里的数据, server process就同时生成重做日志数据,并放入与该server process对应的PGA中.  然后根据一些触发条件,会将PGA里的日志写入到SGA里面的redo log buffer中,  最后会被后台进程LGWR写入到日志文件中...

      我们也可以分析出
      1. 对小量数据的多次修改可能会产生大量的日志数据.
      2. 大量的日志数据被写入到日志文件会占用大量IO资源


      这一节,老相老师只提到这几个点,  他说以后讲优化数据库时会再详细讲..
posted @ 2013-04-02 00:57  Gateman  阅读(303)  评论(0)    收藏  举报