ASM file number 1 - the File Directory ASM文件目录File Directory针对本Disk Group中的每一个文件包含一条记录。该记录指向该文件的前60个数据盘区extents,必要时还包括间接盘区indirect extents。该文件目录在必要容纳更多文件数目时会自动增长。每一个文件目录记录保持更新以下文件信息:
- 文件大小
- 该文件的块大小
- 文件种类,例如:数据文件,ASM元数据文件,在线日志,归档日志,控制文件等等
- 文件冗余度:外部、2路或者3路镜像
- 条带化配置,coarse or fine
- 到前60个extent的直接盘区指针(direct extent pointer)
- 300个间接盘区指针(indirect extent pointers)
- 创建时间戳
- 最后修改或更新时间戳
- 指向别名目录中的用户别名和文件名
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 |lesskfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 1 ; 0x002: KFBTYP_DISKHEADkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 0 ; 0x004: blk=0kfbh.block.obj: 2147483650 ; 0x008: disk=2kfbh.check: 2593903300 ; 0x00c: 0x9a9bd2c4kfbh.fcn.base: 217 ; 0x010: 0x000000d9kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000kfdhdb.compat: 186646528 ; 0x020: 0x0b200000kfdhdb.dsknum: 2 ; 0x024: 0x0002kfdhdb.grptyp: 3 ; 0x026: KFDGTP_HIGHkfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBERkfdhdb.dskname: SYSTEMDG_0002 ; 0x028: length=13kfdhdb.grpname: SYSTEMDG ; 0x048: length=8kfdhdb.fgname: SYSTEMDG_0002 ; 0x068: length=13kfdhdb.capname: ; 0x088: length=0kfdhdb.crestmp.hi: 32982958 ; 0x0a8: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7ddkfdhdb.crestmp.lo: 3878604800 ; 0x0ac: USEC=0x0 MSEC=0x3b4 SECS=0x32 MINS=0x39kfdhdb.mntstmp.hi: 32983461 ; 0x0b0: HOUR=0x5 DAYS=0xd MNTH=0x2 YEAR=0x7ddkfdhdb.mntstmp.lo: 474934272 ; 0x0b4: USEC=0x0 MSEC=0x3bb SECS=0x4 MINS=0x7kfdhdb.secsize: 512 ; 0x0b8: 0x0200kfdhdb.blksize: 4096 ; 0x0ba: 0x1000kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80kfdhdb.dsksize: 3072 ; 0x0c4: 0x00000c00kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000kfdhdb.grpstmp.hi: 32982958 ; 0x0e4: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7ddkfdhdb.grpstmp.lo: 3878197248 ; 0x0e8: USEC=0x0 MSEC=0x226 SECS=0x32 MINS=0x39kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000kfdhdb.vfend: 0 ; 0x0f0: 0x00000000kfdhdb.spfile: 38 ; 0x0f4: 0x00000026kfdhdb.spfflg: 1 ; 0x0f8: 0x00000001//也可以通过查询X$KFFXP视图找出该FILE NUMBER=1的文件的Allocation Unitsselect 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: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 4 ; 0x002: KFBTYP_FILEDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 1 ; 0x004: blk=1kfbh.block.obj: 1 ; 0x008: file=1kfbh.check: 3254018873 ; 0x00c: 0xc1f46339kfbh.fcn.base: 493 ; 0x010: 0x000001edkfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffffkfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0kfffdb.hibytes: 0 ; 0x00c: 0x00000000kfffdb.lobytes: 2097152 ; 0x010: 0x00200000kfffdb.xtntcnt: 6 ; 0x014: 0x00000006kfffdb.xtnteof: 6 ; 0x018: 0x00000006kfffdb.blkSize: 4096 ; 0x01c: 0x00001000kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0kfffdb.fileType: 15 ; 0x021: 0x0fkfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffffkfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffffkfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000kfffdb.xtntblk: 6 ; 0x03c: 0x0006kfffdb.break: 60 ; 0x03e: 0x003ckfffdb.priZn: 0 ; 0x040: KFDZN_COLDkfffdb.secZn: 0 ; 0x041: KFDZN_COLDkfffdb.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 ; 0x010: 0x00200000 File size (low bytes) 2097152 ==》2MB大小 kfffdb.xtntcnt: 6 ; 0x014: 0x00000006 // 6 extents for this file kfffdb.xtnteof: 6 ; 0x018: 0x00000006 // 6 extents before eof kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 // 标准ASM block大小 kfffdb.flags: 1 ; 0x020: 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|lesskfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 4 ; 0x002: KFBTYP_FILEDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 4 ; 0x004: blk=4kfbh.block.obj: 1 ; 0x008: file=1kfbh.check: 3786097185 ; 0x00c: 0xe1ab4221kfbh.fcn.base: 206 ; 0x010: 0x000000cekfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffffkfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0kfffdb.hibytes: 0 ; 0x00c: 0x00000000kfffdb.lobytes: 8331264 ; 0x010: 0x007f2000kfffdb.xtntcnt: 24 ; 0x014: 0x00000018kfffdb.xtnteof: 24 ; 0x018: 0x00000018kfffdb.blkSize: 4096 ; 0x01c: 0x00001000kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0kfffdb.fileType: 15 ; 0x021: 0x0fkfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffffkfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffffkfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000kfffdb.xtntblk: 24 ; 0x03c: 0x0018kfffdb.break: 60 ; 0x03e: 0x003ckfffdb.priZn: 0 ; 0x040: KFDZN_COLDkfffdb.secZn: 0 ; 0x041: KFDZN_COLDkfffdb.ub2spare: 0 ; 0x042: 0x0000kfffdb.alias[0]: 4294967295 ; 0x044: 0xffffffffkfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffffkfffdb.strpwdth: 0 ; 0x04c: 0x00kfffdb.strpsz: 0 ; 0x04d: 0x00kfffdb.usmsz: 0 ; 0x04e: 0x0000kfffdb.crets.hi: 32982958 ; 0x050: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7ddkfffdb.crets.lo: 3878730752 ; 0x054: USEC=0x0 MSEC=0x2f SECS=0x33 MINS=0x39kfffdb.modts.hi: 32982958 ; 0x058: HOUR=0xe DAYS=0x1d MNTH=0x1 YEAR=0x7ddkfffdb.modts.lo: 3878730752 ; 0x05c: USEC=0x0 MSEC=0x2f SECS=0x33 MINS=0x39kfffdb.dasz[0]: 0 ; 0x060: 0x00kfffdb.dasz[1]: 0 ; 0x061: 0x00kfffdb.dasz[2]: 0 ; 0x062: 0x00kfffdb.dasz[3]: 0 ; 0x063: 0x00kfffdb.permissn: 0 ; 0x064: 0x00kfffdb.ub1spar1: 0 ; 0x065: 0x00kfffdb.ub2spar2: 0 ; 0x066: 0x0000kfffdb.user.entnum: 0 ; 0x068: 0x0000kfffdb.user.entinc: 0 ; 0x06a: 0x0000kfffdb.group.entnum: 0 ; 0x06c: 0x0000kfffdb.group.entinc: 0 ; 0x06e: 0x0000kfffdb.spare[0]: 0 ; 0x070: 0x00000000kfffdb.spare[1]: 0 ; 0x074: 0x00000000kfffdb.spare[2]: 0 ; 0x078: 0x00000000kfffdb.spare[3]: 0 ; 0x07c: 0x00000000kfffdb.spare[4]: 0 ; 0x080: 0x00000000kfffdb.spare[5]: 0 ; 0x084: 0x00000000kfffdb.spare[6]: 0 ; 0x088: 0x00000000kfffdb.spare[7]: 0 ; 0x08c: 0x00000000kfffdb.spare[8]: 0 ; 0x090: 0x00000000kfffdb.spare[9]: 0 ; 0x094: 0x00000000kfffdb.spare[10]: 0 ; 0x098: 0x00000000kfffdb.spare[11]: 0 ; 0x09c: 0x00000000kfffdb.usm: ; 0x0a0: length=0kfffde[0].xptr.au: 36 ; 0x4a0: 0x00000024kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0kfffde[0].xptr.chk: 15 ; 0x4a7: 0x0fkfffde[1].xptr.au: 45 ; 0x4a8: 0x0000002dkfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0kfffde[1].xptr.chk: 7 ; 0x4af: 0x07kfffde[2].xptr.au: 34 ; 0x4b0: 0x00000022kfffde[2].xptr.disk: 3 ; 0x4b4: 0x0003kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0kfffde[2].xptr.chk: 11 ; 0x4b7: 0x0bkfffde[3].xptr.au: 36 ; 0x4b8: 0x00000024kfffde[3].xptr.disk: 0 ; 0x4bc: 0x0000kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0kfffde[3].xptr.chk: 14 ; 0x4bf: 0x0ekfffde[4].xptr.au: 43 ; 0x4c0: 0x0000002bkfffde[4].xptr.disk: 3 ; 0x4c4: 0x0003kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0kfffde[4].xptr.chk: 2 ; 0x4c7: 0x02kfffde[5].xptr.au: 37 ; 0x4c8: 0x00000025kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0kfffde[5].xptr.chk: 14 ; 0x4cf: 0x0ekfffde[6].xptr.au: 42 ; 0x4d0: 0x0000002akfffde[6].xptr.disk: 2 ; 0x4d4: 0x0002kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 S=0kfffde[6].xptr.chk: 2 ; 0x4d7: 0x02kfffde[7].xptr.au: 40 ; 0x4d8: 0x00000028kfffde[7].xptr.disk: 1 ; 0x4dc: 0x0001kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 S=0kfffde[7].xptr.chk: 3 ; 0x4df: 0x03kfffde[8].xptr.au: 39 ; 0x4e0: 0x00000027kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003kfffde[8].xptr.flags: 0 ; 0x4e6: L=0 E=0 D=0 S=0
其中字段的含义:
kfffdb.lobytes: 8331264 ; 0x010: 0x007f2000 ==>说明文件大小为8331264bytes kfffdb.xtntcnt: 24 ; 0x014: 0x00000018 kfffdb.xtnteof: 24 ; 0x018: 0x00000018 ==> 说明该文件目前共24个extents kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 ==> 4k的ASM Block size kfffdb.fileType: 15 ; 0x021: 0x0f filetype=15 说明是ASM Metadata File kfffde[0].xptr.au: 36 ; 0x4a0: 0x00000024 file number=4 的第一extent指向36号 AU kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001 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"|lesskfffde[0].xptr.au: 36 ; 0x4a0: 0x00000024kfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001kfffde[1].xptr.au: 45 ; 0x4a8: 0x0000002dkfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000kfffde[2].xptr.au: 34 ; 0x4b0: 0x00000022kfffde[2].xptr.disk: 3 ; 0x4b4: 0x0003kfffde[3].xptr.au: 36 ; 0x4b8: 0x00000024kfffde[3].xptr.disk: 0 ; 0x4bc: 0x0000kfffde[4].xptr.au: 43 ; 0x4c0: 0x0000002bkfffde[4].xptr.disk: 3 ; 0x4c4: 0x0003kfffde[5].xptr.au: 37 ; 0x4c8: 0x00000025kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001kfffde[6].xptr.au: 42 ; 0x4d0: 0x0000002akfffde[6].xptr.disk: 2 ; 0x4d4: 0x0002kfffde[7].xptr.au: 40 ; 0x4d8: 0x00000028kfffde[7].xptr.disk: 1 ; 0x4dc: 0x0001kfffde[8].xptr.au: 39 ; 0x4e0: 0x00000027kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003kfffde[9].xptr.au: 40 ; 0x4e8: 0x00000028kfffde[9].xptr.disk: 3 ; 0x4ec: 0x0003kfffde[10].xptr.au: 41 ; 0x4f0: 0x00000029kfffde[10].xptr.disk: 1 ; 0x4f4: 0x0001kfffde[11].xptr.au: 40 ; 0x4f8: 0x00000028kfffde[11].xptr.disk: 0 ; 0x4fc: 0x0000kfffde[12].xptr.au: 42 ; 0x500: 0x0000002akfffde[12].xptr.disk: 1 ; 0x504: 0x0001kfffde[13].xptr.au: 41 ; 0x508: 0x00000029kfffde[13].xptr.disk: 0 ; 0x50c: 0x0000kfffde[14].xptr.au: 43 ; 0x510: 0x0000002bkfffde[14].xptr.disk: 2 ; 0x514: 0x0002kfffde[15].xptr.au: 42 ; 0x518: 0x0000002akfffde[15].xptr.disk: 0 ; 0x51c: 0x0000kfffde[16].xptr.au: 41 ; 0x520: 0x00000029kfffde[16].xptr.disk: 3 ; 0x524: 0x0003kfffde[17].xptr.au: 43 ; 0x528: 0x0000002bkfffde[17].xptr.disk: 1 ; 0x52c: 0x0001kfffde[18].xptr.au: 44 ; 0x530: 0x0000002ckfffde[18].xptr.disk: 2 ; 0x534: 0x0002kfffde[19].xptr.au: 43 ; 0x538: 0x0000002bkfffde[19].xptr.disk: 0 ; 0x53c: 0x0000kfffde[20].xptr.au: 44 ; 0x540: 0x0000002ckfffde[20].xptr.disk: 1 ; 0x544: 0x0001kfffde[20].xptr.disk: 1 ; 0x544: 0x0001kfffde[21].xptr.au: 42 ; 0x548: 0x0000002akfffde[21].xptr.disk: 3 ; 0x54c: 0x0003kfffde[22].xptr.au: 45 ; 0x550: 0x0000002dkfffde[22].xptr.disk: 2 ; 0x554: 0x0002kfffde[23].xptr.au: 45 ; 0x558: 0x0000002dkfffde[23].xptr.disk: 1 ; 0x55c: 0x0001kfffde[24].xptr.au: 4294967295 ; 0x560: 0xffffffffkfffde[24].xptr.disk: 65535 ; 0x564: 0xffffkfffde[25].xptr.au: 4294967295 ; 0x568: 0xffffffffkfffde[25].xptr.disk: 65535 ; 0x56c: 0xffffkfffde[26].xptr.au: 4294967295 ; 0x570: 0xffffffffkfffde[26].xptr.disk: 65535 ; 0x574: 0xffffkfffde[27].xptr.au: 4294967295 ; 0x578: 0xffffffff可以这样验证一下select disk_kffxp, AU_kffxp, xnum_kffxpfrom x$kffxpwhere 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
找出数据文件对应的目录记录directory entry: SQL> select GROUP_NUMBER, FILE_NUMBER, NAME from v$asm_alias 2 group by GROUP_NUMBER, FILE_NUMBER, NAME;GROUP_NUMBER FILE_NUMBER NAME------------ ----------- ---------------------------------------------------------------------- 3 253 REGISTRY.253.805993079 3 256 users01.dbf 3 256 users01.dbf.256.806828719 3 257 system01.dbf 3 257 system01.dbf.257.807460773 3 258 sysaux01.dbf 3 258 sysaux01.dbf.258.807460839 3 259 example01.dbf 3 259 example01.dbf.259.807460921 3 4294967295 ASM 3 4294967295 DATAFILE 3 4294967295 ASMPARAMETERFILE可以看到 system01.dbf 和 system01.dbf.257.807460773 是同一个file的2个alias其文件号为 257, 257-256=1 则其file directory的记录位于AU=46的 第一个block[grid@localhost ~]$ kfed read /dev/asm-diski aun=46 blkn=1|lesskfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 4 ; 0x002: KFBTYP_FILEDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 257 ; 0x004: blk=257kfbh.block.obj: 1 ; 0x008: file=1kfbh.check: 3782876348 ; 0x00c: 0xe17a1cbckfbh.fcn.base: 2055 ; 0x010: 0x00000807kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfffdb.node.incarn: 807460773 ; 0x000: A=1 NUMM=0x18106fd2kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffffkfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0kfffdb.hibytes: 0 ; 0x00c: 0x00000000kfffdb.lobytes: 828383232 ; 0x010: 0x31602000kfffdb.xtntcnt: 2373 ; 0x014: 0x00000945kfffdb.xtnteof: 2373 ; 0x018: 0x00000945kfffdb.blkSize: 8192 ; 0x01c: 0x00002000kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0kfffdb.fileType: 2 ; 0x021: 0x02kfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffffkfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffffkfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000kfffdb.xtntblk: 63 ; 0x03c: 0x003fkfffdb.break: 60 ; 0x03e: 0x003ckfffdb.priZn: 0 ; 0x040: KFDZN_COLDkfffdb.secZn: 0 ; 0x041: KFDZN_COLDkfffdb.ub2spare: 0 ; 0x042: 0x0000kfffdb.alias[0]: 160 ; 0x044: 0x000000a0kfffdb.alias[1]: 2 ; 0x048: 0x00000002kfffdb.strpwdth: 1 ; 0x04c: 0x01kfffdb.strpsz: 20 ; 0x04d: 0x14kfffdb.usmsz: 0 ; 0x04e: 0x0000kfffdb.crets.hi: 32983534 ; 0x050: HOUR=0xe DAYS=0xf MNTH=0x2 YEAR=0x7ddkfffdb.crets.lo: 2651955200 ; 0x054: USEC=0x0 MSEC=0x68 SECS=0x21 MINS=0x27kfffdb.modts.hi: 32983534 ; 0x058: HOUR=0xe DAYS=0xf MNTH=0x2 YEAR=0x7ddkfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0kfffdb.dasz[0]: 0 ; 0x060: 0x00kfffdb.dasz[1]: 0 ; 0x061: 0x00kfffdb.dasz[2]: 0 ; 0x062: 0x00kfffdb.dasz[3]: 0 ; 0x063: 0x00kfffdb.permissn: 0 ; 0x064: 0x00kfffdb.ub1spar1: 0 ; 0x065: 0x00kfffdb.ub2spar2: 0 ; 0x066: 0x0000kfffdb.user.entnum: 0 ; 0x068: 0x0000kfffdb.user.entinc: 0 ; 0x06a: 0x0000kfffdb.group.entnum: 0 ; 0x06c: 0x0000kfffdb.group.entinc: 0 ; 0x06e: 0x0000kfffdb.spare[0]: 0 ; 0x070: 0x00000000kfffdb.spare[1]: 0 ; 0x074: 0x00000000kfffdb.spare[2]: 0 ; 0x078: 0x00000000kfffdb.spare[3]: 0 ; 0x07c: 0x00000000kfffdb.spare[4]: 0 ; 0x080: 0x00000000kfffdb.spare[5]: 0 ; 0x084: 0x00000000kfffdb.spare[6]: 0 ; 0x088: 0x00000000kfffdb.spare[7]: 0 ; 0x08c: 0x00000000kfffdb.spare[8]: 0 ; 0x090: 0x00000000kfffdb.spare[9]: 0 ; 0x094: 0x00000000kfffdb.spare[10]: 0 ; 0x098: 0x00000000kfffdb.spare[11]: 0 ; 0x09c: 0x00000000kfffdb.usm: ; 0x0a0: length=0kfffde[0].xptr.au: 365 ; 0x4a0: 0x0000016dkfffde[0].xptr.disk: 3 ; 0x4a4: 0x0003kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0kfffde[0].xptr.chk: 69 ; 0x4a7: 0x45kfffde[1].xptr.au: 368 ; 0x4a8: 0x00000170kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0kfffde[1].xptr.chk: 90 ; 0x4af: 0x5akfffde[2].xptr.au: 368 ; 0x4b0: 0x00000170kfffde[2].xptr.disk: 2 ; 0x4b4: 0x0002kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0kfffde[2].xptr.chk: 89 ; 0x4b7: 0x59kfffde[3].xptr.au: 368 ; 0x4b8: 0x00000170kfffde[3].xptr.disk: 0 ; 0x4bc: 0x0000kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0kfffde[3].xptr.chk: 91 ; 0x4bf: 0x5bkfffde[4].xptr.au: 366 ; 0x4c0: 0x0000016ekfffde[4].xptr.disk: 3 ; 0x4c4: 0x0003kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0kfffde[4].xptr.chk: 70 ; 0x4c7: 0x46kfffde[5].xptr.au: 369 ; 0x4c8: 0x00000171kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0kfffde[0].xptr.au: 365 ; 0x4a0: 0x0000016dkfffde[0].xptr.disk: 3 ; 0x4a4: 0x0003kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0kfffde[0].xptr.chk: 69 ; 0x4a7: 0x45kfffde[1].xptr.au: 368 ; 0x4a8: 0x00000170kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001则该system01.dbf.257.807460773的前2个extent指向 disk number=3 的aun=365 和 disknum=1 的aun=368用X$KFFXP来验证一下select disk_kffxp, AU_kffxp, xnum_kffxpfrom x$kffxpwhere group_kffxp=3 -- group number and number_kffxp=257 -- file numberDISK_KFFXP AU_KFFXP XNUM_KFFXP---------- ---------- ---------- 3 365 0 1 368 0 .......................
Directly addressed extents 来看一个大于500MB 的ASM上的数据文件的情况,sysaux01.dbf.258.807460839的 file number=258 大小为780M
SQL> select bytes/1024/1024 ,file_number from v$asm_file;BYTES/1024/1024 FILE_NUMBER--------------- ----------- .001464844 253 426.257813 256 790.007813 257 780.007813 258 341.257813 259select disk_kffxp, AU_kffxp, xnum_kffxpfrom x$kffxpwhere group_kffxp=3and number_kffxp=258;DISK_KFFXP AU_KFFXP XNUM_KFFXP---------- ---------- ---------- 0 963 0 1 962 0 2 962 0 2 963 1 0 964 1 3 958 1 1 963 2 3 959 2 0 965 2............................................................................ 0 1549 780 1 1548 780 2 1547 780 0 978 2147483648 3 973 2147483648 1 977 21474836482346 rows selected.
共有2346个extent分配给该数据文件,来看一下该数据文件的directory entry
[grid@localhost ~]$ kfed read /dev/asm-diski aun=46 blkn=2|lesskfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 4 ; 0x002: KFBTYP_FILEDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 258 ; 0x004: blk=258kfbh.block.obj: 1 ; 0x008: file=1kfbh.check: 1890402582 ; 0x00c: 0x70ad4116kfbh.fcn.base: 2882 ; 0x010: 0x00000b42kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfffdb.node.incarn: 807460839 ; 0x000: A=1 NUMM=0x18106ff3kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffffkfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0kfffdb.hibytes: 0 ; 0x00c: 0x00000000kfffdb.lobytes: 817897472 ; 0x010: 0x30c02000kfffdb.xtntcnt: 2343 ; 0x014: 0x00000927kfffdb.xtnteof: 2343 ; 0x018: 0x00000927kfffdb.blkSize: 8192 ; 0x01c: 0x00002000kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0kfffdb.fileType: 2 ; 0x021: 0x02kfffdb.dXrs: 19 ; 0x022: SCHE=0x1 NUMB=0x3kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffffkfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffffkfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000kfffdb.xtntblk: 63 ; 0x03c: 0x003fkfffdb.break: 60 ; 0x03e: 0x003ckfffdb.priZn: 0 ; 0x040: KFDZN_COLDkfffdb.secZn: 0 ; 0x041: KFDZN_COLDkfffdb.ub2spare: 0 ; 0x042: 0x0000kfffdb.alias[0]: 161 ; 0x044: 0x000000a1kfffdb.alias[1]: 3 ; 0x048: 0x00000003kfffdb.strpwdth: 1 ; 0x04c: 0x01kfffdb.strpsz: 20 ; 0x04d: 0x14kfffdb.usmsz: 0 ; 0x04e: 0x0000kfffdb.crets.hi: 32983534 ; 0x050: HOUR=0xe DAYS=0xf MNTH=0x2 YEAR=0x7ddkfffdb.crets.lo: 2724658176 ; 0x054: USEC=0x0 MSEC=0x1bf SECS=0x26 MINS=0x28kfffdb.modts.hi: 32983534 ; 0x058: HOUR=0xe DAYS=0xf MNTH=0x2 YEAR=0x7ddkfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0kfffdb.dasz[0]: 0 ; 0x060: 0x00kfffdb.dasz[1]: 0 ; 0x061: 0x00kfffdb.dasz[2]: 0 ; 0x062: 0x00kfffdb.dasz[3]: 0 ; 0x063: 0x00kfffdb.permissn: 0 ; 0x064: 0x00kfffdb.ub1spar1: 0 ; 0x065: 0x00kfffdb.ub2spar2: 0 ; 0x066: 0x0000kfffdb.user.entnum: 0 ; 0x068: 0x0000kfffdb.user.entinc: 0 ; 0x06a: 0x0000kfffdb.group.entnum: 0 ; 0x06c: 0x0000kfffdb.group.entinc: 0 ; 0x06e: 0x0000kfffdb.spare[0]: 0 ; 0x070: 0x00000000kfffdb.spare[1]: 0 ; 0x074: 0x00000000kfffdb.spare[2]: 0 ; 0x078: 0x00000000kfffdb.spare[3]: 0 ; 0x07c: 0x00000000kfffdb.spare[4]: 0 ; 0x080: 0x00000000kfffdb.spare[5]: 0 ; 0x084: 0x00000000kfffdb.spare[6]: 0 ; 0x088: 0x00000000kfffdb.spare[7]: 0 ; 0x08c: 0x00000000kfffdb.spare[8]: 0 ; 0x090: 0x00000000kfffdb.spare[9]: 0 ; 0x094: 0x00000000kfffdb.spare[10]: 0 ; 0x098: 0x00000000kfffdb.spare[11]: 0 ; 0x09c: 0x00000000kfffdb.usm: ; 0x0a0: length=0kfffde[0].xptr.au: 963 ; 0x4a0: 0x000003c3kfffdb.xtntblk: 63 ; 0x03c: 0x003f //63 extents described in thiskfffdb.break: 60 ; 0x03e: 0x003c // file directory blockkfffdb.alias[0] ALIAS_INDEX
kfffdb.xtntblk=63 说明共有63个extent pointer指针,从kfffde[0].xptr.au到kfffde[59].xptr.au是60个直接盘区指针 direct extent pointer。
Indirectly addressed extents (kffixe structure) kfffde[60].xptr.au指向剩下的文件目录信息, 这样查看。 kffixe 即是KFBTYP_INDIRECT 间接地址盘区Indirectly addressed extents块,与kfffde结构类似
[grid@localhost ~]$ kfed read /dev/asm-diski aun=46 blkn=2|egrep "xptr.au|xptr.disk"kfffde[60].xptr.au: 978 ; 0x680: 0x000003d2kfffde[60].xptr.disk: 0 ; 0x684: 0x0000kfffde[61].xptr.au: 973 ; 0x688: 0x000003cdkfffde[61].xptr.disk: 3 ; 0x68c: 0x0003kfffde[62].xptr.au: 977 ; 0x690: 0x000003d1kfffde[62].xptr.disk: 1 ; 0x694: 0x0001 1* select path,disk_number from v$asm_disk where group_number=3SQL> /PATH DISK_NUMBER-------------------- -----------/dev/asm-diskj 3/dev/asm-diski 2/dev/asm-diskh 1/dev/asm-diskg 0[grid@localhost ~]$ kfed read /dev/asm-diskg aun=978 blkn=0|lesskfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 12 ; 0x002: KFBTYP_INDIRECTkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 2147483648 ; 0x004: blk=0 (indirect)kfbh.block.obj: 258 ; 0x008: file=258kfbh.check: 2166327859 ; 0x00c: 0x811f8a33kfbh.fcn.base: 2244 ; 0x010: 0x000008c4kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kffixb.dxsn: 20 ; 0x000: 0x00000014kffixb.xtntblk: 480 ; 0x004: 0x01e0kffixb.dXrs: 19 ; 0x006: SCHE=0x1 NUMB=0x3kffixb.ub1spare: 0 ; 0x007: 0x00kffixb.ub4spare: 0 ; 0x008: 0x00000000kffixe[0].xptr.au: 979 ; 0x00c: 0x000003d3kffixe[0].xptr.disk: 0 ; 0x010: 0x0000kffixe[0].xptr.flags: 0 ; 0x012: L=0 E=0 D=0 S=0kffixe[0].xptr.chk: 250 ; 0x013: 0xfakffixe[1].xptr.au: 977 ; 0x014: 0x000003d1kffixe[1].xptr.disk: 2 ; 0x018: 0x0002kffixe[1].xptr.flags: 0 ; 0x01a: L=0 E=0 D=0 S=0kffixe[1].xptr.chk: 250 ; 0x01b: 0xfakffixe[2].xptr.au: 974 ; 0x01c: 0x000003cekffixe[2].xptr.disk: 3 ; 0x020: 0x0003[grid@localhost ~]$ kfed read /dev/asm-diskj aun=973 blkn=0|lesskfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 12 ; 0x002: KFBTYP_INDIRECTkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 2147483648 ; 0x004: blk=0 (indirect)kfbh.block.obj: 258 ; 0x008: file=258kfbh.check: 2166327859 ; 0x00c: 0x811f8a33kfbh.fcn.base: 2244 ; 0x010: 0x000008c4kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kffixb.dxsn: 20 ; 0x000: 0x00000014kffixb.xtntblk: 480 ; 0x004: 0x01e0kffixb.dXrs: 19 ; 0x006: SCHE=0x1 NUMB=0x3kffixb.ub1spare: 0 ; 0x007: 0x00kffixb.ub4spare: 0 ; 0x008: 0x00000000kffixe[0].xptr.au: 979 ; 0x00c: 0x000003d3kffixe[0].xptr.disk: 0 ; 0x010: 0x0000kffixe[0].xptr.flags: 0 ; 0x012: L=0 E=0 D=0 S=0kffixe[0].xptr.chk: 250 ; 0x013: 0xfakffixe[1].xptr.au: 977 ; 0x014: 0x000003d1kffixe[1].xptr.disk: 2 ; 0x018: 0x0002kffixe[1].xptr.flags: 0 ; 0x01a: L=0 E=0 D=0 S=0kffixe[1].xptr.chk: 250 ; 0x01b: 0xfakffixe[2].xptr.au: 974 ; 0x01c: 0x000003cekffixe[2].xptr.disk: 3 ; 0x020: 0x0003kffixe[2].xptr.flags: 0 ; 0x022: L=0 E=0 D=0 S=0kffixe[2].xptr.chk: 228 ; 0x023: 0xe4kffixe[3].xptr.au: 978 ; 0x024: 0x000003d2kffixe[3].xptr.disk: 2 ; 0x028: 0x0002kffixe[3].xptr.flags: 0 ; 0x02a: L=0 E=0 D=0 S=0kffixe[3].xptr.chk: 249 ; 0x02b: 0xf9kffixe[4].xptr.au: 975 ; 0x02c: 0x000003cfkffixe[4].xptr.disk: 3 ; 0x030: 0x0003kfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 12 ; 0x002: KFBTYP_INDIRECTkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 2147483648 ; 0x004: blk=0 (indirect)kfbh.block.obj: 258 ; 0x008: file=258kfbh.check: 2166327859 ; 0x00c: 0x811f8a33kfbh.fcn.base: 2244 ; 0x010: 0x000008c4kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kffixb.dxsn: 20 ; 0x000: 0x00000014kffixb.xtntblk: 480 ; 0x004: 0x01e0kffixb.dXrs: 19 ; 0x006: SCHE=0x1 NUMB=0x3kffixb.ub1spare: 0 ; 0x007: 0x00kffixb.ub4spare: 0 ; 0x008: 0x00000000kffixe[0].xptr.au: 979 ; 0x00c: 0x000003d3kffixe[0].xptr.disk: 0 ; 0x010: 0x0000kffixe[0].xptr.flags: 0 ; 0x012: L=0 E=0 D=0 S=0kffixe[0].xptr.chk: 250 ; 0x013: 0xfakffixe[1].xptr.au: 977 ; 0x014: 0x000003d1kffixe[1].xptr.disk: 2 ; 0x018: 0x0002kffixe[1].xptr.flags: 0 ; 0x01a: L=0 E=0 D=0 S=0kffixe[1].xptr.chk: 250 ; 0x01b: 0xfakffixe[2].xptr.au: 974 ; 0x01c: 0x000003cekffixe[2].xptr.disk: 3 ; 0x020: 0x0003kffixe[2].xptr.flags: 0 ; 0x022: L=0 E=0 D=0 S=0kffixe[2].xptr.chk: 228 ; 0x023: 0xe4kffixe[3].xptr.au: 978 ; 0x024: 0x000003d2kffixe[3].xptr.disk: 2 ; 0x028: 0x0002kffixe[3].xptr.flags: 0 ; 0x02a: L=0 E=0 D=0 S=0kffixe[3].xptr.chk: 249 ; 0x02b: 0xf9kffixe[4].xptr.au: 975 ; 0x02c: 0x000003cfkffixe[4].xptr.disk: 3 ; 0x030: 0x0003
知识总结 - asm disk的前50个AU(50MB)是为asm metadata保留的
- ASM 的前255个file number是为metadata file保留的,文件号从1开始, file numner=1的1号文件为ASM的file directory
- 普通的ASM File的file number从256开始
- ASM disk的第二个AU即是file number=1的file directory (非必然),在1MB AU和4096 bytes block的情况下可以存放255个file directory information,其block type为KFBTYP_FILEDIR
- 普通ASM FILE的directory entry的位置,可以这样计算 File number=1的 第 (file number- 256)/256 +2 个extent,blkn=mod(file number-256),256) ,例如文件号 258 =》 第二个extent的blkn=2。
- KFBTYP_FILEDIR中从kfffde[0].xptr.au到kfffde[59].xptr.au是直接盘区指针 directly extent pointers, kfffde[60].xptr.au以上是KFBTYP_INDIRECT(kffixe)间接盘区指针Indirectly extents pointers。