结论是不管是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博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2130602/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30126024/viewspace-2130602/