1.RAC数据库启动报错。
sqlplus / as sysdba
startup
--控制文件识别出错。
ORA-00205:error in identifying control file,
check alert log for more
2.查看ASM ALERT;
--磁盘丢失。
WARNING:group 2 (ORA_DATA)has missing disks
--磁盘组不完整。
ORA-15040:diskgroup is incomplete
WARNING:group 2 is being dismounted;
WARNING:ASMB force dismounting group 2(ORA_DATA)due to missing disk;
SUCCESS:diskgroup ORA_DATA was dismounted.
3.查看ASM磁盘是否挂载。
asmcmd lsdg
--都是正常挂载。EXTERNAL冗余。
4.尝试重新挂载ORA_DATA磁盘组。报错磁盘组不完整。
su - grid
sqlplus / as sysasm
alter diskgroup ora_data mount;
ERROR at line 1:
ORA-15032:not all alteration performed
ORA-15017:diskgroup "ORA_DATA" cannot be mounted
ORA-15040:diskgroup is incomplete;
5.检查磁盘组的磁盘。
--检查磁盘组的3块磁盘,都存在,而且使用ASMFD
--不存在权限问题。
asmcmd afd_lsdsk
Label Filtering Path
DATA1 DISABLED /dev/sdi
DATA2 DISABLED /dev/sdj
DATA3 DISABLED /dev/sdk
6.检查磁盘头状态
发现 DATA1 和 DATA2 为 CANDIDATE ,
到这里基本可以判断磁盘头损坏。
group_number,path,library,header_status,MOUNT_STATUS,STATE
0 AFD:DATA3 AFD Library-Generic member closed NORMAL
0 AFD:DATA2 AFD Library-Generic CANDIDATE closed NORMAL
0 AFD:DATA1 AFD Library-Generic CANDIDATE closed NORMAL
7.检查磁盘头
--使用KFED确认,INVALID 代表不是ASM磁盘
kfed read /dev/sdi |more
kfbh.type 0;0x002:FKBTYP_INVALID
从版本10.2.0.5开始ASM 会对disk header做一个额外的备份。
即第二AU 的倒数第二个block中备份了一份KFBTYP_DISKHEAD。
这个ASM Disk header的作用是当真的KFBTYP_DISKHEAD被意外覆盖
或损坏时可以使用Oracle 工具 KFED使用repair选项来修复
Disk header。
计算方法:
AU中包含的备份块block num=等于[AU_SIZE/block_size]*2-2
--因为第一个块从0计数]。
可以计算结果为:
1M AU在510
2M AU在1022
4M AU在 2046 --当前是4M的AU;
8M AU在4094
16M AU在8190
32M AU在16382
--检查磁盘盘确认磁盘是否正常:备份块检查。
--1M:AU 检查磁盘头。
kfed read /dev/raw/raw5 blkn=510
--2M:AU 检查磁盘头。
kfed read /dev/raw/raw5 blkn=1022
--4M:AU 检查磁盘头。
kfed read /dev/raw/raw5 blkn=2046
--8M:AU 检查磁盘头。
kfed read /dev/raw/raw5 blkn=8190
--32M:AU 检查磁盘头。
kfed read /dev/raw/raw5 blkn=16382
7.检查磁盘头信息2
可以通过kfed 命令检查备份块信息,可以看到正常读取到了
磁盘头信息
--4M的AU 取 2046;
kfed read dev/sdi blkn=2046 | egrep 'kfbh.type|ausize|dsknum|dskname|grpname|fgname|blksize'
8.尝试恢复ASM磁盘头。
--确定损坏磁盘的备份信息:
kfed read dev/sdi blkn=2046 | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'
kfed read dev/sdj blkn=2046 | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'
--从备份数据块备份磁盘信息,多做备份还是很必要的,
--也可以使用dd 备份磁盘的前50M。
--备份磁盘头信息。
kfed read /dev/sdi blkn=2046 >sdi.diskhead
kfed read /dev/sdj blkn=2046 >sdj.diskhead
--恢复和检查asm 磁盘头信息,恢复时需要指定ausz ,
--否则非默认AU 会报错:
--4M=4194304的AU;
kfed repair /dev/sdi aus=4194304
kfed read /dev/sdi | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'
kfed repair /dev/sdj aus=4194304
kfed read /dev/sdj | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'
9.在次尝试挂载磁盘组,成功挂载。
alter diskgroup ora_data mount;
10.重启集群。
--关闭数据库。
srvctl stop database -db orcl
--停止集群:NODE1/NODE2
crsctl stop crs
reboot
备注:
--如果kfed repair 修复不成功,也可以尝试使用kefd merge
--恢复之前备份的文件。
kfed merge /dev/sdi aus=4194304 sdi.diskhead
kfed merge /dev/sdj aus=4194304 sdj.diskhead
--此方法只使用于磁盘前4k 损坏,如果是整个磁盘被格式化
--并写入数据,此方法无效。还是只能使用备份恢复整个数据库。
--参考MOS 文档:
How To Restore/Repair/Fix An Overwritten (KFBTYP_INVALID)
ASM Disk Header (First 4K) 10.2.0.5, 11.1.0.7, 11.2
And Onwards (Doc ID 1088867.1)
##############################################
--备份恢复磁盘头。
--备份磁盘头:
kfed read /dev/raw/raw5 aunum=0 blknum=0 text=/home/oracle/raw5.txt
kfed read /dev/raw/raw6 aunum=0 blknum=0 text=/home/oracle/raw6.txt
kfed read /dev/raw/raw7 aunum=0 blknum=0 text=/home/oracle/raw7.txt
--恢复磁盘头:
kfed write /dev/raw/raw5 aunum=0 blknum=0 text=raw5.txt
kfed write /dev/raw/raw6 aunum=0 blknum=0 text=raw6.txt
kfed write /dev/raw/raw7 aunum=0 blknum=0 text=raw7.txt
--或者:直接修复磁盘头。
kfed repair /dev/raw/raw5
kfed repair /dev/raw/raw6
kfed repair /dev/raw/raw7
--检查修复后的磁盘头状态。
kfed read /dev/raw/raw5 aun=0 blkn=0|grep kfbh.type
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
--重新检查磁盘头状态。
重新查询磁盘组以及磁盘信息
col group_number format a30
col disk_number format a30
col name format a30
col header_status format a30
col path format a30
col group_number clear
col disk_number clear
set linesize 200 pagesize 2000
SQL>select group_number,disk_number,name,header_status,path from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAMEHEADER_STATUS PATH
------------ ----------- -----------------------------
1 1 DATADG01_0001 MEMBER /dev/raw/raw6
1 0 DATADG01_0000 MEMBER /dev/raw/raw5
2 1 OCR_VOTE_0001 MEMBER /dev/raw/raw2
2 0 OCR_VOTE_0000 MEMBER /dev/raw/raw1
1 2 DATADG01_0002 MEMBER /dev/raw/raw7
2 2 OCR_VOTE_0002 MEMBER /dev/raw/raw3