数据库坏了不跑路小技巧---KFED修复ASM磁盘头

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查看现磁盘信息:

0

说一下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)相关命令下来执行磁盘发现。

0

工具KFED(Kernel File Metadata Editor)

KFED的使用场景比较严峻,就是当ASM Diskgroup不能成功mount的时候,通过KFED来分析ASM磁盘头信息,来诊断问题。

从Oracle 11.1开始,KFED就已经正式成为安装组件的一部分。一些旧的版本中,就需要手工进行build构建。与Kfod的区别是,KFED只有在完全安装完之后,才能使用,在stage阶段无法使用。

0

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

0

kfed查看磁盘信息

kfed read /dev/asm-diskf | egrep 'ausize|dsknum|dskname|grpname|fgname|blksize'

0

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

0

再用hexdump查看asm-diskg的分区,55aa结尾表示mbr分区,00000200以前的分区己经被破坏,看不到磁盘头信息标记。

0

再登录数据库,启动实例,也报错找不到磁盘组里的文件。

0

asmcmd里查看也看不到DATA磁盘组

0

2.4、检查Asm磁盘头备份

方法1、

检查备份位置是否被破坏

0

方法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)

0

方法3、

对磁盘的前8M进行备份(我这里是AU为4M大小,块在第2个AU里,所以备份2个AU大小的文件),查看

0

查看备份文件最后,也能看到备份的磁盘头信息

0

2.5、kfed repair 执行修复

使用kfed repair进行修复尝试,不指定ausz会报错

0

重新指定ausz进行恢复,恢复成功。恢复的原理就是使用了备份的磁盘头信息重新覆盖。

0

再次查看磁盘信息,信息己经恢复

0

检查kfbh.type显示KFBTYP_DISKHEAD,恢复正常。

0

登录asm实例,手动启动磁盘组。

0

再登录查看数据库实例,实例自动被crs带起来

0

再查看磁盘头数据情况,asm磁盘标记己经恢复。

0

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 :徐sir(徐慧阳)_数据库记录,系统集成-CSDN博客
墨天轮:徐sir的个人主页 - 墨天轮
PGFANS:PGFans问答社区:全球唯一的PostgreSQL中文技术交流社区

————————————————————————————

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐sir(徐慧阳)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值