ITPub博客

首页 > 数据库 > Oracle > 归档日志远远小于在线日志的理解

归档日志远远小于在线日志的理解

原创 Oracle 作者:lusklusklusk 时间:2016-12-14 21:25:11 0 删除 编辑

结论是不管是RAC或非RAC环境中archivelog归档日志的大小都不是必须等于重做日志大小的,一般会略微小于redo log size ,但是也不排除远远小于的情况。

造成这种现象的几点原因:

1.       内部算法决定了何时切换日志(非ARCHIVE_LAG_TARGET)

2.        较高的CPU_COUNT 参数,因为cpu number 决定了redo strands (ncpus/16)的个数

 

 

 

 

日志浪费率

假设标准块大小为512字节,在一次写入操作中一共要写入1036字节数据,那么就需要3个标准块,尽管第三个块没有被写满,但是SGA中redo log写入的指针会跳转到下面一个块,这里的第三个块剩下的空间就被浪费了,这就是redo wastage

 

 

日志结尾空白

如果redo log file中是以空白结尾,那么,archive log file中会将末尾的空白去除,这就样就会出现archive log比redo log file小,具体小多少,就根据归档时redo log file末尾的空白大小决定。比如在进行强制切换日志的时候,redo log file是没有被写满的,文件的末尾必然存在空白。

 

 

内部算法

 另外,日志切换并不是发生redo log file 100%满的时候,这是由于oracle的内部算法决定的,这样做的主要目的是处于性能的考虑。所以redo log file始终不会被100%的写满,在进行归档的时候,末尾的空白会被丢弃,所以就导致了archive log file小于redo log file。

 

 

 

CPU_COUNT和redo strand

归档日志的大小是真实的在线日志文件的使用量,也就是在线日志文件切换前其中写入的内容的大小。

但是为了更好的并行减少冲突(redo allocation latch的等待),oracle会按每16个CPU分一股(strand), 每一股strand有一个redo allocation latch保护。使得log buffer的分配从单个变成并发。每一股strand独立从redo buffer以及redo log中分配一块空间,当这一块redo buffer用完,会写入redo log并且继续从redo log中分配相同大小的空间,如果无法分配空闲空间就会进行日志切换,而不管其他strand是否写完。

 

下面举例子来说明这个算法:

比如CPU的个数是64个,则会有64/16=4个strand

例1)当log buffer的大小和redo log file的大小都是256M的时候,则每个strand都是256M/4=64M。每一个redo log file被启用时,会预先将redo log file中的大小分配出4个64M与log buffer对应,如图:

因为log buffer的大小和redo log file的大小都是256M,则redo log file没有剩余的未分配的空间了。每个进程产生的redo会分配到log buffer上的1,2,3,4其中的某一个strand上,单个进程只能对应一个strand,这样当数据库中只有某些进程(比如极端的情况,只有某一个进程)产生的redo很多的时候,其中一个strand会快速写满,比如图中的strand 1:


写满之后LGWR会将log buffer中strand 1的内容写入到redo log file中,并且试图从redo log file中分配一个新的64M空间,发现没有了,则将所有strand中的内容写入日志,并作日志切换。

这样,可能会导致redo log file只写入了一个strand的内容,其他部分几乎是空的,则产生的archive log会只接近64M,而不是256M。

当CPU_COUNT很大时,这个差值会更大。


 

 

 

例2)当log buffer的大小是256M,而redo log file的大小是1G的时候,每个strand还是256M/4=64M。

每一个redo log file被启用时,会预先将redo log file中的大小分配出4个64M与log buffer对应,如图:


这时,redo log file中还有1G-256M=768M剩余的未分配的空间。

如果strand 1写满之后,LGWR会将log buffer中strand 1的内容写入到redo log file中,并且试图从redo log file中分配一个新的64M空间,然后不断往下写。


直到redo log file中再没有可分配空间了,则将所有strand中的内容写入日志,并作日志切换。

 

 


 

例3)当log buffer的大小是256M,而redo log file的大小是100M的时候,每个strand还是256M/4=64M。

但是redo log file中的空间会按strand的个数平均分配,也就是每块100M/4=25M。


这样,当每个strand中的内容写到25M的时候,就会日志切换,而不是64M。

相当于log buffer中的一部分空间被浪费了。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30126024/viewspace-2130602/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Welcome to Lukes DB HOME。 Oracle OCM、Mysql OCP, 10年DBA工作经验,博客仅记录自己的一个学习过程,不代表完全准确,如有需要,欢迎转载。

注册时间:2015-02-02

  • 博文量
    348
  • 访问量
    1175028