oracle internals

一、log block size

尽管 redo log 条目是按字节计量的, lgwr 在写日志文件的时候是以块为单位的。 redo log block 的大小是固定的,并且因操作系统而异。 oracle 的文档用 "operation system block size" 来代表日志块的大小。正常情况下,它是操作系统支持的最小的裸设备的 i/o 大小,但是在一些特别的操作系统上,它是文件系统最小的 i/o 的大小。下表是一些通用的 log block size 和支持他们的操作系统。
log block size            operation systems
512 bytes               solaris aix windows nt/2000 linux irix dg/ux openvms netware unixware dynix/ptx
1024                   hp-ux tru64 unix
2048                   sco unix reliant unix
4096                   mvs mpe/ix
log block size 对于 log_checkpoint_interval ,_log_io_size max_dump_file_size 参数的设置非常重要,因此,他属于你必须知道的常量之一。如果你的操作系统不再上面的列表当中,你可以用下面的语句查到相应的大小。
select max(lebsz) from sys.x$kccle;
log block size 也可以从 statspack 的报表中看到。每个 log block 有一个 16 字节的 header ,数据区的大小为 redo size redo log 的大小)加上 redo wastage (为保持格式浪费的空间)除以实际写入的块的数量。公式可以表示如下:
   16+(redo size +redo wastage)/redo block written
这个公式可能会和 log block size 有几个字节的小,因为它不允许 redo log 产生而没有写入的状况,并且 redo size 统计信息通常也不会非常精确。

二、log buffer usage

Oracle log buffer 内部被分成很多块。 Log buffer 中的每一个 active block 和在线 log file block 对应。 Log buffer log file 块的大小平台相关和数据库的 database block size 无关。 Log buffer blocks 循坏使用,直至 log buffer 当中的块对应到 log file 的最后一个块。
下图当中, log buffer 100 个块。 Log switch 后, sga 的变量 b 被设置成 log buffer 可以写入的 log file 的当前标志,下图为 2 。另一个 sga 的变量 i 杯设置成 log buffer 的当前写入标志,下图为 30 。一段时间以后,好几个 log 被写入当前的 log file 。产生的日志循坏用尽 log buffer 的剩余块然后从头开始。变量 b 已经到 log file 82, 对应到 log buffer 81 log buffer 的标志 i 5 i 对应的 log file 已经到 106 Log buffer 按照这样的方式循坏使用直至 i 对应到 log file 的最后一个块。
    
Sga 的变量 b i 是用 redo allocation latch 保护起来的。这样以来 redo allocation latch 不仅在产品日志所需分配 log buffer 空间的时候需要用到,而且在写完 log buffer 之后可以标示其可用空间。
根据 bug 182447 ,变量 b i 应该在内部被称为 kcrfsfbb kcrfsfi 。它们都在 kcrfsg 结构当中。

 

你可能感兴趣的:(oracle,log,buffer,redo,休闲)