oracle文件的第一个块(block 0)是OS block header,在数据库中查询不到信息,记录的是OS信息,以及文件大小的等信息:

  SQL> select file_name,bytes from dba_data_files;   FILE_NAME                                               BYTES -------------------------------------------------- ---------- /u01/app/oracle/oradata/PROD/user01.dbf              67108864   $ls -lrt total 1390268 -rw-r-----  1 oracle oinstall  67117056 Apr 12 09:31 user01.dbf 


从上面可以看出,OS上的大小比数据库里的大小多了一个BLOCK。

如果OS block header损坏,并不影响数据库打开、使用,但重建控制文件时会报错,用dbverify/rman也检测不到坏块,不过可以使用dbfsize来查看:
正常状态:

  $dbfsize user01.dbf  Database file: user01.dbf Database file type: file system Database file size: 8192 8192 byte blocks 

损坏:

  $dbfsize user01.dbf user01.dbf: Header block magic number is bad 

编缉BLOCK 0,模拟损坏,可以正常启动、使用:

  SQL> startup; ORACLE instance started.   Total System Global Area  184549376 bytes Fixed Size                  1266488 bytes Variable Size             100666568 bytes Database Buffers           79691776 bytes Redo Buffers                2924544 bytes Database mounted. ORA-01113: file 4 needs media recovery ORA-01110: data file 4: '/u01/app/oracle/oradata/PROD/user01.dbf'     SQL> recover datafile 4;   Media recovery complete. SQL> alter database open;  Database altered.   SQL> create table test01 tablespace USERS as select * from dba_objects;  Table created. 

用dbv检查,未发现坏块:

  $dbv file=user01.dbf   DBVERIFY: Release 10.2.0.4.0 - Production on Mon Apr 16 16:38:33 2012   Copyright (c) 1982, 2007, Oracle.  All rights reserved.   DBVERIFY - Verification starting : FILE = user01.dbf     DBVERIFY - Verification complete   Total Pages Examined         : 8192 Total Pages Processed (Data) : 357 Total Pages Failing   (Data) : 0 Total Pages Processed (Index): 0 Total Pages Failing   (Index): 0 Total Pages Processed (Other): 11 Total Pages Processed (Seg)  : 0 Total Pages Failing   (Seg)  : 0 Total Pages Empty            : 7824 Total Pages Marked Corrupt   : 0 Total Pages Influx           : 0 Highest block SCN            : 336969 (0.336969) 

用dbfsize检查,报错:

  $dbfsize user01.dbf user01.dbf: Header block magic number is bad 

如果重建控制文件,则会报错:

  SQL> startup nomount; ORACLE instance started.   Total System Global Area  184549376 bytes Fixed Size                  1266488 bytes Variable Size             100666568 bytes Database Buffers           79691776 bytes Redo Buffers                2924544 bytes SQL> CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG   2      MAXLOGFILES 5   3      MAXLOGMEMBERS 5   4      MAXDATAFILES 100   5      MAXINSTANCES 2   6      MAXLOGHISTORY 292   7  LOGFILE   8    GROUP 1 (   9      '/u01/app/oracle/oradata/PROD/REDO1_1.log',  10      '/u01/app/oracle/oradata/PROD/REDO1_2.log',  11      '/u01/app/oracle/oradata/PROD/REDO1_3.log'  12    ) SIZE 100M,  13    GROUP 2 (  14      '/u01/app/oracle/oradata/PROD/REDO2_1.log',  15      '/u01/app/oracle/oradata/PROD/REDO2_2.log',  16      '/u01/app/oracle/oradata/PROD/REDO2_3.log'  17    ) SIZE 100M  18  -- STANDBY LOGFILE  19  DATAFILE  20    '/u01/app/oracle/oradata/PROD/SYSTEM01.dbf',  21    '/u01/app/oracle/oradata/PROD/undotbs01.dbf',  22    '/u01/app/oracle/oradata/PROD/SYSAUX01.dbf',  23    '/u01/app/oracle/oradata/PROD/user01.dbf'  24  CHARACTER SET AL32UTF8  25  ; CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG * ERROR at line 1: ORA-01503: CREATE CONTROLFILE failed ORA-01565: error in identifying file '/u01/app/oracle/oradata/PROD/user01.dbf' ORA-27047: unable to read the header block of file Additional information: 2 

报ORA-27047错误。这里可以在数据库打开状态下,resize datafile,这样就可以重写OS block header信息:

  SQL> alter database open;  Database altered.   SQL> alter database datafile '/u01/app/oracle/oradata/PROD/user01.dbf' resize 65M;  Database altered.   SQL> select file_name,bytes from dba_data_files;   FILE_NAME                                               BYTES -------------------------------------------------- ---------- /u01/app/oracle/oradata/PROD/user01.dbf              68157440 

dbfsize检查正常,重建控制文件正常:

  $dbfsize user01.dbf  Database file: user01.dbf Database file type: file system Database file size: 8320 8192 byte blocks   SQL> CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG   2      MAXLOGFILES 5   3      MAXLOGMEMBERS 5   4      MAXDATAFILES 100   5      MAXINSTANCES 2   6      MAXLOGHISTORY 292   7  LOGFILE   8    GROUP 1 (   9      '/u01/app/oracle/oradata/PROD/REDO1_1.log',  10      '/u01/app/oracle/oradata/PROD/REDO1_2.log',  11      '/u01/app/oracle/oradata/PROD/REDO1_3.log'  12    ) SIZE 100M,  13    GROUP 2 (  14      '/u01/app/oracle/oradata/PROD/REDO2_1.log',  15      '/u01/app/oracle/oradata/PROD/REDO2_2.log',  16      '/u01/app/oracle/oradata/PROD/REDO2_3.log'  17    ) SIZE 100M  18  -- STANDBY LOGFILE  19  DATAFILE  20    '/u01/app/oracle/oradata/PROD/SYSTEM01.dbf',  21    '/u01/app/oracle/oradata/PROD/undotbs01.dbf',  22    '/u01/app/oracle/oradata/PROD/SYSAUX01.dbf',  23    '/u01/app/oracle/oradata/PROD/user01.dbf'  24  CHARACTER SET AL32UTF8  25  ;   Control file created.   SQL> alter database open;  Database altered. 

注:resize 原大小,重建还是报错,需要resize一个不同的大小。

— The End —