1、问题现象
群里小伙伴晚上反馈自己的RAC挂了
运行环境:
a.云上的RAC
b.数据库版本oracle 12cR2
c.操作系统版本rhel7.5
故障现象如下:
查看ASM磁盘信息丢了,HEADER_STATUS磁盘状态变成了CANDIDATE

导致ora.DATA.dg资源OFFLINE

检查是发现了VDD磁盘被破坏(就是上图里的RAW3),有人在这个磁盘上创建了分区,并标记成了LVM。

回想起当年还是ORACLE 10g rac的时候,用过一次KFED修复磁盘头,这里再重温一下操作。
以前10G的时候使用还需要编译一下,11G己经可以直接调用了。
2、模拟进行恢复
我这里的模拟环境是redhat 6.9+oracle 11g rac
asm-diskg对应DATA磁盘组里的第一块磁盘,我这里的DATA磁盘组的AU设置为4M
使用kfod查看现磁盘信息:
说一下ASM物理元数据有如下几个结构:
● 磁盘头
● Free Space Table ,FST表
● Allocation Table ,AT表
● Partnership and Status Table ,PST表
每个ASM磁盘会在第一个AU(AU 0)的第一个block(block 0) 中记录磁盘头信息,第二个block(block 1)中记录FST表,剩余的块上记录AT表。
PST信息保存在每个磁盘的第二个AU中(AU 1),虽然每个磁盘的AU 1都会为PST表而预留,但一个磁盘组只会有几个磁盘上真正的存放PST表。
感兴趣的小伙伴可以通过KFED工具进行查看。
2.1、KFOD、KFED工具
关于工具详细介绍可以查看官方文档:ASM tools used by Support : KFOD, KFED, AMDU (Doc ID 1485597.1)
工具KFOD( Kernel Files OSM Disk)KFOD在安装时使用,也在(通过OUI,DBCA或ASMCA)相关命令下来执行磁盘发现。
工具KFED(Kernel File Metadata Editor)
KFED的使用场景比较严峻,就是当ASM Diskgroup不能成功mount的时候,通过KFED来分析ASM磁盘头信息,来诊断问题。
从Oracle 11.1开始,KFED就已经正式成为安装组件的一部分。一些旧的版本中,就需要手工进行build构建。与Kfod的区别是,KFED只有在完全安装完之后,才能使用,在stage阶段无法使用。
2.2、备份磁盘头数据
操作之前,备份出前50M大小,查看备份文件里asm磁盘组标记
dd if=/dev/asm-diskg of=/home/oracle/asmdisk-disk.img bs=1024k count=50
备份成功后,通过备份文件查看磁盘分区(下图红框里为ASM磁盘头信息,可以看到DATA_0001字样):
hexdump -C asmdisk-disk.img |more
kfed查看磁盘信息
kfed read /dev/asm-diskf | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'
2.3、模拟破坏分区,故障重现
进行破坏性操作,模拟给sdc重新建分区
[root@rac1 dev]# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xa3f35297.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p
Disk /dev/sdc: 21.5 GB, 21474836480 bytes
64 heads, 32 sectors/track, 20480 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xa3f35297
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-20480, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-20480, default 20480):
Using default value 20480
Command (m for help): p
Disk /dev/sdc: 21.5 GB, 21474836480 bytes
64 heads, 32 sectors/track, 20480 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xa3f35297
Device Boot Start End Blocks Id System
/dev/sdc1 1 20480 20971504 83 Linux
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdc: 21.5 GB, 21474836480 bytes
64 heads, 32 sectors/track, 20480 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xa3f35297
Device Boot Start End Blocks Id System
/dev/sdc1 1 20480 20971504 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
当重启crs,或者添加磁盘,会出发失败报错。
这里我关闭两个节点的CRS,再用kfed查看磁盘asm磁盘,kfbh.type己成变成 kfbtyp_invalid
再用hexdump查看asm-diskg的分区,55aa结尾表示mbr分区,00000200以前的分区己经被破坏,看不到磁盘头信息标记。
再登录数据库,启动实例,也报错找不到磁盘组里的文件。
asmcmd里查看也看不到DATA磁盘组
2.4、检查Asm磁盘头备份
方法1、
检查备份位置是否被破坏
方法2、
kfed读取磁盘块,需要进行1个简单的计算,备份的磁盘头信息存储在第2个AU的的倒数第2个块里
通过命令
kfed read /dev/asm-diskf | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'
可以确认如下信息:
kfdhdb.blksize: 4096
kfdhdb.ausize: 4194304
计算公式为 (4194304/4096) * 2- 2 = 2046 (The first block is 0)
方法3、
对磁盘的前8M进行备份(我这里是AU为4M大小,块在第2个AU里,所以备份2个AU大小的文件),查看
查看备份文件最后,也能看到备份的磁盘头信息
2.5、kfed repair 执行修复
使用kfed repair进行修复尝试,不指定ausz会报错
重新指定ausz进行恢复,恢复成功。恢复的原理就是使用了备份的磁盘头信息重新覆盖。
再次查看磁盘信息,信息己经恢复
检查kfbh.type显示KFBTYP_DISKHEAD,恢复正常。
登录asm实例,手动启动磁盘组。
再登录查看数据库实例,实例自动被crs带起来
再查看磁盘头数据情况,asm磁盘标记己经恢复。
3、总结回顾
以上修复操作参照官方文档How To RestoreRepairFix An Overwritten (KFBTYP_INVALID) ASM Disk Header (First 4K) 10.2.0.5, 11.1.0.7, 11.2 And Onwards (Doc ID 1088867.1)
后来沟通群里的小伙伴,使用kfed repair成功修复,万幸他们只是被破坏了分区,磁盘没有被格式化,不然彻底凉凉。
这种方法也有一定的局限性:
a.此方法适用于磁盘前4k的分区被损坏。
b.如果hex或者kfed查看,备份分区也被损坏,那么无法恢复,还是恢复数据备份吧。
最后建议大家做好备份,DBA永不跑路!!
也欢迎关注我的公众号【徐sir的IT之路】,一起学习!
————————————————————————————
公众号:徐sir的IT之路
CSDN :https://blog.csdn.net/xxddxhyz?type=blog
墨天轮:https://www.modb.pro/u/3605
PGFANS:https://www.pgfans.cn/user/home?userId=5568
————————————————————————————
最后修改时间:2023-12-10 15:26:38
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。