...
分类: Oracle
2013-02-16 11:36:11
ASM基础概念
相关文章链接:
在Linux 6上使用UDEV解决RAC ASM存储设备名问题
Automatic Storage Management是Oracle 在版本10g中率先(对比其他RDBMS)提出的数据库存储自动解决方案,在版本11g中得到进一步升华。ASM提供了数据库管理所需要的一个简单、有效的存储管理接口,该接口实现了跨服务器和存储平台。 ASM是文件系统filesystem和volume manager卷管理软件的一体化,专门为Oracle的数据库文件锁设计的; ASM在保证如文件系统般管理简单的基础上提供高性能的异步Async IO。ASM的引入提高了数据库的可扩展容量,同时节约了DBA的时间,使其能够更敏捷、更高效地管理一个流动性较大的数据库环境。
ASM的出现是为RDBMS管理文件存储
ASM基础概念:
ASM存储以diskgroups的概念呈现:
ASM所提供的高可用性:
Failure Group镜像的使用
重新平衡Rebalancing
性能方面
其他知识
Disk Group:
Disk Group”磁盘组” 是ASM管理的逻辑概念对象,一个Disk Group由多个ASM disk组成。每一个Disk Group都是子描述的,如同一个标准的文件系统一样。所有关于该Diskgroup 空间使用信息的元数据均完整地包含在这个磁盘组中。 若ASM可以找到所有属于该ASM diskgroup的DISK则他不需要任何其他额外的元数据。
文件空间从Disk Group中分配。任何一个ASM文件总是完整地包含在一个单独的Disk Group中。但是,一个Disk Group可能包含了属于多个数据库的文件,一个单独的数据库的文件也可以存放在多个不同的Disk Group中。 在大多数实际的部署中,不会创建太多数量的Disk Groups,一般在3~4个。
Disk Group提供三种不同的redundancy冗余度,详见上文。
ASM Disk
一个ASM Disk是组成Disk Group的基本的持久的存储。 当一个ASM Disk加入到Disk Group中时,它要么采用管理员指定的ASM Disk Name要么采用系统自动分配的Disk Name。 这不同于OS 给用于访问该设备的”艺名”。 在一个Cluster集群中, 同一个Disk 可能在不同的节点上显示不同的Device Name设备名,例如在 Node1上的 /dev/sdc ,对应于Node2上的/dev/sdd。 ASM Disk必须在所有使用该Disk Group的实例上可用直接磁盘I/O访问。
实际上对于RDBMS Oracle而言访问ASM disk和访问普通的文件并没有什么不同,除非使用了ASMLIB(ASMLIB不是ASM必须的,再次强调!)。常规情况下ASM Disk是OS上可见的LUN的partition,该分区覆盖了所有不被操作系统所保留的磁盘的空间。 大多数操作系统需要保留LUN的第一个block作为分区表(partition table); 由于ASM总是会写ASM Disk的第一个块,所以要保证ASM不会去覆盖前几个block上的分区表(partition table),例如在Solaris上分区时不要把前几个柱面划给partition。LUN可以是简单的物理JBOD,或者是由高级存储阵列管理的虚拟LUN。既可以是直连的设备也可以是SAN。ASM Disk可以是任何被开发系统调用所访问的东西,除了本地文件系统。 甚至于NFS上的文件都可以被当做一个ASM Disk来用,这样便于喜欢NAS的用户使用ASM,当然比起NFS来我更建议干脆用ISCSI。
注意虽然可以使用普通logical Volume Manager LVM管理的logical volume作为ASM Disk,但是这并不是推荐组合,除非你想不到其他更好的办法。 即便你一定要这样用,但是注意也不要在LVM级别做镜像和条带化。
ASM将任何文件以AU大小均匀分布在Disk Group的所有Disk上。每一个ASM Disk均被维护以保持同样的使用比率。这保证同一个Disk Group中的所有Disk的IO负载基本一致。由于ASM在一个Disk Group中的磁盘上的负载均衡,所以为同一个物理磁盘的不同区域划分为2个ASM Disk不会对性能有所影响;而同一个物理磁盘上划分2个不同分区置于不同的2个Disk Group则有效。
当ASM Disk Group启用冗余时单个ASM Disk仅是一个失败单元。对于该ASM Disk的写失败在10g会自动从该Disk Group drop掉该Disk,前提是该Disk的丢失被容许。
Allocation Unit
每一个ASM Disk都被划分为许多个AU allocation units(单个AU 的大小在 1MB ~64MB,注意总是2的次方MB)。而且AU allocation unit也是Disk Group的基本分配单元。一个ASM Disk上的可用空间总是整数倍个AU。在每一个ASM Disk的头部均有一个表,该表的每一条记录代表该ASM Disk上的一个AU。文件的extent指针(pointer)给出了ASM Disk Number磁盘号和AU号,这就描述了该extent的物理位置。由于所有的空间操作都以AU为单位,所以不存在所谓ASM碎片这样的概念和问题。
一个AU(1M~64M)足够小,以便一个文件总是要包含很多个AU,这样就可以分布在很多磁盘上,也不会造成热点。一个AU又足够大以便能够在一个IO操作中访问它,以获得更加的吞吐量,也能提供高效的顺序访问。访问一个AU的时间将更多的消耗在磁盘传输速率上而非花在寻找AU头上。对于Disk Group的重新平衡也是对每一个AU逐次做的。
了解ASM后台进程的作用:
GMON: ASM Diskgroup监控进程
ASMB: ASM后台网络进程
RBAL: ASM reblance master process 重新平衡主进程
ARBx: reblance slave process实际实施reblance的后台进程
MARK: AU resync AU重新同步的指挥家进程
了解ASM前台进程的作用:
ASM的client(主要是RDBMS DB和CRSD))在连接ASM实例时会产生前台进程,前天进程的名字一般为oracle+ASM_
OCR 特有的前台进程foreground: oracle+ASM1_ocr
ASM相关的V$和X$视图
视图名 | X$基表名 | 描述 |
V$ASM_DISKGROUP | X$KFGRP | 实施磁盘发现disk discovery和列出磁盘组 |
V$ASM_DISKGROUP_STAT | X$KFGRP_STAT | 显示disk group状态 |
V$ASM_DISK | X$KFDSK, X$KFKID | 实施磁盘发现disk discovery和列出磁盘以及这些磁盘的使用度量信息 |
V$ASM_DISK_STAT | X$KFDSK_STAT,X$KFKID | 列出磁盘和其使用度量信息 |
V$ASM_FILE | X$KFFIL | 列出ASM文件也包括了元数据信息 |
V$ASM_ALIAS | X$KFALS | 列出了ASM的别名,文件和目录 |
V$ASM_TEMPLATE | X$KFTMTA | 列出可用的模板和其属性 |
V$ASM_CLIENT | X$KFNCL | 列出链接到ASM的DB实例 |
V$ASM_OPERATION | X$KFGMG | 列出rebalancing重平衡操作 |
N/A | X$KFKLIB | 可用的ASMLIB路径 |
N/A | X$KFDPARTNER | 列出Disk-partners关系 |
N/A | X$KFFXP | 所有ASM文件的extent map |
N/A | X$KFDAT | 所有ASM Disk的extent列表 |
N/A | X$KFBH | 描述ASM cache |
N/A | X$KFCCE | ASM block的链表 |
V$ASM_ATTRIBUTE(new in 11g) | X$KFENV(new in 11g) | Asm属性,该X$基表还显示一些隐藏属性 |
V$ASM_DISK_IOSTAT(new in 11g) | X$KFNSDSKIOST(new in 11g) | I/O统计信息 |
N/A | X$KFDFS(new in 11g) | |
N/A | X$KFDDD(new in 11g) | |
N/A | X$KFGBRB(new in 11g) | |
N/A | X$KFMDGRP(new in 11g) | |
N/A | X$KFCLLE(new in 11g) | |
N/A | X$KFVOL(new in 11g) | |
N/A | X$KFVOLSTAT(new in 11g) | |
N/A | X$KFVOFS(new in 11g) | |
N/A | X$KFVOFSV(new in 11g) |
X$KFFXP包含了文件、extent和AU之间的映射关系。 从该X$视图可以追踪给定文件的extent的条带化和镜像情况。注意对于primary au和mirror au读操作的负载是均衡的, 而写操作要求同时写2者到磁盘。以下是X$KFFXP视图列的含义
X$KFFXP Column Name | Description |
ADDR | x$ table address/identifier |
INDX | row unique identifier |
INST_ID | instance number (RAC) |
NUMBER_KFFXP | ASM file number. Join with v$asm_file and v$asm_alias |
COMPOUND_KFFXP | File identifier. Join with compound_index in v$asm_file |
INCARN_KFFXP | File incarnation id. Join with incarnation in v$asm_file |
PXN_KFFXP | Progressive file extent number |
XNUM_KFFXP | ASM file extent number (mirrored extent pairs have the same extent value) |
GROUP_KFFXP | ASM disk group number. Join with v$asm_disk and v$asm_diskgroup |
DISK_KFFXP | Disk number where the extent is allocated. Join with v$asm_disk |
AU_KFFXP |
Relative position of the allocation unit from the beginning of the disk. The allocation unit size (1 MB) in v$asm_diskgroup |
LXN_KFFXP | 0->primary extent, ->mirror extent, 2->2nd mirror copy (high redundancy and metadata) |
FLAGS_KFFXP | N.K. |
CHK_KFFXP | N.K. |
X$KFDAT该X$视图包含了所有allocation unit AU的细节,不管是FREE的还是USED。
X$KFDAT Column Name | Description |
ADDR | x$ table address/identifier |
INDX | row unique identifier |
INST_ID | instance number (RAC) |
GROUP_KFDAT | diskgroup number, join with v$asm_diskgroup |
NUMBER_KFDAT | disk number, join with v$asm_disk |
COMPOUND_KFDAT | disk compund_index, join with v$asm_disk |
AUNUM_KFDAT |
Disk allocation unit (relative position from the beginning of the disk), join with x$kffxp.au_kffxp |
V_KFDAT | V=this Allocation Unit is used; F=AU is free |
FNUM_KFDAT | file number, join with v$asm_file |
I_KFDAT | N/K |
XNUM_KFDAT | Progressive file extent number join with x$kffxp.pxn_kffxp |
RAW_KFDAT | raw format encoding of the disk,and file extent information |
X$KFDPARTNER 这个X$视图包含了 disk-partner(1-N)的映射关系,在一个给定ASM Diskgroup,若2个Disk存有同一个extent的镜像拷贝,则将2个disk视作partners。因此partners必须属于同一个diskgroup下的不同的failgroup。
X$KFDPARTNER Column Name | Description |
ADDR | x$ table address/identifier |
INDX | row unique identifier |
INST_ID | instance number (RAC) |
GRP | diskgroup number, join with v$asm_diskgroup |
DISK | disk number, join with v$asm_disk |
COMPOUND | disk identifier. Join with compound_index in v$asm_disk |
NUMBER_KFDPARTNER | partner disk number, i.e. disk-to-partner (1-N) relationship |
MIRROR_KFDPARNER | if=1 in a healthy normal redundancy config |
PARITY_KFDPARNER | if=1 in a healthy normal redundancy config |
ACTIVE_KFDPARNER | if=1 in a healthy normal redundancy config |
研究ASM必要的技巧
1)找出ASM的镜像mirror extent,在例子中是ASM的spfile
[grid@localhost ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.3.0 Production on Wed Feb 13 11:13:39 2013 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Automatic Storage Management option INSTANCE_NAME ---------------- +ASM SQL> SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string +SYSTEMDG/asm/asmparameterfile /registry.253.805993079 select GROUP_KFFXP, DISK_KFFXP, AU_KFFXP from x$kffxp where number_kffxp = (select file_number from v$asm_alias where name = 'REGISTRY.253.805993079'); GROUP_KFFXP DISK_KFFXP AU_KFFXP ----------- ---------- ---------- 3 2 38 3 1 39 3 0 44 也可以这样定位 select GROUP_KFDAT, NUMBER_KFDAT, AUNUM_KFDAT from x$kfdat where fnum_kfdat = (select file_number from v$asm_alias where name = 'REGISTRY.253.805993079') GROUP_KFDAT NUMBER_KFDAT AUNUM_KFDAT ----------- ------------ ----------- 3 0 44 3 1 39 3 2 38 ==> 找到该 DISK对应的路径 SQL> select path,DISK_NUMBER from v$asm_disk where GROUP_NUMBER=3 and disk_number in (0,1,2); PATH DISK_NUMBER -------------------- ----------- /dev/asm-diski 2 /dev/asm-diskh 1 /dev/asm-diskg 0 SQL> create pfile='/home/grid/pfile' from spfile; File created. SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Automatic Storage Management option [grid@localhost ~]$ cat pfile +ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount *.asm_diskstring='/dev/asm*' *.asm_power_limit=1 *.diagnostic_dest='/g01/app/grid' *.instance_type='asm' *.large_pool_size=12M *.local_listener='LISTENER_+ASM' *.remote_login_passwordfile='EXCLUSIVE' 通过dd读取该AU [grid@localhost ~]$ dd if=/dev/asm-diski of=/tmp/spfile.dmp skip=38 bs=1024k count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.00328614 seconds, 319 MB/s [grid@localhost ~]$ strings /tmp/spfile.dmp +ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount *.asm_diskstring='/dev/asm*' *.asm_power_limit=1 *.diagnostic_dest='/g01/app/grid' *.instance_type='asm' *.large_pool_size=12M *.local_listener='LISTENER_+ASM' *.remote_login_passwordfile='EXCLUSIVE' [grid@localhost ~]$ dd if=/dev/asm-diskh of=/tmp/spfile1.dmp skip=39 bs=1024k count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.0325114 seconds, 32.3 MB/s [grid@localhost ~]$ strings /tmp/spfile1.dmp +ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount *.asm_diskstring='/dev/asm*' *.asm_power_limit=1 *.diagnostic_dest='/g01/app/grid' *.instance_type='asm' *.large_pool_size=12M *.local_listener='LISTENER_+ASM' *.remote_login_passwordfile='EXCLUSIVE' [grid@localhost ~]$ dd if=/dev/asm-diskg of=/tmp/spfile2.dmp skip=44 bs=1024k count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.0298287 seconds, 35.2 MB/s [grid@localhost ~]$ strings /tmp/spfile2.dmp +ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount *.asm_diskstring='/dev/asm*' *.asm_power_limit=1 *.diagnostic_dest='/g01/app/grid' *.instance_type='asm' *.large_pool_size=12M *.local_listener='LISTENER_+ASM' *.remote_login_passwordfile='EXCLUSIVE'
2) 显示asm disk failure group和 disk partners的映射关系:
1* select DISK_NUMBER,FAILGROUP,path from v$asm_disk where group_number=3 SQL> / DISK_NUMBER FAILGROUP PATH ----------- ------------------------------ -------------------- 3 SYSTEMDG_0003 /dev/asm-diskj 2 SYSTEMDG_0002 /dev/asm-diski 1 SYSTEMDG_0001 /dev/asm-diskh 0 SYSTEMDG_0000 /dev/asm-diskg SQL> select disk,NUMBER_KFDPARTNER,DISKFGNUM from X$KFDPARTNER where grp=3; DISK NUMBER_KFDPARTNER DISKFGNUM ---------- ----------------- ---------- 0 1 1 0 2 1 0 3 1 1 0 2 1 2 2 1 3 2 2 0 3 2 1 3 2 3 3 3 0 4 3 1 4 3 2 4 12 rows selected.
ASM常见问题, FAQ:
Q:ASM做 rebalance和 mirror 的基本颗粒是什么?
A: ASM做mirror 镜像的基本颗粒是file的extent,默认情况下一个extent等于一个AU,11g之后一个extent可以是1 or 8 or 64个AU
ASM做rebalance重新平衡的基本颗粒也是extent,虽然重新平衡是对每一个AU逐次做的。
Q:ASMLIB和ASM的关系是什么?
A:ASMLIB是一种种基于Linux module,专门为Oracle Automatic Storage Management特性设计的内核支持库(kernel support library)。
简单来说ASMLIB是一种Linux下的程序包,它不属于Oracle ASM kernel。 通过ASMLIb可以做到设备名绑定,便于ASM使用的目的; 但是Linux上能实现设备名绑定并便于ASM使用的服务有很多,例如udev、mpath等;
所以ASMLIB并不是ASM必须的组件; 国内的中文文章对于该概念的描述大多不清晰,造成了ASMLIB=ASM或者ASM必须用ASMLIB的误解,这是以讹传讹。
Q: ASM是否是raid 10或者raid 01?
A:ASM的mirror是基于file extent的,而不是像raid那样基于disk或者block。 所以ASM既不同于Raid 10,也不是Raid 01。 如果硬要说相似点的话,因为ASM是先mirror镜像后stripe条带化,所以在这个特征上更像Raid 10。 但是注意,再次强调,ASM既不是RAID 10也不是RAID 01, 重复一千遍。。。。。。。。。。。。。
ASM file number 1 – the File Directory
ASM文件目录File Directory针对本Disk Group中的每一个文件包含一条记录。该记录指向该文件的前60个数据盘区extents,必要时还包括间接盘区indirect extents。该文件目录在必要容纳更多文件数目时会自动增长。每一个文件目录记录保持更新以下文件信息:
ASM 1号文件 file number 1
文件号file number是文件目录中找到对应文件记录的重要索引键。 其中第一条记录是该文件目录自身。为了找出过期的文件号,所以在每个文件创建时都生成了一个唯一的32 bit的识别号incarnation number。由此,disk group的ID+ file number + 该incarnation number 可以做到唯一识别某个指定文件。
请注意,约定俗成地将ASM文件的第一个block称为0号块–block zero。 0号块通常包含十分重要的接口信息。
文件目录file directory 的位置
为了找出file directory所在AU的位置,我们需要使用kfed工具浏览ASM disk header磁盘头部0号AU中的kfdhdb.f1b1locn信息,例如我们使用kfed查看asm disk /dev/asm-diski上的信息:
[grid@localhost ~]$ kfed read /dev/asm-diski aun=0 |less
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: blk=0
kfbh.block.obj: 2147483650 ; 0x008: disk=2
kfbh.check: 2593903300 ; 0x00c: 0x9a9bd2c4
kfbh.fcn.base: 217 ; 0x010: 0x000000d9
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000
kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000
kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000
kfdhdb.compat: 186646528 ; 0x020: 0x0b200000
kfdhdb.dsknum: 2 ; 0x024: 0x0002
kfdhdb.grptyp: 3 ; 0x026: KFDGTP_HIGH
kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname: SYSTEMDG_0002 ; 0x028: length=13
kfdhdb.grpname: SYSTEMDG ; 0x048: length=8
kfdhdb.fgname: SYSTEMDG_0002 ; 0x068: length=13
kfdhdb.capname: ; 0x088: length=0
kfdhdb.crestmp.hi: 32982958 ; 0x0a8: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7dd
kfdhdb.crestmp.lo: 3878604800 ; 0x0ac: USEC=0x0 MSEC=0x3b4 SECS=0x32 MINS=0x39
kfdhdb.mntstmp.hi: 32983461 ; 0x0b0: HOUR=0x5 DAYS=0xd MNTH=0x2 YEAR=0x7dd
kfdhdb.mntstmp.lo: 474934272 ; 0x0b4: USEC=0x0 MSEC=0x3bb SECS=0x4 MINS=0x7
kfdhdb.secsize: 512 ; 0x0b8: 0x0200
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize: 3072 ; 0x0c4: 0x00000c00
kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001
kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000
kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000
kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000
kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000
kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000
kfdhdb.grpstmp.hi: 32982958 ; 0x0e4: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7dd
kfdhdb.grpstmp.lo: 3878197248 ; 0x0e8: USEC=0x0 MSEC=0x226 SECS=0x32 MINS=0x39
kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000
kfdhdb.vfend: 0 ; 0x0f0: 0x00000000
kfdhdb.spfile: 38 ; 0x0f4: 0x00000026
kfdhdb.spfflg: 1 ; 0x0f8: 0x00000001
//也可以通过查询X$KFFXP视图找出该FILE NUMBER=1的文件的Allocation Units
select disk_kffxp, AU_kffxp, xnum_kffxp
from x$kffxp
where group_kffxp = 3 -- Diskgroup 3 (GROUPB)
and number_kffxp = 1 -- File 1 (file directory)
/
DISK_KFFXP AU_KFFXP XNUM_KFFXP
---------- ---------- ----------
0 2 0
1 2 0
2 2 0
2 46 1
3 44 1
0 46 1
上面显示的结果显示 在disk number =0 的ASM Disk 上的allocation units 2属于file number=1的file directory, 同理 在disk number =0 的ASM Disk 上的allocation units 46也属于file number=1的file directory。
在1MB allocation units大小,4k ASM block大小的前提下,第一个allocation unit可以存放255个目录记录(256*4k=1MB)。 由于前255个文件是为ASM元数据保留的,所以第一个allocation unit仅记录ASM元数据文件第一到第六个。剩下的allocation unit(46)则存放接下来的255个ASM文件。
文件目录结构
Allocation unit=2 的block 1描述了该ASM 1号文件file directory自身。该块的前部分包含了标准的头部信息,并显示该块的类型为KFBTYP_FILEDIR。 在该kfffdb结构之后,该file directory的每一个block包含描述文件物理属性和盘区指针的信息, 以及指向所有间接盘区的指针。
以下是aun=2 block=1的file directory信息:
[grid@localhost ~]$ kfed read /dev/asm-diski aun=2 blkn=1 > block.log [grid@localhost ~]$ vi block.log kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 1 ; 0x004: blk=1 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 3254018873 ; 0x00c: 0xc1f46339 kfbh.fcn.base: 493 ; 0x010: 0x000001ed kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 2097152 ; 0x010: 0x00200000 kfffdb.xtntcnt: 6 ; 0x014: 0x00000006 kfffdb.xtnteof: 6 ; 0x018: 0x00000006 kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0 kfffdb.fileType: 15 ; 0x021: 0x0f kfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3 kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3 kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffff kfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000 kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000 kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffff kfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000 kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000 kfffdb.xtntblk: 6 ; 0x03c: 0x0006 kfffdb.break: 60 ; 0x03e: 0x003c kfffdb.priZn: 0 ; 0x040: KFDZN_COLD kfffdb.secZn: 0 ; 0x041: KFDZN_COLD kfffdb.ub2spare: 0 ; 0x042: 0x0000
其中字段的含义:
KFBTYP_FILEDIR // block type = file directory block
kfffdb.node.incarn: File incarnation information
kfffdb.hibytes File size (high bytes)
kfffdb.lobyte 2097152 ; 0×010: 0×00200000 File size (low bytes) 2097152 ==》2MB大小
kfffdb.xtntcnt: 6 ; 0×014: 0×00000006 // 6 extents for this file
kfffdb.xtnteof: 6 ; 0×018: 0×00000006 // 6 extents before eof
kfffdb.blkSize: 4096 ; 0x01c: 0×00001000 // 标准ASM block大小
kfffdb.flags: 1 ; 0×020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0
// Flag definitions
O – File is original, not snapshot
S – File is striped
S – Strict allocation policy
D – File is damaged
C – File creation is committed
I – File has empty indirect block
R – File has known at-risk value
A – The at-risk value itsefl
接下来看一个ASM metadata 文件的实际目录记录,我们就查看aun=2的 blkn=4
[grid@localhost ~]$ kfed read /dev/asm-diski aun=2 blkn=4|less kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 4 ; 0x004: blk=4 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 3786097185 ; 0x00c: 0xe1ab4221 kfbh.fcn.base: 206 ; 0x010: 0x000000ce kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 8331264 ; 0x010: 0x007f2000 kfffdb.xtntcnt: 24 ; 0x014: 0x00000018 kfffdb.xtnteof: 24 ; 0x018: 0x00000018 kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0 kfffdb.fileType: 15 ; 0x021: 0x0f kfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3 kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3 kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffff kfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000 kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000 kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffff kfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000 kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000 kfffdb.xtntblk: 24 ; 0x03c: 0x0018 kfffdb.break: 60 ; 0x03e: 0x003c kfffdb.priZn: 0 ; 0x040: KFDZN_COLD kfffdb.secZn: 0 ; 0x041: KFDZN_COLD kfffdb.ub2spare: 0 ; 0x042: 0x0000 kfffdb.alias[0]: 4294967295 ; 0x044: 0xffffffff kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 0 ; 0x04c: 0x00 kfffdb.strpsz: 0 ; 0x04d: 0x00 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 32982958 ; 0x050: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7dd kfffdb.crets.lo: 3878730752 ; 0x054: USEC=0x0 MSEC=0x2f SECS=0x33 MINS=0x39 kfffdb.modts.hi: 32982958 ; 0x058: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7dd kfffdb.modts.lo: 3878730752 ; 0x05c: USEC=0x0 MSEC=0x2f SECS=0x33 MINS=0x39 kfffdb.dasz[0]: 0 ; 0x060: 0x00 kfffdb.dasz[1]: 0 ; 0x061: 0x00 kfffdb.dasz[2]: 0 ; 0x062: 0x00 kfffdb.dasz[3]: 0 ; 0x063: 0x00 kfffdb.permissn: 0 ; 0x064: 0x00 kfffdb.ub1spar1: 0 ; 0x065: 0x00 kfffdb.ub2spar2: 0 ; 0x066: 0x0000 kfffdb.user.entnum: 0 ; 0x068: 0x0000 kfffdb.user.entinc: 0 ; 0x06a: 0x0000 kfffdb.group.entnum: 0 ; 0x06c: 0x0000 kfffdb.group.entinc: 0 ; 0x06e: 0x0000 kfffdb.spare[0]: 0 ; 0x070: 0x00000000 kfffdb.spare[1]: 0 ; 0x074: 0x00000000 kfffdb.spare[2]: 0 ; 0x078: 0x00000000 kfffdb.spare[3]: 0 ; 0x07c: 0x00000000 kfffdb.spare[4]: 0 ; 0x080: 0x00000000 kfffdb.spare[5]: 0 ; 0x084: 0x00000000 kfffdb.spare[6]: 0 ; 0x088: 0x00000000 kfffdb.spare[7]: 0 ; 0x08c: 0x00000000 kfffdb.spare[8]: 0 ; 0x090: 0x00000000 kfffdb.spare[9]: 0 ; 0x094: 0x00000000 kfffdb.spare[10]: 0 ; 0x098: 0x00000000 kfffdb.spare[11]: 0 ; 0x09c: 0x00000000 kfffdb.usm: ; 0x0a0: length=0 kfffde[0].xptr.au: 36 ; 0x4a0: 0x00000024 kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0 kfffde[0].xptr.chk: 15 ; 0x4a7: 0x0f kfffde[1].xptr.au: 45 ; 0x4a8: 0x0000002d kfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0 kfffde[1].xptr.chk: 7 ; 0x4af: 0x07 kfffde[2].xptr.au: 34 ; 0x4b0: 0x00000022 kfffde[2].xptr.disk: 3 ; 0x4b4: 0x0003 kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0 kfffde[2].xptr.chk: 11 ; 0x4b7: 0x0b kfffde[3].xptr.au: 36 ; 0x4b8: 0x00000024 kfffde[3].xptr.disk: 0 ; 0x4bc: 0x0000 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0 kfffde[3].xptr.chk: 14 ; 0x4bf: 0x0e kfffde[4].xptr.au: 43 ; 0x4c0: 0x0000002b kfffde[4].xptr.disk: 3 ; 0x4c4: 0x0003 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0 kfffde[4].xptr.chk: 2 ; 0x4c7: 0x02 kfffde[5].xptr.au: 37 ; 0x4c8: 0x00000025 kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001 kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0 kfffde[5].xptr.chk: 14 ; 0x4cf: 0x0e kfffde[6].xptr.au: 42 ; 0x4d0: 0x0000002a kfffde[6].xptr.disk: 2 ; 0x4d4: 0x0002 kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 S=0 kfffde[6].xptr.chk: 2 ; 0x4d7: 0x02 kfffde[7].xptr.au: 40 ; 0x4d8: 0x00000028 kfffde[7].xptr.disk: 1 ; 0x4dc: 0x0001 kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 S=0 kfffde[7].xptr.chk: 3 ; 0x4df: 0x03 kfffde[8].xptr.au: 39 ; 0x4e0: 0x00000027 kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003 kfffde[8].xptr.flags: 0 ; 0x4e6: L=0 E=0 D=0 S=0
其中字段的含义:
kfffdb.lobytes: 8331264 ; 0×010: 0x007f2000 ==>说明文件大小为8331264bytes
kfffdb.xtntcnt: 24 ; 0×014: 0×00000018
kfffdb.xtnteof: 24 ; 0×018: 0×00000018 ==> 说明该文件目前共24个extents
kfffdb.blkSize: 4096 ; 0x01c: 0×00001000 ==> 4k的ASM Block size
kfffdb.fileType: 15 ; 0×021: 0x0f filetype=15 说明是ASM Metadata File
kfffde[0].xptr.au: 36 ; 0x4a0: 0×00000024 file number=4 的第一extent指向36号 AU
kfffde[0].xptr.disk: 1 ; 0x4a4: 0×0001 Disk number 1
kfffde[1].xptr.au: 45 ; 0x4a8: 0x0000002d file number=4 的第二extent指向45号AU
kfffde[2].xptr.au: 4294967295 ; 0x4b0: 0xfffffff 若 kfffde[N].xptr.au=4294967295 说明该FILE没有更多extent了
AU的指针情况, 可以这样查看:
[grid@localhost ~]$ kfed read /dev/asm-diski aun=2 blkn=4| egrep "xptr.au|xptr.disk"|less kfffde[0].xptr.au: 36 ; 0x4a0: 0x00000024 kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001 kfffde[1].xptr.au: 45 ; 0x4a8: 0x0000002d kfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000 kfffde[2].xptr.au: 34 ; 0x4b0: 0x00000022 kfffde[2].xptr.disk: 3 ; 0x4b4: 0x0003 kfffde[3].xptr.au: 36 ; 0x4b8: 0x00000024 kfffde[3].xptr.disk: 0 ; 0x4bc: 0x0000 kfffde[4].xptr.au: 43 ; 0x4c0: 0x0000002b kfffde[4].xptr.disk: 3 ; 0x4c4: 0x0003 kfffde[5].xptr.au: 37 ; 0x4c8: 0x00000025 kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001 kfffde[6].xptr.au: 42 ; 0x4d0: 0x0000002a kfffde[6].xptr.disk: 2 ; 0x4d4: 0x0002 kfffde[7].xptr.au: 40 ; 0x4d8: 0x00000028 kfffde[7].xptr.disk: 1 ; 0x4dc: 0x0001 kfffde[8].xptr.au: 39 ; 0x4e0: 0x00000027 kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003 kfffde[9].xptr.au: 40 ; 0x4e8: 0x00000028 kfffde[9].xptr.disk: 3 ; 0x4ec: 0x0003 kfffde[10].xptr.au: 41 ; 0x4f0: 0x00000029 kfffde[10].xptr.disk: 1 ; 0x4f4: 0x0001 kfffde[11].xptr.au: 40 ; 0x4f8: 0x00000028 kfffde[11].xptr.disk: 0 ; 0x4fc: 0x0000 kfffde[12].xptr.au: 42 ; 0x500: 0x0000002a kfffde[12].xptr.disk: 1 ; 0x504: 0x0001 kfffde[13].xptr.au: 41 ; 0x508: 0x00000029 kfffde[13].xptr.disk: 0 ; 0x50c: 0x0000 kfffde[14].xptr.au: 43 ; 0x510: 0x0000002b kfffde[14].xptr.disk: 2 ; 0x514: 0x0002 kfffde[15].xptr.au: 42 ; 0x518: 0x0000002a kfffde[15].xptr.disk: 0 ; 0x51c: 0x0000 kfffde[16].xptr.au: 41 ; 0x520: 0x00000029 kfffde[16].xptr.disk: 3 ; 0x524: 0x0003 kfffde[17].xptr.au: 43 ; 0x528: 0x0000002b kfffde[17].xptr.disk: 1 ; 0x52c: 0x0001 kfffde[18].xptr.au: 44 ; 0x530: 0x0000002c kfffde[18].xptr.disk: 2 ; 0x534: 0x0002 kfffde[19].xptr.au: 43 ; 0x538: 0x0000002b kfffde[19].xptr.disk: 0 ; 0x53c: 0x0000 kfffde[20].xptr.au: 44 ; 0x540: 0x0000002c kfffde[20].xptr.disk: 1 ; 0x544: 0x0001 kfffde[20].xptr.disk: 1 ; 0x544: 0x0001 kfffde[21].xptr.au: 42 ; 0x548: 0x0000002a kfffde[21].xptr.disk: 3 ; 0x54c: 0x0003 kfffde[22].xptr.au: 45 ; 0x550: 0x0000002d kfffde[22].xptr.disk: 2 ; 0x554: 0x0002 kfffde[23].xptr.au: 45 ; 0x558: 0x0000002d kfffde[23].xptr.disk: 1 ; 0x55c: 0x0001 kfffde[24].xptr.au: 4294967295 ; 0x560: 0xffffffff kfffde[24].xptr.disk: 65535 ; 0x564: 0xffff kfffde[25].xptr.au: 4294967295 ; 0x568: 0xffffffff kfffde[25].xptr.disk: 65535 ; 0x56c: 0xffff kfffde[26].xptr.au: 4294967295 ; 0x570: 0xffffffff kfffde[26].xptr.disk: 65535 ; 0x574: 0xffff kfffde[27].xptr.au: 4294967295 ; 0x578: 0xffffffff 可以这样验证一下 select disk_kffxp, AU_kffxp, xnum_kffxp from x$kffxp where group_kffxp = 3 -- Diskgroup 3 (GROUPB) and number_kffxp =4 / DISK_KFFXP AU_KFFXP XNUM_KFFXP ---------- ---------- ---------- 1 36 0 0 45 0 3 34 0 0 36 1 3 43 1 1 37 1 2 42 2 1 40 2 3 39 2 3 40 3 1 41 3 0 40 3 1 42 4 0 41 4 2 43 4 0 42 5 3 41 5 1 43 5 2 44 6 0 43 6 1 44 6 3 42 7 2 45 7 1 45 7