背景: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<
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-