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

2023年 11月 16日 68.3k 0

1、问题现象

群里小伙伴晚上反馈自己的RAC挂了运行环境:a.云上的RACb.数据库版本oracle 12cR2c.操作系统版本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 racasm-diskg对应DATA磁盘组里的第一块磁盘,我这里的DATA磁盘组的AU设置为4M使用kfod查看现磁盘信息:
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-1
说一下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修复ASM磁盘头-2
工具KFED(Kernel File Metadata Editor)KFED的使用场景比较严峻,就是当ASM Diskgroup不能成功mount的时候,通过KFED来分析ASM磁盘头信息,来诊断问题。

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

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

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修复ASM磁盘头-4
kfed查看磁盘信息

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

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

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
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-6
再用hexdump查看asm-diskg的分区,55aa结尾表示mbr分区,00000200以前的分区己经被破坏,看不到磁盘头信息标记。
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-7
再登录数据库,启动实例,也报错找不到磁盘组里的文件。
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-8
asmcmd里查看也看不到DATA磁盘组
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-9

2.4、检查Asm磁盘头备份

方法1、检查备份位置是否被破坏
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-10
方法2、kfed读取磁盘块,需要进行1个简单的计算,备份的磁盘头信息存储在第2个AU的的倒数第2个块里通过命令

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

可以确认如下信息:kfdhdb.blksize: 4096kfdhdb.ausize: 4194304 计算公式为 (4194304/4096) * 2- 2 = 2046 (The first block is 0)
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-11
方法3、对磁盘的前8M进行备份(我这里是AU为4M大小,块在第2个AU里,所以备份2个AU大小的文件),查看
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-12
查看备份文件最后,也能看到备份的磁盘头信息
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-13

2.5、kfed repair 执行修复

使用kfed repair进行修复尝试,不指定ausz会报错
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-2
重新指定ausz进行恢复,恢复成功。恢复的原理就是使用了备份的磁盘头信息重新覆盖。
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-15
再次查看磁盘信息,信息己经恢复
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-16
检查kfbh.type显示KFBTYP_DISKHEAD,恢复正常。
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-17
登录asm实例,手动启动磁盘组。
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-18
再登录查看数据库实例,实例自动被crs带起来
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-19
再查看磁盘头数据情况,asm磁盘标记己经恢复。
数据库坏了不跑路小技巧---KFED修复ASM磁盘头-20

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永不跑路!!

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论