不完全详解os block header

来源:互联网 发布:拜月教主 知乎 编辑:程序博客网 时间:2024/05/20 20:43

 原帖地址 http://www.killdb.com/?p=390

什么是os block header?它有哪些作用?如果它损害了怎么办?

下面是关于os block header的解释,来自MOS。The OS Block Header is in the first datafile block. It is used by Oracleto store Operating System information.
It is the Block Zero. It is not the datafile header which is in Oracle Block 1.Corruption in Block Zero will not cause damage to the data and it is not detectedby dbverify/rman. When this block is corrupted the database may be opened with noerrors. This block contains a magic number to identify the platform, the size ofthe datafile in
我这里使用bbed来进行分析,当然你也可以使用UE或dd等命令来进行操作。BBED> info File#  Name                                                        Size(blks) -----  ----                                                        ----------     1  /oracle/product/oradata/roger/system01.dbf                       61440     2  /oracle/product/oradata/roger/undotbs01.dbf                     137600     3  /oracle/product/oradata/roger/sysaux01.dbf                       32000     4  /oracle/product/oradata/roger/users01.dbf                        12800     5  /oracle/product/oradata/roger/roger1.dbf                          2560
BBED> set file 5 block 0        FILE#           5        BLOCK#          0
BBED> map /v File: /oracle/product/oradata/roger/roger1.dbf (5) Block: 0                                     Dba:0x01400000------------------------------------------------------------BBED-00400: invalid blocktype (00)
BBED> d /v File: /oracle/product/oradata/roger/roger1.dbf (5) Block: 0       Offsets:    0 to  511  Dba:0x01400000------------------------------------------------------- 00a20000 0000c0ff 00000000 00000000 l .?...?........ 66f00000 00200000 000a0000 7d7c7b7a l f?.. ......}|{z a0810000 00000000 00000000 00000000 l ?.............. 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ ........ 00000000 00000000 00000000 00000000 l ................
 <16 bytes per line>
我们可以看到大部分地方是没信息的,只有几个地方,分别是如下:
offset 1~2   00a2offset 7~8   c0ffoffset 17~18 66f0offset 22~23 2000offset 26~27 0a00offset 29~32 7d7c7b7aoffset 33~34 a081
offset 22~23 的两个byte,这里对应的是block大小,如下:SQL> select to_number(2000,'XXXX') from dual;
TO_NUMBER(2000,'XXXX')----------------------                  8192
offset 26~27 的0a00 是对应的datafile的大小,实际上是block个数,如下:SQL>  select to_char(2560,'xxx') from dual;
TO_C---- a00
SQL> ![oracle@roger ~]$ ls -ltr /oracle/product/oradata/roger/roger1.dbf-rw-r-----  1 oracle dba 20979712 Sep  4 18:09 /oracle/product/oradata/roger/roger1.dbf[oracle@roger ~]$
20979712/8192 - 1个os block header =2560
offset 29~32 的4个byte是magic number,10g版本所有平台该4个byte值都完全一样。至于说其他版本比如9i,11gR1,11gR2我还没进行测试。
[oracle@roger ~]$ dbfsize  /oracle/product/oradata/roger/roger1.dbf
Database file: /oracle/product/oradata/roger/roger1.dbfDatabase file type: file systemDatabase file size: 2560 8192 byte blocks[oracle@roger ~]$
如何才能知道下面这几个的含义呢?
offset 1~2   00a2offset 7~8   c0ffoffset 17~18 66f0
于是我想到了将该datafile resize后来进行观察,看看发生了什么改变。SQL> alter database datafile 5 resize 30m;
Database altered.
SQL>BBED> d /v File: /oracle/product/oradata/roger/roger1.dbf (5) Block: 0       Offsets:    0 to  511  Dba:0x01400000------------------------------------------------------- 00a20000 0000c0ff 00000000 00000000 l .?...?........ 66f50000 00200000 000f0000 7d7c7b7a l f?.. ......}|{z a0810000 00000000 00000000 00000000 l ?.............. 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ ........... 00000000 00000000 00000000 00000000 l ................
 <16 bytes per line> 经过一对比,我们可以发现如下规律:
f566  62822f066  61542  --->62822-61542=1280SQL> select (blocks -2560) from dba_data_files where file_id=5;
(BLOCKS-2560)-------------         1280        所以我猜测ffset 17~18 这2个byte应该是跟datafile的增长相关,单位为block。另外通过前面dbfsize的结果来看,我猜测offset 2的a2代表的应该是datafile类型。
至于其他一些offset的含义,目前我还不知道是什么意思,如果谁知道,记得告诉我。
最后来谈谈跟os block header相关的数据库恢复。如果os block header出现损坏,你可以会遇到如下错误:ORA-27047: unable to read the header block of file
出现该错误其实并不要紧,可以通过resize datafile来重新格式化os block header,关于这点大家可以参考MOS文档,如果是文件系统本身损坏了,那么可能需要用fsck等os工具去进行磁盘的修改,MOS文档如下:How to detect and fix a corruption in the datafile OS header/Block Zero - ORA-27047 [ID 360032.1]
最后补充一点,因为的我的虚拟机是linux x86,属于little 平台,所以用bbed dump出来的字节序是反的,如果觉得这样看着不方便,我们可以借助dd 和od命令来看,如下:[oracle@roger ~]$ dd if=/oracle/product/oradata/roger/roger1.dbf bs=8192 count=1 | od -x | head -41+0 records in1+0 records out0000000 a200 0000 0000 ffc0 0000 0000 0000 00000000020 f566 0000 2000 0000 0f00 0000 7c7d 7a7b0000040 81a0 0000 0000 0000 0000 0000 0000 00000000060 0000 0000 0000 0000 0000 0000 0000 0000
或者[oracle@roger ~]$ od -x -N 64 /oracle/product/oradata/roger/roger1.dbf0000000 a200 0000 0000 ffc0 0000 0000 0000 00000000020 f566 0000 2000 0000 0f00 0000 7c7d 7a7b0000040 81a0 0000 0000 0000 0000 0000 0000 00000000060 0000 0000 0000 0000 0000 0000 0000 00000000100[oracle@roger ~]$
原创粉丝点击