Oracle - Log buffer 的相关设置

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

1. 触发LGWR 将log buffer里的数据写入日志文件的条件:

     下图这个就是lgwr进程了~
Oracle - Log buffer 的相关设置 - 饥民 - 饥民2011
 

     1.1  commit语句
     1.2  每隔3秒
     1.3 log buffer里面有大于1MB的数据未写入日志文件
     1.4 log buffer里面有大于3分1的数据未写入日志文件.
    1.5 DBWR需要写入数据的SCN大于LGWR记录的SCN, 就触发LGWR写入.

     1 - 4点之前都提过啦,也很容易理解.
     现在重点说下第5点:

     Oracle 有1个机制, 就是在写入脏buffer到dbf文件之前, 会保证把对应的日志先写入日志文件, 也就说,修改日志总是会比源数据先写入磁盘, 这就是write log header 机制.

     所以假如DBWR某个时刻需要将Buffer cache中若干个脏buffer写入dbf文件, 但是对应这些buffer的日志还存在于log buffer时, 就会触发LGWR先把log buffer里的数据写入log files.



2. log优化建议
     
在OLTP系统(要求实时相应度高)上, Redo log的写操作主要是小型的, 串行的, 而且很频繁.  一般每次写操作的大小只有几KB, 而每秒产生的写IO次数几十次以上, 甚至达千余次. 所以Redo log 文件适合放在那些IPOS(每秒IO次数)高的磁盘上. IPOS仅仅达数百次的SATA 硬盘并不合适存放Redo log files.     另外由于redo log的写操作是串行的, 所以对磁盘底层做条代化处理, 提升十分有限.

        也就是redo log的写操作有3个特点
        1) 每次写操作的大小很小, 一般只有几K
        2) 写操作很频繁. 每秒写操作次数很高.
        3) 写操作是串行的, 几乎不用寻道时间.

        所以redo Log文件十分适合放在固态硬盘上(SSD), 容量不必太大, 因为归档后的文件可以放在其他硬盘.
        而又因为写操作是串行的, 所以raid 5 raid 6 对redo log的写操作无任何意义, 但是raid 01 和 raid 10 还是ok的.


3. log
buffer大小设置
     
在9i及之前的版本, log buffer的大小一般设为3 MB.
        10g 开始,  Oracle开始自动管理log buffer 的大小,  但是有个规则, 就是令 "Fixed SGA Size" + "Redo Buffers" 的大小约等于 "Granule Size"大小的整数倍.

        可以用下图sql语句来查看上面3个参数的大小.
Oracle - Log buffer 的相关设置 - 饥民 - 饥民2011
 
        其中Granule在Oracle里面被成为粒度,  上图中粒度的大小就约为4MB了,  那么假如当前的SGA大小是160MB,  如果用户将其设成161MB时,  Oracle实际上会设为164MB.   SGA size必须是粒度大小的4倍啊.

        而Redo Buffers就是 redo log buffer的大小啦,  上图的值约为7MB, 加上 Fixed SGA Size的大小约等于Granule size的倍数啦~

4. log files的大概结构.
    
一般来讲日志文件并不是一个大的文件, 而是分成3组(oracle默认) 如下图
Oracle - Log buffer 的相关设置 - 饥民 - 饥民2011

  LGWR 将数据从redo log buffer 写入 logfiles 时, 首先会写第一组, 第一组写满后,会写第2组, 写满的那一组会移除去归档(压缩备份). 不断循环.

    所以实际上,  装载log files的固态硬盘大小足够存放这个3组log files就ok了.,

    可以用如下语句来查看当前数据库有log files分成多数组:
    select * from v$log
Oracle - Log buffer 的相关设置 - 饥民 - 饥民2011

  可以见到上图, 第3组的状态是current, 也就是说LGWR正在往这组log files写数据了.
 
   接下来观察Members 这个字段, 他们的值都是1, 也就是指这3个组都只有1个成员(日志文件)了.

   可以从v$logfile 中查看对应的成员(具体日志文件):
 
Oracle - Log buffer 的相关设置 - 饥民 - 饥民2011
 如上图 见到,日志文件的物理地址了. 
  而且在Group# 这个字段说明了它们分别是属于哪1个日志组.

  而实际上1个日志组是可以存有2个成员(两个日志文件的), 那么这2个存在于同1个group的日志文件就是互相备份的关系了.

   之所以需要备份, 是因为对于数据库来讲, redo log日志相当重要, 甚至比dbf文件还重要, dbf文件可以丢失, 但redo log文件丢失了就严重了. 所以生产中一般对每1个group设置两个成员, 分别存放与不同的磁盘当中, 就算其中1个磁盘挂了,  redo log还可以从另1个磁盘中找回来.


5. Redo log的一些配置
  在生产中作为1个DBA有时候会需要执行下面命令来修改日志配置:
  1. 增加1个日志组
  alter database add logfile group 5 '/opt/oracle/oradata/dbtest/redo05_1.log' SIZE 10M
 
  2. 向1个日志组添加1个日志文件
  alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4
 
  3. 删除1个日志组
  alter database drop logfile group 5

  4. 删除1个组里面的日志文件:
  alter database drop logfile  ('/opt/oracle/oradata/dbtest/redo05_1.log','/opt/oracle/oradata/dbtest/redo05_2.log')

      如果你需要将1个logfile 转移到另1个磁盘, 那么可以执行第4条语句把这个logfile删除, 然后执行第2条语句新建1个logifle. 路径指向另1个磁盘就ok了.

 6.  REDO LOG 切换的时间应该尽可能的不低于10-20 分钟

    我们都知道redo log files分组的, 当第一组写满时, 就会切换到另1个组,  而在生产中我们希望10 - 20分钟切换一次.

    也就是说尽量把从开始写1个日志组到写满这个日志组的时间控制在10 ~ 20分钟内,  这就根据服务器的繁忙程度来调整了, 调整什么呢?  ... 调整日志文件大小啦~

     可以用如下命令来查看日志切换的时间:
select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history
   如下图:
Oracle - Log buffer 的相关设置 - 饥民 - 饥民2011

每两个first_time 的差就是切换时间啦.
 






























posted @ 2013-04-02 00:57  Gateman  阅读(775)  评论(0编辑  收藏  举报