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 —
转载于:https://blog.51cto.com/bsbforever/1593723