sitemap

RSS地图

收藏本站

设为首页

Oracle研究中心

当前位置:Oracle研究中心 > 故障案例 >

【学习笔记】Oracle数据库ORA-27047 os block header异常修复

时间:2016-11-20 15:15   来源:Oracle研究中心   作者:网络   点击:

天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库os block header的文章,详细记录了当os block header异常损坏时的修复方法。

本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger 的Oracle技术博客
本文链接地址: 不完全详解os block header

什么是os block header?它有哪些作用?如果它损害了怎么办?下面是关于os block header的解释,来自MOS。

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等命令来进行操作。

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   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大小,如下:
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 ######

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.dbf
Database file type: file system
Database file size: 2560 8192 byte blocks
如何才能知道下面这几个的含义呢?

offset 1~2   00a2
offset 7~8   c0ff
offset 17~18 66f0

于是我想到了将该datafile resize后来进行观察,看看发生了什么改变。
SQL> ALTER DATABASE datafile Oracleoracleplus.net5 resize 30m;

DATABASE altered.
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  62822
f066  61542  --> 62822-61542=1280
SQL> SELECT (blocks - 2560) FROM dba_data_files WHERE file_id=5;

(BLOCKS-2560)
-------------
         1280

所以我猜测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命令来看,如下:

[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

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle数据库ORA-27047 os block header异常修复

本文由大师惜分飞原创分享,网址:http://www.oracleplus.net/arch/1301.html

Oracle研究中心

关键词:

ORA-27047解决笔记

什么是os block header?

os block header有哪些作用?

如果os block header损害了怎么办?