ASM磁盘组状态PROVISIONED导致crs无法启动

2025年2月6日 作者 XiaofeiHuangfu

适用范围

Oracle Database 11.2.0.3 +

问题概述

ASM实例内存不足,调整内存后,无法重启crs,经过检查ASM磁盘组无法mount,修复asm磁盘组状态后,可以mount磁盘组,crs可以正常启动。

问题原因

ASM磁盘头信息损坏

解决方案

通过通过kfed repair 命令对磁盘头进行修复。
以下是分析和处理过程:
第一个过程是调整ASM实例内存,第二过程是修复ASM磁盘组状态使crs可以正常启动。

1、crs日志

[14398]SLOS :SLOS:cat=8, opn=kgfoI002, dep=4031, loc=kgfokge
ORA-04031:unable to allocate 3896 bytes of shared memory (“shared pool”,“unknown object”,“sga heap(1,0)”,“kglsim heap”)
ORA-06508:PL/SQL:count not find progr

从日志看到ASM实例内存不足,我们申请变更窗口调整ASM实例内存参数。

2、调整ASM实例内存
使用以下脚本调整ASM实例参数,重启crs使该参数生效。

su - grid -c “sqlplus / as sysasm<<EOF
alter system set memory_max_target=4096m scope=spfile;
alter system set memory_target=4096m scope=spfile;
exit;
EOF”

3、重启crs
我们先从第2节点重启,重启时由于ASM磁盘组无法mount,所以导致crs不能正常启动。

4、ASM实例日志:
asm实例日志:

ORA-15032: not all alterations performed
ORA-15017: diskqroup "DATA" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DATA"
ORA-15017: diskgroup "OCR" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskqroup"OCR"
…

从日志看到ASM磁盘组无法正常mount

5、ASM磁盘组状态

SQL>select group_number,disk_number,state,mount_stats,header_status,name,path from v$asm_disk;
GROUP_NUMBER   DISK_NUMBER  STATE     MOUNT_STATUS  HEADER_STATUS  NAME           PATH
------------   -----------	-----     ------------  ------------- ---
       2             0      NORMAL     CACHED       ==PROVISIONED==   DATA_0000    /dev/asm_disk2
       2             0      NORMAL     CACHED       ==PROVISIONED==   DATA_0001    /dev/asm_disk3
       2             0      NORMAL     CACHED       ==PROVISIONED==   DATA_0002    /dev/asm_disk4
       1             0      NORMAL     CACHED       ==PROVISIONED==   OCR_0000     /dev/asm_disk1
**从节点1和节点2查到磁盘组的状态均为PROVISIONED**

6、手工mount磁盘组

SQL> alter diskgroup DATA mount force;
 *
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15017: diskqroup "DATA" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskqroup"DATA"

手工无法mount磁盘组,报错与之前ASM实例日志报错一致。

7、使用kfed读取磁盘信息
什么是kfed
Kernel Files Metadata Editor (kfed) 用于读取和写入asm磁盘的元数据,可以在DiskGroup没有mount的情况下使用;因此在ASM无法启动、DiskGroup无法mount的时候可以尝试使用这个强大工具来进行修复ASM磁盘。
kfed工具支持对于ASM信息的READ/WRITE/MERGE/NEW/ FORM/FIND/STRUCT等操作

$GRID_HOME/bin/kfed read /dev/asm_disk1
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: blk=0
kfbh.block.obj: 2147483650 ; 0x008: disk=2
kfbh.check: 1321875653 ; 0x00c: 0x4eca38c5
kfdhdb.acdb.ents:              0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:          0; 0x1de: 0x0000   <=====这个值是正常的
...
kfdhdb.dsknum: 2 ; 0x024: 0x0002
kfdhdb.grptyp: 1 ; 0x026: KFDGTP_EXTERNAL
kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER          <======磁盘组状态正常
kfdhdb.dskname: OCR_0000 ; 0x028: length=24
kfdhdb.grpname: OCR ; 0x048: length=19
kfdhdb.fgname: OCR_0000 ; 0x068: length=24
kfdhdb.capname: ; 0x088: length=0
...
kfdhdb.ub4spare[39]:  283863763; 0x198: 0x103b6ad3  <======此处值应该为0
kfdhdb.ub4spare[40]:  0;         0x19c: 0x0000000
kfdhdb.secsize: 512 ; 0x0b8: 0x0200
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00400000
kfdhdb.mfact: 454272 ; 0x0c0: 0x0006ee80

$ kfed read /dev/asm_disk1 |egrep "ausize|blksize"
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00400000  <========ausize 1048576 即1M
aus为1M
*AUSize Blocksize Metadata Blocknumber=(AUSize/Blocksize)2-2
1048576 4096 510
2097152 4096 1022
4194304 4096 2046
8388608 4096 4094

8、修复磁盘组

$GRID_HOME/bin/kfed repair /dev/asm_disk1 aus=1048576 
$GRID_HOME/bin/kfed repair /dev/asm_disk2 aus=1048576 
$GRID_HOME/bin/kfed repair /dev/asm_disk3 aus=1048576 
$GRID_HOME/bin/kfed repair /dev/asm_disk4 aus=1048576 

通过kfed repair 命令设置aus大小为1m进行磁盘修复,使用kfed工具重新检查了损坏磁盘的头信息。现在,受影响磁盘的kfed输出查看kfdhdb.ub4spare[39]恢复正常。
kfdhdb.ub4spare[39]: 0; 0x198: 0x100000000

9、检查ASM磁盘组状态

SQL>select group_number,disk_number,state,mount_stats,header_status,name,path from v$asm_disk;
GROUP_NUMBER DISK_NUMBER STATE MOUNT_STATUS HEADER_STATUS NAME PATH

   2             0      NORMAL     CACHED       ==MEMBER==   DATA_0000    /dev/asm_disk2
   2             0      NORMAL     CACHED       ==MEMBER==   DATA_0001    /dev/asm_disk3
   2             0      NORMAL     CACHED       ==MEMBER==   DATA_0002    /dev/asm_disk4
   1             0      NORMAL     CACHED       ==MEMBER==   OCR_0000     /dev/asm_disk1

此时ASM磁盘组状态已恢复为MEMBER,为正常状态。

10、手工挂载ASM磁盘组

SQL> alter diskgroup DATA mount force;

可以正常挂载

11、重启启动crs
在节点2使用root用户进行如下操作

$GRID_HOME/bin/crsctl stop crs -f
$GRID_HOME/bin/crsctl start crs

crs可以正常启动,在节点1执行同样操作。