1.前言
ASM(Automatic Storage Management)是Oracle主推的一种面向Oracle的存储解决方案,它是一个管理卷组或者文件系统的软件,目前已经被RAC环境广泛使用,但是ASM由于其高度的封装性,使得我们很难知道窥探其内部的原理。ASM如果一旦出现问题,通常都很难处理。即便在有很完备的RMAN备份的情况下,恢复起来都可能需要很长的时间。
简单的讲ASM是通过一个ASM实例来实现对磁盘的管理。这个和Oracle 实例很类似。ASM实例也有SGA和后台进程组成。但是ASM实例相对的工作很少,所以它的SGA 相对较小,其主要维护一些ASM的元数据,包括磁盘组元数据(disk group metadata)、磁盘元数据(disk metadata)、文件元数据(file metadata),ASM的体系结构如下图:

?
ASM实例管理ASM磁盘组由一个个的ASM磁盘组成,每个磁盘又由多个区组成,每个区又由多个AU组成,它们共同协作就构成了ASM的基础应用。
2.ASM体系结构
前面说了ASM中的文件总体上来说分为两大类,元文件和数据文件。数据文件包含Oracle的数据文件、控制文件、重做日志文件、归档日志文件等等。对于ASM来说,只要是非元文件,就是数据文件。
每一个文件在ASM中都有一个专门的索引号,也就是编号,ASM文件索引号从1开始。其中前255个,也就是1至255号文件,都是元文件。256之后的是其他各种文件。
元文件中包含了各种ASM的配置、各类数据文件信息还有目录、别名等等信息,都是在元文件中的。所有V$ASM_开头视图的信息,都来自元文件中。
其中,1号文件包含所有文件的磁盘占用信息,包括元文件、甚至1号文件自身的空间分布信息,也都是在1号文件内部。每个文件在它里面占用一个块(4096字节,元数据块大小为4K)的空间。
从256号文件开始,是数据库的各类文件。假设你放在ASM上的第一个文件是一个控制文件A,第二个文件是一个数据文件B。哪么控制文件A在ASM中的索引号是256,数据文件B的索引号是257,但是这255个元文件并不是都有内容,其中只有前9个文件有内容,我们可以通过访问x$kffxp内部表获取相关的信息,如下:
SQL>SELECT number_kffxp file#, disk_kffxp disk#, COUNT(disk_kffxp) extents
2 FROMx$kffxp
3 WHERE group_kffxp=1
4 AND disk_kffxp <> 65534
5 GROUP BY number_kffxp, disk_kffxp
6 ORDER BY 1;
FILE# DISK# EXTENTS
-------------------- ----------
1 0 2
2 0 1
3 0 28
3 3 14
4 0 5
4 3 3
5 0 1
6 0 1
8 3 1
9 0 1
256 0 482
.........
268 3 7
269 0 1
35 ROWSselected.
file# 1 -file directory
file# 2 -disk directory
file# 3 -active Change Directory(ACD)
file# 4 -continuing Operations Directory (COD)
file# 5 -template directory
file# 6 -alias directory
file# 7 -volume directory
file# 8 -diskUsed Space Directory (USD)
file# 9 -attributes directory
其中1号文件总是开始在0号磁盘2号AU,这是ASM中定位文件的起点,它的作用,有点相当于磁盘上的引导区,在电脑开机后负责将OS启动起来。每次从ASM中读数据时,Oracle都要先读到1号文件,从中找出要读的目标文件在磁盘上的分布位置,然后再去读取相应的文件的数据。

?
那么问题来了,0号AU存放的什么信息呢?这个我想大家已经猜到了,就是存放的ASM磁盘头(disk header)信息,也是我们随后会重点介绍的内容,一旦该磁盘配置好后,如果不再对其做其它的操作,这部分内容相对就固定不变,但是ASM中最为脆弱的又是ASM磁盘头。如果磁盘头逻辑损坏了,即corrupt了,整个磁盘组将不能够mount,依赖于ASM实例的数据库也将不能够访问ASM磁盘并正常启动。后续我们会通过kfed工具对其进行解读。
3.kfod和kfed
kfod和kfed是ASM自带的未公开的工具,kfod主要用于在系统级别对ASM信息的查看,而kfed它可以读取和修改ASM磁盘的元数据,对修复一些关键错误非常有用,接下来分别介绍和演示下这两个工具。(以下使用的环境数据库版本都是11gr2)
3.1. kfod介绍
我们以前要想访问和查询ASM的信息,只能通过数据库视图进行查询,无法通过操作系统层进行访问,但是现在我们可以直接通过kfod工具,直接在操作系统层对ASM的相关信息进行查阅,我们先来看下kfod的帮助,输入kfod –h得到结果如下:
[oracle@rac01~]$ kfod -h
KFOD-00101:LRM error [107] while parsing command line arguments
_asm_a/llow_only_raw_disks KFOD allow only raw devices[_asm_allow_only_raw_disks=TRUE/(FALSE)]
_asm_l/ibraries ASMLibraries[_asm_libraries=lib1,lib2,...]
_asms/id ASM Instance[_asmsid=sid]
a/sm_diskstring ASM Diskstring[asm_diskstring=discoverystring, discoverystring ...]
c/luster KFOD cluster[cluster=TRUE/(FALSE)]
db/_unique_name db_unique_name for ASMinstance[db_unique_name=dbname]
di/sks Disks to discover[disks=raw,asm,badsize,all]
ds/cvgroup Include group name[dscvgroup=TRUE/(FALSE)]
g/roup Disks in diskgroup[group=diskgroup]
h/ostlist hostlist[hostlist=host1,host2,...]
metadata_a/usize AU Size for Metadata SizeCalculation
metadata_c/lients Client Count for Metadata SizeCalculation
metadata_d/isks Disk Count for Metadata SizeCalculation
metadata_n/odes Node Count for Metadata SizeCalculation
metadata_r/edundancy Redundancy for Metadata SizeCalculati