背景:ASM实例内存不足,调整内存后,无法重启crs,经过检查ASM磁盘组无法mount,修复asm磁盘组状态后,可以mount磁盘组,crs可以正常启动。
操作系统:AIX 6.1
数据库版本:11.2.0.3 2节点RAC
以下是分析和处理过程:
第一个过程是调整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执行同样操作。
-the end-