##############################
www.ludatou.com 大头
转载请指明处,否则追究法律责任
##############################
了解oracle的偏移量可以帮助在一些特殊恢复场景时候急救需求用到。
关于oracle 偏移量在10g之前一直是DBA需要惦记的事情,曾经有一个在AIX平台存在的经典bug2620053就是因为关于在裸设备上偏移量的问题,在那个时代DBA在aix系统普遍使用裸设备,每次加数据文件总是要考虑到offset的问题。
在众多平台中,目前只有在AIX平台上在为Oracle使用裸设备时候,会预留出4k的空间保留裸设备元数据,俗称磁盘头(lv header)。而在以前HP TRU64也存在一样的情况,只是目前TRU 64已经不受Oracle支持了。
在每一个oracle文件都存在一个系统文件头(block 0),它们由oracle维护,数据文件上的BLOCK 0的大小等于该数据文件的block_size,而重做日志文件上的BLOCK 0除了hp平台为1M外其他都为512bytes(具体可以通过dump logfile,通过tracefile的block_size查出)。BLOCK 0之后的BLOCK 1就是Oracle header block。这里的BLOCK 1的offset就等于v$datafile中的block1_offset。
在正常情况下,不算上AIX,HP tru64的平台中使用裸设备的话,实际的oracle数据的byte offset通用计算方法如下:
byte offset=oracle_block_number * oracle_block_size (对应文件上的block number) 另外一种算法是 byte offset=block1_offset + 1 + ((oracle_block_number - 1) * oracle_block_size) 因为严格意义上讲,block1_offset并不是oracle真实数据的起始块,这两种结果都一样,只是从意义上区分开来了。
在AIX,HP tru64系统上使用裸设备的情况下,byte offset计算方法如下:
offset = raw_device_block0_offset + 1 + (oracle_block_number * oracle_block_size)
其实到这里就可以看出来了,在AIX平台上,当使用裸设备时候(这里的裸设备不是使用-T -O的big vg或者scan vg划分出来的lv),脱离了文件系统管理,file_syatem_block0_offset为0。只有在使用文件系统存放oracle文件的时才存在file_syatem_block0_offset为对应的blocksize或者redoblocksize。
AIX平台裸设备offset:
raw_device_block0_offset = 4096 file_system_block0_offset = 0
HP tru64平台裸设备offset:
raw_device_block0_offset = 65536 file_system_block0_offset = 0
从oracle 9203开始,Oracle就建议使用rlv这种不带raw_device_block0_offset的类型裸设备(lv),具体信息参考
《关于aix上的逻辑卷偏移量》
相比较而言,