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
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。