7 x 24 在线支持!
Oracle ASM Corruption: How To Fix The ASM Disk HEADER_STATUS From FORMER To MEMBER.
ASM Corruption: Case #1: How To Fix The ASM Disk HEADER_STATUS From FORMER or PROVISIONED To MEMBER.
Author: Esteban D. Bernal
This document explains, in detail, the steps required (with an example) to fix the ASM disk header from FORMER to MEMBER under the next scenarios:
A) Diskgroup was dropped by accident using the “SQL> drop <DG name> diskgroup;” statement.
B) Or under strange situations as described in the next bug:
Bug.13331814 ASM DISKS TURNED INTO FORMER WHILE DISKGROUP IS MOUNTED.
Example:
1) You created a diskgroup with the next disk member:
[grid@asmlnx1 ~]$ sqlplus "/as sysasm"
SQL*Plus: Release 12.1.0.1.0 Production on Sun May 18 16:16:57 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Automatic Storage Management option
SQL> set linesize 100
SQL> column path format a50
SQL> select name, path , header_status from v$asm_disk where path like 'ORCL:SAN_A_DISK_1';
NAME PATH HEADER_STATU
ORCL:SAN_A_DISK_1 PROVISIONED
SQL> create diskgroup TESTDG external redundancy disk 'ORCL:SAN_A_DISK_1';
Diskgroup created.
SQL> select group_number, name, state from v$asm_diskgroup where name like 'TESTDG';
GROUP_NUMBER NAME STATE
1 TESTDG MOUNTED
SQL> set linesize 100
SQL> column path format a50
SQL> select name, path , header_status from v$asm_disk where group_number = 1;
NAME PATH HEADER_STATU
SAN_A_DISK_1 ORCL:SAN_A_DISK_1 MEMBER
2) Then later, the diskgroup is dropped by accident and cannot be mounted again:
SQL> drop diskgroup TESTDG;
Diskgroup dropped.
SQL> alter diskgroup TESTDG mount; alter diskgroup TESTDG mount
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15017: diskgroup "TESTDG" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "TESTDG"
3) The original disk member is now shown as a FORMER disk:
SQL> set linesize 100
SQL> column path format a50
SQL> select name, path , header_status from v$asm_disk where path like 'ORCL:SAN_A_DISK_1';
4) Kfed also reports the FORMER status:
[grid@asmlnx1 ~]$ kfed read /dev/oracleasm/disks/SAN_A_DISK_1 | head -25
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 2862642817 ; 0x00c: 0xaaa07681
kfdhdb.driver.provstr:ORCLDISKSAN_A_DISK_1 ; 0x000: length=20
kfdhdb.driver.reserved[0]: 1598964051 ; 0x008: 0x5f4e4153
kfdhdb.driver.reserved[1]: 1229217601 ; 0x00c: 0x49445f41
kfdhdb.driver.reserved[2]: 828328787 ; 0x010: 0x315f4b53 kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000 kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000 kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000 kfdhdb.compat: 168820736 ; 0x020: 0x0a100000
kfdhdb.dskname: SAN_A_DISK_1 ; 0x028: length=12
kfdhdb.grpname: TESTDG ; 0x048: length=6 kfdhdb.fgname: SAN_A_DISK_1 ; 0x068: length=12
5) The ASM disk header needs to be patched/updated with the HEADER_STATUS = “MEMBER” in order to mount the diskgroup again as follow:
5.1) Backup the first 10 MB of the associated disks using the dd command:
[grid@asmlnx1 ~]$ mkdir /tmp/asm
[grid@asmlnx1~]$
of=/tmp/SAN_A_DISK_1.dump bs=1048576 count=50 50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 2.0715 seconds, 25.3 MB/s 5.2) Generate the template patch from the FORMER disk:
/tmp/asm/patch_SAN_A_DISK_1.txt
[grid@asmlnx1~]$ ls -l /tmp/asm/patch_SAN_A_DISK_1.txt
-rw-r--r-- 1 grid oinstall 6594 Apr 10 16:48 /tmp/asm/patch_SAN_A_DISK_1.txt
5.3) Edit the file (/tmp/asm/patch_SAN_A_DISK_1.txt) and change the code # from 4 to 3 and the status from FORMER to MEMBER in the next line (make sure you save the changes):
Original line:
New line:
Note: #4 stands for “FORMER” & #3 stands for “MEMBER”
5.4) Verify the new values in the patch file:
[grid@asmlnx1~]$ grep kfdhdb.hdrsts /tmp/asm/patch_SAN_A_DISK_1.txt
5.5) Now you can patch the FORMER disk using the “/tmp/asm/patch_SAN_A_DISK_1.txt” patch file:
text=/tmp/asm/patch_SAN_A_DISK_1.txt
5.6) Verify the new values in the real disk (ASM disk header was fixed with the HEADER_STATUS= “MEMBER”):
[grid@asmlnx1~]$ kfed read /dev/oracleasm/disks/SAN_A_DISK_1 | grep kfdhdb.hdrsts
6) Now you can mount the diskgroup:
[grid@asmlnx1 ~]$ sqlplus "/as sysasm"
SQL*Plus: Release 12.1.0.1.0 Production on Sun May 18 16:31:25 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Automatic Storage Management option
SQL> alter diskgroup TESTDG mount;
Diskgroup altered.
SQL> set linesize 100
SQL> column path format a50
SQL> select name, path , header_status from v$asm_disk where path like 'ORCL:SAN_A_DISK_1';
SQL> alter diskgroup TESTDG mount;
Diskgroup altered.
Annex: Syntax to create the ASMLIB disk:
[root@asmlnx1 ~]# /etc/init.d/oracleasm querydisk -p SAN_A_DISK_1 Disk "SAN_A_DISK_1" is a valid ASM disk
/dev/asmdisk1_4k_udev_p1: LABEL="SAN_A_DISK_1" TYPE="oracleasm"
[root@asmlnx1 ~]# /etc/init.d/oracleasm createdisk SAN_A_DISK_1
/dev/asmdisk1_4k_udev_p1
Marking disk "SAN_A_DISK_1" as an ASM disk: [ OK ]