当ASM创建一个文件时(例如数据库实例要求创建一个数据文件),它会以extent为单位分配空间。一旦文件被创建,ASM会传递extent映射表给数据库实例,后续数据库实例能在不和ASM实例交互的情况下访问这个文件。如果一个文件的extent需要被重新定位,比如磁盘组进行rebalance操作,ASM会告知数据库实例关于extent映射表的变更。
可以通过查询ASM实例的X$KFFXP视图来获取ASM文件extent映射表的内容。X$KFFXP视图中的每一行对应着所有处于mount状态磁盘组中每一个文件的每一个物理extent的信息。
译者注:1)网络上有不少关于X$KFFXP视图的解释,有些信息过于陈旧,需要指出,它记录的每一条记录都代表的是物理extent的信息,而非AU信息,X$KFFXP视图的SIZE_KFFXP字段,代表了此extent是由几个AU组成的,在启用11G可变extent特性后会出现SIZE_KFFXP大于1的情况,具体更多信息参考本系列的第一篇文章。2)X$KFFXP这里翻译成了X$KFFXP视图,只是为了便于理解,它的本质是一个内存的数据结构(fixed table),其数据不在buffer_cache中。
X$KFFXP视图的重要字段包括:
GROUP_KFFXP 磁盘组编号。注意磁盘组编号不是恒久不变的,每次磁盘组被mount时都可能会不一样。等同于V$ASM_DISKGROUP.GROUP_NUMBER字段。
NUMBER_KFFXP 文件序号。等同于 V$ASM_FILE.FILE_NUMBER字段。 注意,ASM的文件序号不同于数据库内的数据文件序号,不要把两个概念搞混了。小于256的ASM文件序号是保留给ASM元数据文件使用的。
INCARN_KFFXP 文件版本号。当一个ASM文件序号被一个新文件重用时,文件版本号会发生改变。等同于V$ASM_FILE.INCARNATION字段。注意,ASM文件是以文件序号.版本号的方式结尾。
XNUM_KFFXP 虚拟extent序号。external冗余磁盘组的虚拟extent序号与物理extent序号一致。 normal冗余磁盘组的虚拟extent序号通过将物理extent序号除于2得到.high冗余磁盘组的虚拟extent序号通过将物理extent序号除于3得到.
PXN_KFFXP 物理extent序号。一个文件的物理extent序号都以数字0开始,顺序递增。
LXN_KFFXP 虚拟extent中物理extent的序号。 0 为 primary extent, 1 为 secondary extent, 2 为 third copy of the extent。
DISK_KFFXP 物理磁盘序号。等同于V$ASM_DISK.DISK_NUMBER。
AU_KFFXP AU序号,磁盘维度的AU编号,每个磁盘从0开始。
在ASM实例中通过以下查询,能够看出磁盘组3内的ASM元数据文件的文件序号,名字和AU数量。
$ sqlplus / as sysasm
SQL> select NUMBER_KFFXP "ASM file number", DECODE (NUMBER_KFFXP,
1, 'File directory', 2, 'Disk directory', 3, 'Active change directory', 4, 'Continuing operations directory',
5, 'Template directory', 6, 'Alias directory', 7, 'ADVM file directory', 8, 'Disk free space directory',
9, 'Attributes directory', 10, 'ASM User directory', 11, 'ASM user group directory', 12, 'Staleness directory',
253, 'spfile for ASM instance', 254, 'Stale bit map space registry ', 255, 'Oracle Cluster Repository registry') "ASM metadata file name",
count(AU_KFFXP) "Allocation units"
from X$KFFXP
where GROUP_KFFXP=3 and NUMBER_KFFXP<256
group by NUMBER_KFFXP
order by 1;
ASM file number ASM metadata file name Allocation units
--------------- ---------------------------------- ----------------
1 File directory 3
2 Disk directory 3
3 Active change directory 69
4 Continuing operations directory 6
5 Template directory 3
6 Alias directory 3
8 Disk free space directory 3
9 Attributes directory 3
12 Staleness directory 3
253 spfile for ASM instance 2
254 Stale bit map space registry 3
255 Oracle Cluster Repository registry 135
12 rows selected.
SQL>
通过以上查询结果可以发现,这个磁盘组并没有包含所有类型的元数据文件(例如第十号和第十一号文件)。一个有意思的事情是,除了ASM实例的spfile,每个文件至少占用3个AU,对于这一点更多详细信息我们会在其他章节介绍。
我们再来以一个数据库控制文件为例查看下它的extent映射表
第1步,查找DATA磁盘组内所有的数据库控制文件(以Grid所属的OS用户身份运行asmcmd命令)
$ asmcmd find --type controlfile +DATA "*"
+DATA/DBM/CONTROLFILE/Current.256.738247649
+DATA/BR/CONTROLFILE/Current.299.748434267
$
第2步,检查DATA磁盘组的磁盘组序号(连接到asm实例)
$ sqlplus / as sysasm
SQL> select GROUP_NUMBER from V$ASM_DISKGROUP where NAME='DATA';
GROUP_NUMBER
------------
1
SQL>
第3步,检查磁盘组1中ASM 256号文件(+DATA/DBM/CONTROLFILE/Current.256.738247649)的extent映射表
SQL> select XNUM_KFFXP "Virtual extent", PXN_KFFXP "Physical extent", LXN_KFFXP "Extent copy", DISK_KFFXP "Disk", AU_KFFXP "Allocation unit"
from X$KFFXP
where GROUP_KFFXP=1 and NUMBER_KFFXP=256 and XNUM_KFFXP<>2147483648
order by 1,2;
Virtual extent Physical extent Extent copy Disk Allocation unit
-------------- --------------- ----------- ---------- ---------------
0 0 0 20 5
0 1 1 29 1903
0 2 2 6 82
1 3 0 22 6
1 4 1 31 8
1 5 2 9 3
2 6 0 30 8
2 7 1 23 1907
2 8 2 7 63
3 9 0 26 2
3 10 1 16 1904
3 11 2 6 4
...
39 117 0 25 1913
39 118 1 15 1906
39 119 2 3 27
120 rows selected.
SQL>
以上输出可以看出这个控制文件是三路镜像,每个虚拟extent对应三个物理extent,还可以看出这个文件每个AU的实际位置。