ORA-01210: data file header is media corrupt
在现网环境中,启动数据库的时候,出现了报错ORA-01210: data file header is media corrupt。刚开始以为是datafile header块头坏了。但是经过bbed校验后,发现都是正确的文件格式。所以,我们考虑了另一种情况,是不是磁盘绑定,绑错位了。所以下面就是我们模拟该问题,并提供解决思路。当出现ORA-01210情况的时候,不一定就是数据文件头块坏了,还有其他的可能性。下面就是具体的模拟并解决过程。
问题现象
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: ‘/dev/raw/raw1’
ORA-01210: data file header is media corrupt
模拟过程
说明下:现网环境用的还是raw,所以以下就以raw方式模拟
加盘 创建lv
[root@oracle11g ~]# pvcreate /dev/sdb
Physical volume “/dev/sdb” successfully created
[root@oracle11g ~]# vgcreate vg_app /dev/sdb
Volume group “vg_app” successfully created
[root@oracle11g ~]# lvcreate -L 50M -n lv_wahaha1 vg_app
Rounding up size to full physical extent 52.00 MiB
Logical volume “lv_wahaha1” created.
[root@oracle11g ~]# lvcreate -L 48m -n lv_wahaha2 vg_app
Logical volume “lv_wahaha2” created.
[root@oracle11g ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_wahaha1 vg_app -wi-a----- 52.00m
lv_wahaha2 vg_app -wi-a----- 48.00m
lv_root vg_system -wi-ao---- 47.80g
lv_swap vg_system -wi-ao---- 2.00g
[root@oracle11g ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg_app 1 2 0 wz–n- 100.00m 0
vg_system 1 2 0 wz–n- 49.80g 0
raw映射
[root@oracle11g ~]# raw /dev/raw/raw1 /dev/mapper/vg_app-lv_wahaha1
/dev/raw/raw1: bound to major 253, minor 2
[root@oracle11g ~]# raw /dev/raw/raw2 /dev/mapper/vg_app-lv_wahaha2
/dev/raw/raw2: bound to major 253, minor 3
查看raw的信息:
[root@oracle11g ~]# raw -qa
/dev/raw/raw1: bound to major 253, minor 2
/dev/raw/raw2: bound to major 253, minor 3
查看本机设备
[root@oracle11g ~]# ls -ltr /dev/mapper/vg_*
lrwxrwxrwx. 1 root root 7 Jul 31 14:55 /dev/mapper/vg_system-lv_swap -> …/dm-1
lrwxrwxrwx. 1 root root 7 Jul 31 14:55 /dev/mapper/vg_system-lv_root -> …/dm-0
lrwxrwxrwx. 1 root root 7 Jul 31 15:00 /dev/mapper/vg_app-lv_wahaha1 -> …/dm-2
lrwxrwxrwx. 1 root root 7 Jul 31 15:02 /dev/mapper/vg_app-lv_wahaha2 -> …/dm-3
[root@oracle11g ~]# ls -ltr /dev/dm-*
brw-rw----. 1 root disk 253, 1 Jul 31 14:55 /dev/dm-1
brw-rw----. 1 root disk 253, 0 Jul 31 14:55 /dev/dm-0
brw-rw----. 1 root disk 253, 2 Jul 31 15:00 /dev/dm-2
brw-rw----. 1 root disk 253, 3 Jul 31 15:02 /dev/dm-3
[root@oracle11g datafile]# ll /dev/raw/raw*
crw-rw----. 1 root disk 162, 1 Jul 31 15:11 /dev/raw/raw1
crw-rw----. 1 root disk 162, 2 Jul 31 15:11 /dev/raw/raw2
crw-rw----. 1 root disk 162, 0 Jul 31 14:55 /dev/raw/rawctl
修改raw权限
[root@oracle11g datafile]# chown oracle:oinstall /dev/raw/raw1
[root@oracle11g datafile]# chown oracle:oinstall /dev/raw/raw2
[root@oracle11g datafile]# ll /dev/raw/raw*
crw-rw----. 1 oracle oinstall 162, 1 Jul 31 15:21 /dev/raw/raw1
crw-rw----. 1 oracle oinstall 162, 2 Jul 31 15:11 /dev/raw/raw2
crw-rw----. 1 root disk 162, 0 Jul 31 14:55 /dev/raw/rawctl
在raw上面创建表空间
SQL> create tablespace tbs1 datafile ‘/dev/raw/raw1’ size 20M;
Tablespace created.
SQL> create tablespace tbs2 datafile ‘/dev/raw/raw2’ size 20M;
Tablespace created.
SQL> create table wahaha tablespace tbs1 as select * from dba_users;
Table created.
SQL> select name,file# from v$datafile;
SQL> set pages 1000 lines 1000
SQL> col name for a100
NAME FILE#
/u01/app/oracle/oradata/ZHUO/datafile/o1_mf_system_gxd20h14_.dbf 1
/u01/app/oracle/oradata/ZHUO/datafile/o1_mf_sysaux_gxd20k1y_.dbf 2
/u01/app/oracle/oradata/ZHUO/datafile/o1_mf_undotbs1_gxd20lnp_.dbf 3
/u01/app/oracle/oradata/ZHUO/datafile/o1_mf_users_gxd20pxk_.dbf 4
/u01/app/oracle/oradata/ZHUO/datafile/o1_mf_zhuo_gxdcfr5s_.dbf 5
/dev/raw/raw1 6
/dev/raw/raw2 7
7 rows selected.
模拟报错
模拟主机异常宕机
[root@oracle11g ~]# reboot
重新启动数据库
SQL> startup
ORACLE instance started.
Total System Global Area 521936896 bytes
Fixed Size 2254824 bytes
Variable Size 352323608 bytes
Database Buffers 163577856 bytes
Redo Buffers 3780608 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: ‘/dev/raw/raw1’
发现raw没有映射,手动重新映射。(这里模拟我们不知道lv和raw之间的对应关系,我们手动映射错了)
[root@oracle11g ~]# chown oracle:oinstall /dev/raw/raw1
[root@oracle11g ~]# chown oracle:oinstall /dev/raw/raw2
[root@oracle11g ~]# ls -tlr /dev/raw/*
crw-rw----. 1 root disk 162, 0 Jul 31 15:24 /dev/raw/rawctl
crw-rw----. 1 oracle oinstall 162, 1 Jul 31 15:38 /dev/raw/raw1
crw-rw----. 1 oracle oinstall 162, 2 Jul 31 15:38 /dev/raw/raw2
重启数据库
[oracle@oracle11g ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Jul 31 15:39:09 2020
Copyright © 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: ‘/dev/raw/raw1’
ORA-01210: data file header is media corrupt
启动数据库报错:ORA-01210。
解决方案
既然是lv的对应关系绑定错位了,那就要知道正确的对应关系。
下面查看现在的绑定对应关系(由于我的是虚拟机,所以major和minor号,没在lv上面显示,在具体的磁盘上面显示)
[root@oracle11g ~]# raw -qa
/dev/raw/raw1: bound to major 253, minor 3
/dev/raw/raw2: bound to major 253, minor 2
[root@oracle11g ~]# ls -ltr /dev/raw/raw*
crw-rw----. 1 root disk 162, 0 Jul 31 15:24 /dev/raw/rawctl
crw-rw----. 1 oracle oinstall 162, 1 Jul 31 15:38 /dev/raw/raw1
crw-rw----. 1 oracle oinstall 162, 2 Jul 31 15:38 /dev/raw/raw2
[root@oracle11g ~]# ls -ltr /dev/mapper/
total 0
crw-rw----. 1 root root 10, 58 Jul 31 15:24 control
lrwxrwxrwx. 1 root root 7 Jul 31 15:24 vg_system-lv_swap -> …/dm-1
lrwxrwxrwx. 1 root root 7 Jul 31 15:24 vg_app-lv_wahaha2 -> …/dm-3
lrwxrwxrwx. 1 root root 7 Jul 31 15:24 vg_app-lv_wahaha1 -> …/dm-2
lrwxrwxrwx. 1 root root 7 Jul 31 15:24 vg_system-lv_root -> …/dm-0
[root@oracle11g ~]# ls -ltr /dev/dm*
brw-rw----. 1 root disk 253, 1 Jul 31 15:24 /dev/dm-1
brw-rw----. 1 root disk 253, 3 Jul 31 15:24 /dev/dm-3
brw-rw----. 1 root disk 253, 2 Jul 31 15:24 /dev/dm-2
brw-rw----. 1 root disk 253, 0 Jul 31 15:24 /dev/dm-0
现在虽然知道file# 6对应着/dev/raw/raw1;file# 7对应/dev/raw/raw2;(从v$datafile.name可以看出对应关系)。但是底层的设备绑定对应关系却是不知道的,即不知道/dev/raw/raw1绑定的vg_app-lv_wahaha2还是vg_app-lv_wahaha1.
有一种方法,因为datafile是存储在存储设备上的,真实存储在磁盘上面的内容是不会混乱的,我们可以直接查看设备上面存储的内容,来判断对应关系。
那么就需要我们知道这个设备上面存储的是file#为多少的文件。所以要定位这个数据文件datafile是几号文件。
所以问题的关键就变为了,存储设备上存储的数据文件的几号文件了,所以以下就是确定存储设备上面的file number了,下面演示集中方法: