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

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

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

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

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

 

 

 

 

日志浪费率

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

 

 

日志结尾空白

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

 

 

内部算法

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

 

 

 

CPU_COUNTredo strand

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

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

 

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

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

1)log buffer的大小和redo log file的大小都是256M的时候,则每个strand都是256M/4=64M。每一个redo log file被启用时,会预先将redo log file中的大小分配出464Mlog 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 bufferstrand 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中的大小分配出464Mlog buffer对应,如图:


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

如果strand 1写满之后,LGWR会将log bufferstrand 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博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2130602/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30126024/viewspace-2130602/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值