不完全详解os block header
本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客
本文链接地址: 不完全详解os block header
什么是os block header?它有哪些作用?如果它损害了怎么办?
下面是关于os block header的解释,来自MOS。
1 2 3 4 5 6 7 |
The OS Block Header is in the first datafile block. It is used by Oracle to 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 detected by dbverify/rman. When this block is corrupted the database may be opened with no errors. This block contains a magic number to identify the platform, the size of the datafile in ...... |
我这里使用bbed来进行分析,当然你也可以使用UE或dd等命令来进行操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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> |
1 2 3 4 5 6 7 8 9 10 11 |
我们可以看到大部分地方是没信息的,只有几个地方,分别是如下: offset 1~2 00a2 offset 7~8 c0ff offset 17~18 66f0 offset 22~23 2000 offset 26~27 0a00 offset 29~32 7d7c7b7a offset 33~34 a081 offset 22~23 的两个byte,这里对应的是block大小,如下: |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 ###### 20979712/8192 - 1个os block header = 2560 ###### |
1 2 |
offset 29~32 的4个byte是magic number,在10g版本中所有平台该4个byte值都完全一样。 至于说其他版本比如9i,11gR1,11gR2我还没进行测试。 |
1 2 3 4 5 |
[oracle@roger ~]$ dbfsize /oracle/product/oradata/roger/roger1.dbf Database file: /oracle/product/oradata/roger/roger1.dbf Database file type: file system Database file size: 2560 8192 byte blocks |
1 2 3 4 5 6 7 |
如何才能知道下面这几个的含义呢? offset 1~2 00a2 offset 7~8 c0ff offset 17~18 66f0 于是我想到了将该datafile resize后来进行观察,看看发生了什么改变。 |
1 2 3 |
SQL> alter database datafile 5 resize 30m; Database altered. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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> |
1 2 3 4 |
经过对比,我们可以发现如下规律: f566 62822 f066 61542 --> 62822-61542=1280 |
1 2 3 4 5 |
SQL> select (blocks - 2560) from dba_data_files where file_id=5; (BLOCKS-2560) ------------- 1280 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
所以我猜测offset 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命令来看,如下: |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[oracle@roger ~]$ dd if=/oracle/product/oradata/roger/roger1.dbf bs=8192 count=1 | od -x | head -4 1+0 records in 1+0 records out 0000000 a200 0000 0000 ffc0 0000 0000 0000 0000 0000020 f566 0000 2000 0000 0f00 0000 7c7d 7a7b 0000040 81a0 0000 0000 0000 0000 0000 0000 0000 0000060 0000 0000 0000 0000 0000 0000 0000 0000 or [oracle@roger ~]$ od -x -N 64 /oracle/product/oradata/roger/roger1.dbf 0000000 a200 0000 0000 ffc0 0000 0000 0000 0000 0000020 f566 0000 2000 0000 0f00 0000 7c7d 7a7b 0000040 81a0 0000 0000 0000 0000 0000 0000 0000 0000060 0000 0000 0000 0000 0000 0000 0000 0000 0000100 |
5 Responses to “不完全详解os block header”
顶,下次再弄个完全详解的出来,呵呵
哥,能全文输出rss吗?google reader里面看不到全文。
to Kamus: sorry啊,wordpress玩得还不太熟,正在研究!
顶啊,拜读了
提个建议,字体太小了。
Leave a Reply
You must be logged in to post a comment.