一起8TB asm磁盘组元数据损坏修复记录
作者简介:王旭,在数据库管理方面拥有10多年经验。精通主流数据库系统,在企业数据库管理、性能优化、架构设计和高可用性能解决方案方面拥有丰富得实践经验。目前拥有(ORACLE ACE、MYSQL OCP、PG ACE、PGCA、PGCE、PGCM)等数据库认证。
环境
oracle 11.2.0.4 rac 双节点 数据量:磁盘组8TB, 数据库所使用7TB 左右
背景
昨天晚上9点过,一朋友找到我,说加完磁盘到一个磁盘组中,再添加数据文件,磁盘组直接挂掉,asm alert日志出现大量的ORA-15196报错,如下:


ORA-15196:invalid AsM block header [kfc.c:26368] [endian kfbh][21474836571[256][0 !- 1]
从上面的报错我们可以看到几个关键信息:
1) arb进程导致,说明在reblance过程中出现;
2) kfc.c: 26368,说明是这个模块的对应这个行的代码出现异常(oracle内部)
3) 出错的磁盘组EMRDATA,编号=3,dsk=9,blk=256,au=0
通过这些信息,我们可以初步得出结论,在当前的11gasm中,这个磁盘组的au是》=4的,而不是au=1m;
具体分析和处理
查询目前的磁盘组和磁盘信息
QL> select group_number||'_'||disk_number as dno,name,failgroup,failgroup_type,path,create_date,mount_date,mount_status,header_status,state,os_mb,total_mb,free_mb,voting_file,repair_timer rpt from v$asm_disk order by 1;
DNO NAME FAILGROUP FAILGRO PATH CREATE_DA MOUNT_DAT MOUNT_S HEADER_STATUS STATE OS_MB TOTAL_MB FREE_MB V RPT
----- ------------- ------------- ------- ---------------------------------------- --------- --------- ------- --------------- ---------- ---------- ---------- ---------- - ------
0_0 REGULAR dev/asm-data008 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_1 REGULAR dev/asm-data009 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_10 REGULAR dev/asm-data016 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_11 REGULAR dev/asm-data014 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_12 REGULAR dev/asm-data011 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_13 REGULAR dev/asm-data013 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_14 REGULAR dev/asm-data012 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_15 REGULAR dev/asm-data010 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_2 REGULAR dev/asm-data007 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_3 REGULAR dev/asm-data006 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_4 REGULAR /dev/asm-data019 18-JUN-25 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_5 REGULAR /dev/asm-data005 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_6 REGULAR /dev/asm-data017 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_7 REGULAR /dev/asm-data018 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_8 REGULAR /dev/asm-data004 04-SEP-20 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
0_9 REGULAR /dev/asm-data015 10-DEC-22 18-JUN-25 CLOSED MEMBER NORMAL 512000 0 0 N 0
1_0 CRS_0000 CRS_0000 REGULAR /dev/asm-ocrvode01 04-SEP-20 18-JUN-25 CACHED MEMBER NORMAL 10240 10240 9930 Y 0
...
使用循坏kfed读取找到对应的是哪个盘,然后再用kfed读取损坏的au的某个块


//从上面可以看出,目前的这个块已经坏了,那么这个块是什么呢? //前面说到我判断他是au为4的大小,那么这里它肯定是AT块了,现在就进一步分析这个AT块有没有分配AU和十六进制的文件号,如果有那就麻烦了,还需要去定位虚拟文件,找到文件分布再手工构造这个块。运气不错,256前的255、254这些块恰好是V=0,说明没有分配到这里来,通过fsty也能看出来(由于未截完图,这里大概描述下);
将前面的块读取出来一个来构造
将构造的块恢复进去
恢复完成后,磁盘组可正常挂载


总结
asm元数据at损坏的情况不多,但出现了往往比较考研dba的专业知识,只有对oracle的原理掌握通透,熟悉底层逻辑,出现问题才能解决,不然就只能靠备份或者容灾去恢复了。 本篇文章主要是讲解思路,分两种情况,1、未使用的 2、使用的 ,文章是第一种情况,那么出现第二种情况怎么构造呢?那就只有用另外的方法,需要读取更多的au和块来整理了构造填写了。 技术再高,也怕挨刀,做好备份才是王道,技术不够,有备份,时间也可以来凑; 很多人以为做了rac,只备份oracle就完了,实际上不知道asm元数据也是数据库,它的磁盘关键信息我们也是需要备份的。懂得都懂。 经过30多分钟的处理,问题得到了解决。将8个T的磁盘组挂载了起来,恢复了业务。
文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




