Virtual Metadata
ASM虚拟元数据被存储在ASM文件中。元数据文件目录被ASM实例排他访问。目录的文件号从1开始。注册者会被保留给ASM文件,它可以让RDBMS实例来访问与ASM实例一样。注册号小于255。文件号被保留在将来使用。v$asm_file不会显示元数据目录或注册号。
像其它ASM文件一样,虚拟元数据文件概括磁盘组的冗余类型进行镜像。ASM不会对外部冗余磁盘组提供镜像。虚拟元数据在正常冗余与高级冗余磁盘组中是三重镜像。虚拟元数据包含以下结构:
.File Directory .Disk Directory .Active Change Directory(ACD) .Continuing Operations Directory(COD) .Template Directory .Alias Directory .Attribute Directory .Staleness Directory .Staleness Registry
ASM的1号文件--ASM文件目录,它用来跟踪磁盘组中的所有文件。当磁盘组是一个独立的存储单元时,每个磁盘组将会包含属于它自己的ASM文件目录。
如果一个文件被删除,对于新创建的文件ASM会使用它的文件号,那么文件号将是唯一的,有不同的incarnation号。incarnation号是当文件创建时由时间来推算出来的,它保证对于相同文件号来说incarnation号是唯一的。
ASM文件的块大小是独立于ASM元数据块大小。所有的ASM元数据目录的块大小为4K。RDBMS数据文件在创建表空间时指定的块大小可以是2K,4K,8K,16K或32K。RDBMS的redo log文件通常的块大小是512 byte。ASM跟踪逻辑文件大小,通过数据库,与磁盘组中所占用的物理空间,考虑文件的冗余可以很显然的看出。RDBMS在文件创建时也提供了文件类型。对于不是由RDBMS实例显式创建的文件(比如由XML DB ftp命令或ASMCMD cp命令所创建的文件),ASM为了在创建时判断文件类型会检查文件头。
文件创建时间有一个明显的语义。文件修改时间,然后不是每次更新时间文件都会写入。而是当文件被打开执地写操作时文件修改时间会被更新。这意味着即使文件没有被写入,文件的修改时间也可能发生改变,并且存储的修改时间可能比修改文件内容所处的时间早。为了减小在集群ASM实例中的buffer cache中的文件目录块的竞争,修改时间以小时为精度。因此,在RAC中多个实例以较短时间打开文件,那么只有第一个访问文件的实例需要更新文件修改时间。
文件的布局信息由一系列的区指针组成。区指针指定了磁盘号与区所在的AU号。文件目录条目包含了一个文件的前60个区指针,有时也叫direct extens。文件目录剩余的部分包含了指向indirect extents的指针。indirect extents是其它虚拟元数据区,包含ASM文件的区指针。每个indirect extent是一个AU。每个文件目录条目可以包含最多300个indirect exten。indirect指针的概念存在于大多数传统文件系统中,比如Unix的BSD文件系统。文件布局的解释也叫extent map,文件布局受条带与冗余的影响。
虽然这是一个内部(ASM元数据)文件,但是它像磁盘组中的任何其它ASM文件一样被管理。在ASM文件目录中有属于它自己的条目(指向了它自己),在normal与high冗余磁盘组中,它也会生成镜像副本并且随着新文件的产生,ASM文件目录的大小也会增长。
每个ASM文件目录条目包含了以下内容:
.文件大小
.文件块大小
.文件类型
.文件冗余级别
.文件带条配置
.前60个区指针(也叫Direct区指针)
.当文件超过60个区,就会有indirect区指针
.文件创建时间戳
.文件最后修改时间戳
.指向ASM Alias目录的文件名
每个新增加的ASM文件会分配到一个号码,这个号码是随着新增文件而顺序递增的。文件的号码与文件目录中的block号码也是完全对应的,也就是说,文件目录的1号block描述了他自己也就是1号文件的信息。2号block是描述2号文件的,300号block是描述300号文件的,4000号block是关于4000号文件的,以此类推。如下,是ASM的263号文件,kfbh.block.blk指出了文件目录里块的编号,此编号也是文件的编号。
[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=77 blkn=7 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 263 ; 0x004: blk=263 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 857258416 ; 0x00c: 0x3318b9b0 kfbh.fcn.base: 3715 ; 0x010: 0x00000e83 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 930413057 ; 0x000: A=1 NUMM=0x1bba7d00 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 5251072 ; 0x010: 0x00502000 kfffdb.xtntcnt: 12 ; 0x014: 0x0000000c kfffdb.xtnteof: 12 ; 0x018: 0x0000000c kfffdb.blkSize: 8192 ; 0x01c: 0x00002000 kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0 kfffdb.fileType: 2 ; 0x021: 0x02 kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2 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: 12 ; 0x03c: 0x000c 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]: 111 ; 0x044: 0x0000006f kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 1 ; 0x04c: 0x01 kfffdb.strpsz: 20 ; 0x04d: 0x14 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 33042832 ; 0x050: HOUR=0x10 DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 286709760 ; 0x054: USEC=0x0 MSEC=0x1b6 SECS=0x11 MINS=0x4 kfffdb.modts.hi: 33042897 ; 0x058: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 kfffdb.dasz[0]: 0 ; 0x060: 0x00
不存在编号为0的ASM文件,所以文件目录的0号block不描述任何文件的信息。ASM文件目录与ASM的AT表是两个相辅相成的数据结构。ALTER DISKGROUP CHECK命令可以检查两个数据结构是不是一致的。通过为ALTER DISKGROUP CHECK语句可以用来校验磁盘组元信息的内部一致性,可以指定在磁盘组、磁盘、文件、failgroup级别进行元信息一致性的校验,能够成功执行此命令的前提条件是磁盘组必须处于mount状态。默认情况下,check disk group 子句会校验所有的元信息目录,在校验过程中如果有错误信息,会记录在ASM的alert文件中,check语句一般会执行如下的操作:
1.检查磁盘的一致性
2.检查文件extent map和AT表之间的一致性
3.检查alias元信息目录和文件目录之间对应关系的正确性
4.检查alias目录树的正确性
5.检查ASM元信息目录是否有不可访问的块。
我们可以在语句中添加repair或norepair关键字来指定ASM是否尝试修复检查过程中发生的错误,默认为norepair。
V$ASM_FILE and V$ASM_ALIAS视图
SM文件目录中描述的大部分信息都可以通过V$ASM_FILE视图查询到。对于处于mount状态的磁盘组中的每个文件,该视图中会以一行来展示。然而,该视图中并不会显示ASM元信息文件的信息。V$ASM_FILE视图中没有描述文件名的列,所以为了得到一个有意义的输出,同时我们还需要联合V$ASM_ALIAS视图。例如:
SQL> select f.group_number, f.file_number, a.name, f.type from v$asm_file f, v$asm_alias a where f.group_number=a.group_number and f.group_number=3 and f.file_number=a.file_number order by 1, 2; GROUP_NUMBER FILE_NUMBER NAME TYPE ------------ ----------- ---------------------------------------- -------------------- 3 256 SPFILE.256.930411925 PARAMETERFILE 3 256 spfilejyrac.ora PARAMETERFILE 3 257 current.257.930412709 CONTROLFILE 3 258 SYSAUX.258.930413055 DATAFILE 3 259 SYSTEM.259.930413057 DATAFILE 3 260 EXAMPLE.260.930413057 DATAFILE 3 261 UNDOTBS2.261.930413057 DATAFILE 3 262 UNDOTBS1.262.930413057 DATAFILE 3 263 USERS.263.930413057 DATAFILE 3 264 group_1.264.930413221 ONLINELOG 3 265 group_2.265.930413225 ONLINELOG 3 266 group_3.266.930413227 ONLINELOG 3 267 group_4.267.930413231 ONLINELOG 3 268 TEMP.268.930413239 TEMPFILE 3 269 FILE_TRANSFER_0_0.269.930515105 DUMPSET 3 269 tts.dmp DUMPSET 3 270 test01.dbf DATAFILE 3 270 FILE_TRANSFER.270.930515465 DATAFILE 18 rows selected.
不同磁盘组中的文件可以有相同的文件编号。例如,在1号磁盘组中的归档重做日志的文件号为(261-266),而上面3号磁盘组中的文件号为(256-270),两个磁盘组存在重复的文件号。
SQL> select f.group_number, f.file_number, a.name, f.type from v$asm_file f, v$asm_alias a where f.group_number=a.group_number and f.group_number=1 and f.file_number=a.file_number order by 1, 2; GROUP_NUMBER FILE_NUMBER NAME TYPE ------------ ----------- ---------------------------------------- -------------------- 1 261 thread_2_seq_117.261.930410687 ARCHIVELOG 1 262 thread_2_seq_118.262.930410761 ARCHIVELOG 1 262 2_118_928610797.dbf ARCHIVELOG 1 263 1_56_928610797.dbf ARCHIVELOG 1 263 thread_1_seq_56.263.930410761 ARCHIVELOG 1 264 1_57_928610797.dbf ARCHIVELOG 1 264 thread_1_seq_57.264.930411019 ARCHIVELOG 1 265 thread_2_seq_1.265.930413237 ARCHIVELOG 1 265 2_1_930413221.dbf ARCHIVELOG 1 266 2_2_930413221.dbf ARCHIVELOG 1 266 thread_2_seq_2.266.930434449 ARCHIVELOG
ASM文件目录存储位置
我们可以在ASM实例中通过查询X$KFFXP视图来获取磁盘组DATADG中编号为1的文件所分配的AU。
SQL> select group_number,name from v$asm_diskgroup; GROUP_NUMBER NAME ------------ ---------------------------------------- 1 ARCHDG 2 CRSDG 3 DATADG 4 TESTDG SQL> select group_number,disk_number,name,state,path from v$asm_disk where group_number=3; GROUP_NUMBER DISK_NUMBER NAME STATE PATH ------------ ----------- ---------------------------------------- ---------- ------------------------------ 3 0 DATADG_0001 NORMAL /dev/raw/raw11 3 3 DATADG_0000 NORMAL /dev/raw/raw10 3 1 DATADG_0003 NORMAL /dev/raw/raw4 3 2 DATADG_0002 NORMAL /dev/raw/raw3 SQL> select xnum_kffxp "virtual extent",pxn_kffxp "physical extent",au_kffxp "allocation unit",disk_kffxp "disk" 2 from x$kffxp 3 where group_kffxp=3 and number_kffxp=1 order by 1, 2; virtual extent physical extent allocation unit disk -------------- --------------- --------------- ---------- 0 0 2 0 0 1 2 2 0 2 2 1 1 3 76 3 1 4 77 2 1 5 76 1 6 rows selected.
从以上输出结果可以看到:ASM文件目录有三份镜像(每个virtual extent都有3个physical extent);当前ASM文件目录包含两个virtual extent(0,1)。当AU大小为1MB且ASM元信息block大小为4KB时,一个AU可以容纳256个目录条目。文件编号1-255是为ASM元信息文件预留,所以0号extent只用来容纳元信息文件的条目,1号extent则容纳接下来的256个非元信息文件的信息,以此类推。
通过kfed 读取asm磁盘头的kfdhdb.f1b1locn部分,可以获得ASM一号文件所在的AU,例如下面的例子里显示了磁盘组DATADG中的一号文件在磁盘(/dev/raw/raw3)的2号AU处,磁盘(/dev/raw/ra10)中kfdhdb.f1b1locn=0代表这个磁盘并没有一号文件的拷贝。因为0号(虚拟)extent用来存储ASM元信息并且分别存储在disk:0(/dev/raw/raw11),1(/dev/raw/raw4),2(/dev/raw/raw3中的AU 2中,下面的输出信息与上面所查询的ASM文件目录分布完全一致。
SQL> select group_number,disk_number,name,state,path from v$asm_disk where group_number=3 order by disk_number asc; GROUP_NUMBER DISK_NUMBER NAME STATE PATH ------------ ----------- ------------------------------ ------------------------------ ------------------------------ 3 0 DATADG_0001 NORMAL /dev/raw/raw11 3 1 DATADG_0003 NORMAL /dev/raw/raw4 3 2 DATADG_0002 NORMAL /dev/raw/raw3 3 3 DATADG_0000 NORMAL /dev/raw/raw10 [grid@jyrac1 ~]$ kfed read /dev/raw/raw11 | grep kfdhdb.f1b1locn kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 [grid@jyrac1 ~]$ kfed read /dev/raw/raw4 | grep kfdhdb.f1b1locn kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 [grid@jyrac1 ~]$ kfed read /dev/raw/raw3 | grep kfdhdb.f1b1locn kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 [grid@jyrac1 ~]$ kfed read /dev/raw/raw10 | grep kfdhdb.f1b1locn kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000
1号文件总是开始在0号磁盘2号AU,记住这个位置:0号盘2号AU。这是ASM中定位文件的起点,它的作用,有点相当于磁盘上的引导区,在电脑开机后负责将OS启动起来。1号文件在最少情况下,至少有两个AU。上面我们提到过了,在1号文件中,每个文件占用一个元数据块,存放自身的空间分布信息。每个元数据块大小是4K,一个AU是1M,哪么,每个AU中,可以存储256个文件的空间分布信息。这其中,0号盘2号AU中,全是元文件的信息。再具体一点,0号盘2号AU,第一个元数据块被系统占用,从第二个块开始,到255为止,共255个元数据块,对应索引号1至255的文件。其实,也就是全部的元文件了。也就是说0号盘2号AU,保存了全部元文件的空间分布信息。1号文件的第二个AU,从第一个块开始,保存256号文件。第二个块对应257号文件,等等。每次从ASM中读数据时,Oracle都要先读到1号文件,从中找出要读的目标文件在磁盘上的分布位置,然后再去读取相应的文件的数据。
[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=1 | more 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: 2717147277 ; 0x00c: 0xa1f4608d kfbh.fcn.base: 569 ; 0x010: 0x00000239 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 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: 33042831 ; 0x050: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 2457402368 ; 0x054: USEC=0x0 MSEC=0x23f SECS=0x27 MINS=0x24 kfffdb.modts.hi: 33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 2457402368 ; 0x05c: USEC=0x0 MSEC=0x23f SECS=0x27 MINS=0x24 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: 2 ; 0x4a0: 0x00000002 kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0 kfffde[0].xptr.chk: 40 ; 0x4a7: 0x28 kfffde[1].xptr.au: 2 ; 0x4a8: 0x00000002 kfffde[1].xptr.disk: 2 ; 0x4ac: 0x0002 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0 kfffde[1].xptr.chk: 42 ; 0x4af: 0x2a kfffde[2].xptr.au: 2 ; 0x4b0: 0x00000002 kfffde[2].xptr.disk: 1 ; 0x4b4: 0x0001 kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0 kfffde[2].xptr.chk: 41 ; 0x4b7: 0x29 kfffde[3].xptr.au: 76 ; 0x4b8: 0x0000004c kfffde[3].xptr.disk: 3 ; 0x4bc: 0x0003 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0 kfffde[3].xptr.chk: 101 ; 0x4bf: 0x65 kfffde[4].xptr.au: 77 ; 0x4c0: 0x0000004d kfffde[4].xptr.disk: 2 ; 0x4c4: 0x0002 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0 kfffde[4].xptr.chk: 101 ; 0x4c7: 0x65 kfffde[5].xptr.au: 76 ; 0x4c8: 0x0000004c 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: 103 ; 0x4cf: 0x67 kfffde[6].xptr.au: 4294967295 ; 0x4d0: 0xffffffff kfffde[6].xptr.disk: 65535 ; 0x4d4: 0xffff kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 S=0 kfffde[6].xptr.chk: 42 ; 0x4d7: 0x2a
kfffde,是结构数组。由于我这里ASM文件目录有三份镜像,kfffde[0]的数据元素,
存放了1号文件第一个AU的位置。kfffde[1]存放了1号文件第二个AU位置,kfffde[2]存放了1号文件第三个AU位置等等,依次类推。我们来看一下上面的信息:
kfffde[0].xptr.au=2 --2号AU
kfffde[0].xptr.disk=0 --0号磁盘
上两个信息合起来,0号盘2号AU,这就是1号文件第一个AU的位置
kfffde[1].xptr.au=2 --2号AU
kfffde[1].xptr.disk=2 --2号磁盘
kfffde[2].xptr.au=2 --2号AU
kfffde[2].xptr.disk=1 --1号磁盘
上面的信息显示了1号文件的镜像副本存储在2号盘2号AU与1号盘的2号AU中。这与用查询x$kffxp视图所得到的元数据分布情况一致。
kfffde[3]到kfffde[5]存储的就是2号文件(磁盘目录)的分布情况
kfffde[3].xptr.au=76 --76号AU
kfffde[3].xptr.disk=3 --3号磁盘
上两个信息合起来,3号盘76号AU,这就是2号文件第一个AU的位置
kfffde[4].xptr.au=77 --77号AU
kfffde[4].xptr.disk=2 --2号磁盘
kfffde[5].xptr.au=76 --76号AU
kfffde[5].xptr.disk=1 --1号磁盘
上面的信息显示了2号文件(磁盘目录)的镜像副本存储在2号盘77号AU与1号盘的76号AU中。这与用查询x$kffxp视图所得到的非元信息文件的信息分布情况一致。
ASM file directory entries for database files
通过以下查询可以知道哪些文件是被我的ASM实例所管理的
SQL> select file_number "asm file number", name "file name" from v$asm_alias where group_number=3 order by 1; asm file number file name --------------- -------------------------------------------------------------------------------------------------------------------------------------------- 256 SPFILE.256.930411925 256 spfilejyrac.ora 257 current.257.930412709 258 SYSAUX.258.930413055 259 SYSTEM.259.930413057 260 EXAMPLE.260.930413057 261 UNDOTBS2.261.930413057 262 UNDOTBS1.262.930413057 263 USERS.263.930413057 264 group_1.264.930413221 265 group_2.265.930413225 266 group_3.266.930413227 267 group_4.267.930413231 268 TEMP.268.930413239 269 tts.dmp 270 test01.dbf ... 27 rows selected.
接下来看一下263号文件(USERS.263.930413057)对应的的文件目录条目。首先,通过查询X$KFFXP获得该文件的extent和AU分布:
SQL> select xnum_kffxp "virtual extent", 2 pxn_kffxp "physical extent", 3 au_kffxp "allocation unit", 4 disk_kffxp "disk" 5 from x$kffxp 6 where group_kffxp=3 7 and number_kffxp=263 8 and xnum_kffxp <> 2147483648 9 order by 1, 2; virtual extent physical extent allocation unit disk -------------- --------------- --------------- ---------- 0 0 1309 3 0 1 1309 2 1 2 1310 2 1 3 1310 3 2 4 1310 1 2 5 1314 0 3 6 1315 0 3 7 1311 2 4 8 1311 3 4 9 1311 1 5 10 1312 2 5 11 1316 0 12 rows selected.
我们看到实例为该文件分配了6个virtual extent,并且该文件是两倍冗余。接下来查询DATA磁盘组包含的磁盘的编号和路径。
SQL> select disk_number, path from v$asm_disk where group_number=3 order by 1; DISK_NUMBER PATH ----------- ------------------------------ 0 /dev/raw/raw11 1 /dev/raw/raw4 2 /dev/raw/raw3 3 /dev/raw/raw10
之前所查询到的ASM文件目录分布如下:
SQL> select xnum_kffxp "virtual extent",pxn_kffxp "physical extent",au_kffxp "allocation unit",disk_kffxp "disk" 2 from x$kffxp 3 where group_kffxp=3 and number_kffxp=1 order by 1, 2; virtual extent physical extent allocation unit disk -------------- --------------- --------------- ---------- 0 0 2 0 0 1 2 2 0 2 2 1 1 3 76 3 1 4 77 2 1 5 76 1 6 rows selected.
现在我们通过kfed工具来查看该文件的ASM文件目录条目,它会在文件目录的263号block,也就是文件目录中1号(虚拟)extent的7号block(263减去256得出7)。1号extent位于3号磁盘的第76个AU,并在1号磁盘的第76个AU和2号磁盘的第77个AU上分别存在一份冗余。。下面我们来看看3号磁盘(/dev/raw/raw10)的第76个AU,1号磁盘(1 /dev/raw/raw4)的第76个AU与2号磁盘(/dev/raw/raw3)的第77个AU是否存储相同信息。
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=76 blkn=7 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 263 ; 0x004: blk=263 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 857258416 ; 0x00c: 0x3318b9b0 kfbh.fcn.base: 3715 ; 0x010: 0x00000e83 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 930413057 ; 0x000: A=1 NUMM=0x1bba7d00 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 5251072 ; 0x010: 0x00502000 kfffdb.xtntcnt: 12 ; 0x014: 0x0000000c kfffdb.xtnteof: 12 ; 0x018: 0x0000000c kfffdb.blkSize: 8192 ; 0x01c: 0x00002000 kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0 kfffdb.fileType: 2 ; 0x021: 0x02 kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2 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: 12 ; 0x03c: 0x000c 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]: 111 ; 0x044: 0x0000006f kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 1 ; 0x04c: 0x01 kfffdb.strpsz: 20 ; 0x04d: 0x14 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 33042832 ; 0x050: HOUR=0x10 DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 286709760 ; 0x054: USEC=0x0 MSEC=0x1b6 SECS=0x11 MINS=0x4 kfffdb.modts.hi: 33042897 ; 0x058: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 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: 1309 ; 0x4a0: 0x0000051d kfffde[0].xptr.disk: 3 ; 0x4a4: 0x0003 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0 kfffde[0].xptr.chk: 49 ; 0x4a7: 0x31 kfffde[1].xptr.au: 1309 ; 0x4a8: 0x0000051d kfffde[1].xptr.disk: 2 ; 0x4ac: 0x0002 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0 kfffde[1].xptr.chk: 48 ; 0x4af: 0x30 kfffde[2].xptr.au: 1310 ; 0x4b0: 0x0000051e kfffde[2].xptr.disk: 2 ; 0x4b4: 0x0002 kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0 kfffde[2].xptr.chk: 51 ; 0x4b7: 0x33 kfffde[3].xptr.au: 1310 ; 0x4b8: 0x0000051e kfffde[3].xptr.disk: 3 ; 0x4bc: 0x0003 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0 kfffde[3].xptr.chk: 50 ; 0x4bf: 0x32 kfffde[4].xptr.au: 1310 ; 0x4c0: 0x0000051e kfffde[4].xptr.disk: 1 ; 0x4c4: 0x0001 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0 kfffde[4].xptr.chk: 48 ; 0x4c7: 0x30 kfffde[5].xptr.au: 1314 ; 0x4c8: 0x00000522 kfffde[5].xptr.disk: 0 ; 0x4cc: 0x0000 kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0 kfffde[5].xptr.chk: 13 ; 0x4cf: 0x0d kfffde[6].xptr.au: 1315 ; 0x4d0: 0x00000523 kfffde[6].xptr.disk: 0 ; 0x4d4: 0x0000 kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 S=0 kfffde[6].xptr.chk: 12 ; 0x4d7: 0x0c kfffde[7].xptr.au: 1311 ; 0x4d8: 0x0000051f kfffde[7].xptr.disk: 2 ; 0x4dc: 0x0002 kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 S=0 kfffde[7].xptr.chk: 50 ; 0x4df: 0x32 kfffde[8].xptr.au: 1311 ; 0x4e0: 0x0000051f kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003 kfffde[8].xptr.flags: 0 ; 0x4e6: L=0 E=0 D=0 S=0 kfffde[8].xptr.chk: 51 ; 0x4e7: 0x33 kfffde[9].xptr.au: 1311 ; 0x4e8: 0x0000051f kfffde[9].xptr.disk: 1 ; 0x4ec: 0x0001 kfffde[9].xptr.flags: 0 ; 0x4ee: L=0 E=0 D=0 S=0 kfffde[9].xptr.chk: 49 ; 0x4ef: 0x31 kfffde[10].xptr.au: 1312 ; 0x4f0: 0x00000520 kfffde[10].xptr.disk: 2 ; 0x4f4: 0x0002 kfffde[10].xptr.flags: 0 ; 0x4f6: L=0 E=0 D=0 S=0 kfffde[10].xptr.chk: 13 ; 0x4f7: 0x0d kfffde[11].xptr.au: 1316 ; 0x4f8: 0x00000524 kfffde[11].xptr.disk: 0 ; 0x4fc: 0x0000 kfffde[11].xptr.flags: 0 ; 0x4fe: L=0 E=0 D=0 S=0 kfffde[11].xptr.chk: 11 ; 0x4ff: 0x0b
[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=76 blkn=7 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 263 ; 0x004: blk=263 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 857258416 ; 0x00c: 0x3318b9b0 kfbh.fcn.base: 3715 ; 0x010: 0x00000e83 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 930413057 ; 0x000: A=1 NUMM=0x1bba7d00 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 5251072 ; 0x010: 0x00502000 kfffdb.xtntcnt: 12 ; 0x014: 0x0000000c kfffdb.xtnteof: 12 ; 0x018: 0x0000000c kfffdb.blkSize: 8192 ; 0x01c: 0x00002000 kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0 kfffdb.fileType: 2 ; 0x021: 0x02 kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2 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: 12 ; 0x03c: 0x000c 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]: 111 ; 0x044: 0x0000006f kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 1 ; 0x04c: 0x01 kfffdb.strpsz: 20 ; 0x04d: 0x14 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 33042832 ; 0x050: HOUR=0x10 DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 286709760 ; 0x054: USEC=0x0 MSEC=0x1b6 SECS=0x11 MINS=0x4 kfffdb.modts.hi: 33042897 ; 0x058: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 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: 1309 ; 0x4a0: 0x0000051d kfffde[0].xptr.disk: 3 ; 0x4a4: 0x0003 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0 kfffde[0].xptr.chk: 49 ; 0x4a7: 0x31 kfffde[1].xptr.au: 1309 ; 0x4a8: 0x0000051d kfffde[1].xptr.disk: 2 ; 0x4ac: 0x0002 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0 kfffde[1].xptr.chk: 48 ; 0x4af: 0x30 kfffde[2].xptr.au: 1310 ; 0x4b0: 0x0000051e kfffde[2].xptr.disk: 2 ; 0x4b4: 0x0002 kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0 kfffde[2].xptr.chk: 51 ; 0x4b7: 0x33 kfffde[3].xptr.au: 1310 ; 0x4b8: 0x0000051e kfffde[3].xptr.disk: 3 ; 0x4bc: 0x0003 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0 kfffde[3].xptr.chk: 50 ; 0x4bf: 0x32 kfffde[4].xptr.au: 1310 ; 0x4c0: 0x0000051e kfffde[4].xptr.disk: 1 ; 0x4c4: 0x0001 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0 kfffde[4].xptr.chk: 48 ; 0x4c7: 0x30 kfffde[5].xptr.au: 1314 ; 0x4c8: 0x00000522 kfffde[5].xptr.disk: 0 ; 0x4cc: 0x0000 kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0 kfffde[5].xptr.chk: 13 ; 0x4cf: 0x0d kfffde[6].xptr.au: 1315 ; 0x4d0: 0x00000523 kfffde[6].xptr.disk: 0 ; 0x4d4: 0x0000 kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 S=0 kfffde[6].xptr.chk: 12 ; 0x4d7: 0x0c kfffde[7].xptr.au: 1311 ; 0x4d8: 0x0000051f kfffde[7].xptr.disk: 2 ; 0x4dc: 0x0002 kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 S=0 kfffde[7].xptr.chk: 50 ; 0x4df: 0x32 kfffde[8].xptr.au: 1311 ; 0x4e0: 0x0000051f kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003 kfffde[8].xptr.flags: 0 ; 0x4e6: L=0 E=0 D=0 S=0 kfffde[8].xptr.chk: 51 ; 0x4e7: 0x33 kfffde[9].xptr.au: 1311 ; 0x4e8: 0x0000051f kfffde[9].xptr.disk: 1 ; 0x4ec: 0x0001 kfffde[9].xptr.flags: 0 ; 0x4ee: L=0 E=0 D=0 S=0 kfffde[9].xptr.chk: 49 ; 0x4ef: 0x31 kfffde[10].xptr.au: 1312 ; 0x4f0: 0x00000520 kfffde[10].xptr.disk: 2 ; 0x4f4: 0x0002 kfffde[10].xptr.flags: 0 ; 0x4f6: L=0 E=0 D=0 S=0 kfffde[10].xptr.chk: 13 ; 0x4f7: 0x0d kfffde[11].xptr.au: 1316 ; 0x4f8: 0x00000524 kfffde[11].xptr.disk: 0 ; 0x4fc: 0x0000 kfffde[11].xptr.flags: 0 ; 0x4fe: L=0 E=0 D=0 S=0 kfffde[11].xptr.chk: 11 ; 0x4ff: 0x0b
[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=77 blkn=7 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 263 ; 0x004: blk=263 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 857258416 ; 0x00c: 0x3318b9b0 kfbh.fcn.base: 3715 ; 0x010: 0x00000e83 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 930413057 ; 0x000: A=1 NUMM=0x1bba7d00 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 5251072 ; 0x010: 0x00502000 kfffdb.xtntcnt: 12 ; 0x014: 0x0000000c kfffdb.xtnteof: 12 ; 0x018: 0x0000000c kfffdb.blkSize: 8192 ; 0x01c: 0x00002000 kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0 kfffdb.fileType: 2 ; 0x021: 0x02 kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2 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: 12 ; 0x03c: 0x000c 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]: 111 ; 0x044: 0x0000006f kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 1 ; 0x04c: 0x01 kfffdb.strpsz: 20 ; 0x04d: 0x14 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 33042832 ; 0x050: HOUR=0x10 DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 286709760 ; 0x054: USEC=0x0 MSEC=0x1b6 SECS=0x11 MINS=0x4 kfffdb.modts.hi: 33042897 ; 0x058: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 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: 1309 ; 0x4a0: 0x0000051d kfffde[0].xptr.disk: 3 ; 0x4a4: 0x0003 kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 S=0 kfffde[0].xptr.chk: 49 ; 0x4a7: 0x31 kfffde[1].xptr.au: 1309 ; 0x4a8: 0x0000051d kfffde[1].xptr.disk: 2 ; 0x4ac: 0x0002 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0 kfffde[1].xptr.chk: 48 ; 0x4af: 0x30 kfffde[2].xptr.au: 1310 ; 0x4b0: 0x0000051e kfffde[2].xptr.disk: 2 ; 0x4b4: 0x0002 kfffde[2].xptr.flags: 0 ; 0x4b6: L=0 E=0 D=0 S=0 kfffde[2].xptr.chk: 51 ; 0x4b7: 0x33 kfffde[3].xptr.au: 1310 ; 0x4b8: 0x0000051e kfffde[3].xptr.disk: 3 ; 0x4bc: 0x0003 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0 kfffde[3].xptr.chk: 50 ; 0x4bf: 0x32 kfffde[4].xptr.au: 1310 ; 0x4c0: 0x0000051e kfffde[4].xptr.disk: 1 ; 0x4c4: 0x0001 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0 kfffde[4].xptr.chk: 48 ; 0x4c7: 0x30 kfffde[5].xptr.au: 1314 ; 0x4c8: 0x00000522 kfffde[5].xptr.disk: 0 ; 0x4cc: 0x0000 kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0 kfffde[5].xptr.chk: 13 ; 0x4cf: 0x0d kfffde[6].xptr.au: 1315 ; 0x4d0: 0x00000523 kfffde[6].xptr.disk: 0 ; 0x4d4: 0x0000 kfffde[6].xptr.flags: 0 ; 0x4d6: L=0 E=0 D=0 S=0 kfffde[6].xptr.chk: 12 ; 0x4d7: 0x0c kfffde[7].xptr.au: 1311 ; 0x4d8: 0x0000051f kfffde[7].xptr.disk: 2 ; 0x4dc: 0x0002 kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 S=0 kfffde[7].xptr.chk: 50 ; 0x4df: 0x32 kfffde[8].xptr.au: 1311 ; 0x4e0: 0x0000051f kfffde[8].xptr.disk: 3 ; 0x4e4: 0x0003 kfffde[8].xptr.flags: 0 ; 0x4e6: L=0 E=0 D=0 S=0 kfffde[8].xptr.chk: 51 ; 0x4e7: 0x33 kfffde[9].xptr.au: 1311 ; 0x4e8: 0x0000051f kfffde[9].xptr.disk: 1 ; 0x4ec: 0x0001 kfffde[9].xptr.flags: 0 ; 0x4ee: L=0 E=0 D=0 S=0 kfffde[9].xptr.chk: 49 ; 0x4ef: 0x31 kfffde[10].xptr.au: 1312 ; 0x4f0: 0x00000520 kfffde[10].xptr.disk: 2 ; 0x4f4: 0x0002 kfffde[10].xptr.flags: 0 ; 0x4f6: L=0 E=0 D=0 S=0 kfffde[10].xptr.chk: 13 ; 0x4f7: 0x0d kfffde[11].xptr.au: 1316 ; 0x4f8: 0x00000524 kfffde[11].xptr.disk: 0 ; 0x4fc: 0x0000 kfffde[11].xptr.flags: 0 ; 0x4fe: L=0 E=0 D=0 S=0 kfffde[11].xptr.chk: 11 ; 0x4ff: 0x0b
从上面的信息可以看到3号磁盘(/dev/raw/raw10)的第76个AU,1号磁盘(1 /dev/raw/raw4)的第76个AU与2号磁盘(/dev/raw/raw3)的第77个AU是否存储相同信息。从上面数据可以看出,file directory元数据结构分为3个部分:
1.第一部分kfbh字段
确认这是一个ASM文件目录的block(kfbh.type=KFBTYP_FILEDIR),而且是描述263号文件的(kfbh.block.blk=263)。
2.第二部分kfffdb字段则包含:
File incarnation number(kfffdb.node.incarn=930413057)文件的incarnation号,属于文件名的一部分(263号文件(USERS.263.930413057))
File size in bytes (kfffdb.lobytes=5251072) 文件的大小
Physical extent count (kfffdb.xtntcnt=12) 该文件分配的物理extent的数量
File block size in bytes (kfffdb.blkSize=8192) 文件的块大小
File type (kfffdb.fileType=2), i.e. the database data file 文件的类型,这里为数据文件
3.第三部分kfffde为物理extent分布,这部分输出与从X$KFFXP中查询到的结果一致
例如,物理extent 0在磁盘3(kfffde[0].xptr.disk=3)的AU 1309上(kfffde[0].xptr.au:=1309),物理extent 1在磁盘2(kfffde[0].xptr.disk=2)的AU 1309上(kfffde[0].xptr.au:=1309),
物理extent 2在磁盘2(kfffde[0].xptr.disk=2)的AU 1309上(kfffde[0].xptr.au:=1310),以此类推。
File directory entries for control files
查询数据库的控制文件
SQL> select name "file",block_size "block size",block_size*(file_size_blks+1) "file size" from v$controlfile; file block size file size -------------------------------------------------- ---------- ---------- +DATADG/jyrac/controlfile/current.257.930412709 16384 18595840
接下来看一下257号文件(current.257.930412709)对应的的文件目录条目。首先,通过查询X$KFFXP获得该文件的extent和AU分布:
SQL> select xnum_kffxp "virtual extent", 2 pxn_kffxp "physical extent", 3 au_kffxp "allocation unit", 4 disk_kffxp "disk" 5 from x$kffxp 6 where group_kffxp=3 7 and number_kffxp=257 8 and xnum_kffxp <> 2147483648 9 order by 1, 2; virtual extent physical extent allocation unit disk -------------- --------------- --------------- ---------- 0 0 78 1 0 1 78 2 0 2 77 3 1 3 78 3 1 4 79 1 1 5 77 0 2 6 79 2 2 7 79 3 2 8 80 1 3 9 78 0 3 10 80 2 3 11 81 1 4 12 82 1 4 13 79 0 4 14 81 2 5 15 80 3 5 16 82 2 5 17 83 1 6 18 83 2 6 19 80 0 6 20 81 3 7 21 81 0 7 22 82 3 7 23 84 2 8 24 84 1 8 25 83 3 8 26 82 0 9 27 84 3 9 28 83 0 9 29 85 2 10 30 86 2 10 31 85 1 10 32 84 0 11 33 85 0 11 34 86 1 11 35 85 3 12 36 87 1 12 37 87 2 12 38 86 3 13 39 87 3 13 40 88 1 13 41 86 0 14 42 88 2 14 43 88 3 14 44 89 1 15 45 87 0 15 46 89 2 15 47 90 1 16 48 91 1 16 49 88 0 16 50 90 2 17 51 89 3 17 52 91 2 17 53 92 1 18 54 92 2 18 55 89 0 18 56 90 3 19 57 90 0 19 58 91 3 19 59 93 2 20 60 94 1 20 61 92 3 20 62 92 0 21 63 93 3 21 64 93 0 21 65 95 2 22 66 96 2 22 67 95 1 22 68 94 0 23 69 95 0 23 70 96 1 23 71 94 3 72 rows selected.
我们看到实例为该文件分配了24个virtual extent,并且该文件是三倍冗余。接下来查询DATADG磁盘组包含的磁盘的编号和路径。
SQL> select disk_number, path from v$asm_disk where group_number=3 order by 1; DISK_NUMBER PATH ----------- ------------------------------ 0 /dev/raw/raw11 1 /dev/raw/raw4 2 /dev/raw/raw3 3 /dev/raw/raw10
之前所查询到的ASM文件目录分布如下:
SQL> select xnum_kffxp "virtual extent",pxn_kffxp "physical extent",au_kffxp "allocation unit",disk_kffxp "disk" 2 from x$kffxp 3 where group_kffxp=3 and number_kffxp=1 order by 1, 2; virtual extent physical extent allocation unit disk -------------- --------------- --------------- ---------- 0 0 2 0 0 1 2 2 0 2 2 1 1 3 76 3 1 4 77 2 1 5 76 1 6 rows selected.
现在我们通过kfed工具来查看该文件的ASM文件目录条目,它会在文件目录的257号block,也就是文件目录中1号(虚拟)extent的1号block(257减去256得出1)。1号extent位于3号磁盘的第76个AU,并在1号磁盘的第76个AU和2号磁盘的第77个AU上分别存在一份冗余。下面我们来看看3号磁盘(/dev/raw/raw10)的第76个AU
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=76 blkn=1 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 257 ; 0x004: blk=257 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 1835729298 ; 0x00c: 0x6d6b0192 kfbh.fcn.base: 3723 ; 0x010: 0x00000e8b kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 930412709 ; 0x000: A=1 NUMM=0x1bba7c52 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 18595840 ; 0x010: 0x011bc000 kfffdb.xtntcnt: 72 ; 0x014: 0x00000048 kfffdb.xtnteof: 72 ; 0x018: 0x00000048 kfffdb.blkSize: 16384 ; 0x01c: 0x00004000 kfffdb.flags: 19 ; 0x020: O=1 S=1 S=0 D=0 C=1 I=0 R=0 A=0 kfffdb.fileType: 1 ; 0x021: 0x01 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: 63 ; 0x03c: 0x003f 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]: 159 ; 0x044: 0x0000009f kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 8 ; 0x04c: 0x08 kfffdb.strpsz: 17 ; 0x04d: 0x11 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 33042831 ; 0x050: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 3922781184 ; 0x054: USEC=0x0 MSEC=0x39 SECS=0x1d MINS=0x3a kfffdb.modts.hi: 33042902 ; 0x058: HOUR=0x16 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 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: 78 ; 0x4a0: 0x0000004e 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: 101 ; 0x4a7: 0x65 kfffde[1].xptr.au: 78 ; 0x4a8: 0x0000004e kfffde[1].xptr.disk: 2 ; 0x4ac: 0x0002 kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 S=0 kfffde[1].xptr.chk: 102 ; 0x4af: 0x66 kfffde[2].xptr.au: 77 ; 0x4b0: 0x0000004d 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: 100 ; 0x4b7: 0x64 kfffde[3].xptr.au: 78 ; 0x4b8: 0x0000004e kfffde[3].xptr.disk: 3 ; 0x4bc: 0x0003 kfffde[3].xptr.flags: 0 ; 0x4be: L=0 E=0 D=0 S=0 kfffde[3].xptr.chk: 103 ; 0x4bf: 0x67 kfffde[4].xptr.au: 79 ; 0x4c0: 0x0000004f kfffde[4].xptr.disk: 1 ; 0x4c4: 0x0001 kfffde[4].xptr.flags: 0 ; 0x4c6: L=0 E=0 D=0 S=0 kfffde[4].xptr.chk: 100 ; 0x4c7: 0x64 kfffde[5].xptr.au: 77 ; 0x4c8: 0x0000004d kfffde[5].xptr.disk: 0 ; 0x4cc: 0x0000 kfffde[5].xptr.flags: 0 ; 0x4ce: L=0 E=0 D=0 S=0 kfffde[5].xptr.chk: 103 ; 0x4cf: 0x67 kfffde[6].xptr.au: 79 ; 0x4d0: 0x0000004f 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: 103 ; 0x4d7: 0x67 kfffde[7].xptr.au: 79 ; 0x4d8: 0x0000004f kfffde[7].xptr.disk: 3 ; 0x4dc: 0x0003 kfffde[7].xptr.flags: 0 ; 0x4de: L=0 E=0 D=0 S=0 kfffde[7].xptr.chk: 102 ; 0x4df: 0x66 kfffde[8].xptr.au: 80 ; 0x4e0: 0x00000050 kfffde[8].xptr.disk: 1 ; 0x4e4: 0x0001 kfffde[8].xptr.flags: 0 ; 0x4e6: L=0 E=0 D=0 S=0 kfffde[8].xptr.chk: 123 ; 0x4e7: 0x7b kfffde[9].xptr.au: 78 ; 0x4e8: 0x0000004e kfffde[9].xptr.disk: 0 ; 0x4ec: 0x0000 kfffde[9].xptr.flags: 0 ; 0x4ee: L=0 E=0 D=0 S=0 kfffde[9].xptr.chk: 100 ; 0x4ef: 0x64 kfffde[10].xptr.au: 80 ; 0x4f0: 0x00000050 kfffde[10].xptr.disk: 2 ; 0x4f4: 0x0002 kfffde[10].xptr.flags: 0 ; 0x4f6: L=0 E=0 D=0 S=0 kfffde[10].xptr.chk: 120 ; 0x4f7: 0x78 kfffde[11].xptr.au: 81 ; 0x4f8: 0x00000051 kfffde[11].xptr.disk: 1 ; 0x4fc: 0x0001 kfffde[11].xptr.flags: 0 ; 0x4fe: L=0 E=0 D=0 S=0 kfffde[11].xptr.chk: 122 ; 0x4ff: 0x7a kfffde[12].xptr.au: 82 ; 0x500: 0x00000052 kfffde[12].xptr.disk: 1 ; 0x504: 0x0001 kfffde[12].xptr.flags: 0 ; 0x506: L=0 E=0 D=0 S=0 kfffde[12].xptr.chk: 121 ; 0x507: 0x79 kfffde[13].xptr.au: 79 ; 0x508: 0x0000004f kfffde[13].xptr.disk: 0 ; 0x50c: 0x0000 kfffde[13].xptr.flags: 0 ; 0x50e: L=0 E=0 D=0 S=0 kfffde[13].xptr.chk: 101 ; 0x50f: 0x65 kfffde[14].xptr.au: 81 ; 0x510: 0x00000051 kfffde[14].xptr.disk: 2 ; 0x514: 0x0002 kfffde[14].xptr.flags: 0 ; 0x516: L=0 E=0 D=0 S=0 kfffde[14].xptr.chk: 121 ; 0x517: 0x79 kfffde[15].xptr.au: 80 ; 0x518: 0x00000050 kfffde[15].xptr.disk: 3 ; 0x51c: 0x0003 kfffde[15].xptr.flags: 0 ; 0x51e: L=0 E=0 D=0 S=0 kfffde[15].xptr.chk: 121 ; 0x51f: 0x79 kfffde[16].xptr.au: 82 ; 0x520: 0x00000052 kfffde[16].xptr.disk: 2 ; 0x524: 0x0002 kfffde[16].xptr.flags: 0 ; 0x526: L=0 E=0 D=0 S=0 kfffde[16].xptr.chk: 122 ; 0x527: 0x7a kfffde[17].xptr.au: 83 ; 0x528: 0x00000053 kfffde[17].xptr.disk: 1 ; 0x52c: 0x0001 kfffde[17].xptr.flags: 0 ; 0x52e: L=0 E=0 D=0 S=0 kfffde[17].xptr.chk: 120 ; 0x52f: 0x78 kfffde[18].xptr.au: 83 ; 0x530: 0x00000053 kfffde[18].xptr.disk: 2 ; 0x534: 0x0002 kfffde[18].xptr.flags: 0 ; 0x536: L=0 E=0 D=0 S=0 kfffde[18].xptr.chk: 123 ; 0x537: 0x7b kfffde[19].xptr.au: 80 ; 0x538: 0x00000050 kfffde[19].xptr.disk: 0 ; 0x53c: 0x0000 kfffde[19].xptr.flags: 0 ; 0x53e: L=0 E=0 D=0 S=0 kfffde[19].xptr.chk: 122 ; 0x53f: 0x7a kfffde[20].xptr.au: 81 ; 0x540: 0x00000051 kfffde[20].xptr.disk: 3 ; 0x544: 0x0003 kfffde[20].xptr.flags: 0 ; 0x546: L=0 E=0 D=0 S=0 kfffde[20].xptr.chk: 120 ; 0x547: 0x78 kfffde[21].xptr.au: 81 ; 0x548: 0x00000051 kfffde[21].xptr.disk: 0 ; 0x54c: 0x0000 kfffde[21].xptr.flags: 0 ; 0x54e: L=0 E=0 D=0 S=0 kfffde[21].xptr.chk: 123 ; 0x54f: 0x7b kfffde[22].xptr.au: 82 ; 0x550: 0x00000052 kfffde[22].xptr.disk: 3 ; 0x554: 0x0003 kfffde[22].xptr.flags: 0 ; 0x556: L=0 E=0 D=0 S=0 kfffde[22].xptr.chk: 123 ; 0x557: 0x7b kfffde[23].xptr.au: 84 ; 0x558: 0x00000054 kfffde[23].xptr.disk: 2 ; 0x55c: 0x0002 kfffde[23].xptr.flags: 0 ; 0x55e: L=0 E=0 D=0 S=0 kfffde[23].xptr.chk: 124 ; 0x55f: 0x7c kfffde[24].xptr.au: 84 ; 0x560: 0x00000054 kfffde[24].xptr.disk: 1 ; 0x564: 0x0001 kfffde[24].xptr.flags: 0 ; 0x566: L=0 E=0 D=0 S=0 kfffde[24].xptr.chk: 127 ; 0x567: 0x7f kfffde[25].xptr.au: 83 ; 0x568: 0x00000053 kfffde[25].xptr.disk: 3 ; 0x56c: 0x0003 kfffde[25].xptr.flags: 0 ; 0x56e: L=0 E=0 D=0 S=0 kfffde[25].xptr.chk: 122 ; 0x56f: 0x7a kfffde[26].xptr.au: 82 ; 0x570: 0x00000052 kfffde[26].xptr.disk: 0 ; 0x574: 0x0000 kfffde[26].xptr.flags: 0 ; 0x576: L=0 E=0 D=0 S=0 kfffde[26].xptr.chk: 120 ; 0x577: 0x78 kfffde[27].xptr.au: 84 ; 0x578: 0x00000054 kfffde[27].xptr.disk: 3 ; 0x57c: 0x0003 kfffde[27].xptr.flags: 0 ; 0x57e: L=0 E=0 D=0 S=0 kfffde[27].xptr.chk: 125 ; 0x57f: 0x7d kfffde[28].xptr.au: 83 ; 0x580: 0x00000053 kfffde[28].xptr.disk: 0 ; 0x584: 0x0000 kfffde[28].xptr.flags: 0 ; 0x586: L=0 E=0 D=0 S=0 kfffde[28].xptr.chk: 121 ; 0x587: 0x79 kfffde[29].xptr.au: 85 ; 0x588: 0x00000055 kfffde[29].xptr.disk: 2 ; 0x58c: 0x0002 kfffde[29].xptr.flags: 0 ; 0x58e: L=0 E=0 D=0 S=0 kfffde[29].xptr.chk: 125 ; 0x58f: 0x7d kfffde[30].xptr.au: 86 ; 0x590: 0x00000056 kfffde[30].xptr.disk: 2 ; 0x594: 0x0002 kfffde[30].xptr.flags: 0 ; 0x596: L=0 E=0 D=0 S=0 kfffde[30].xptr.chk: 126 ; 0x597: 0x7e kfffde[31].xptr.au: 85 ; 0x598: 0x00000055 kfffde[31].xptr.disk: 1 ; 0x59c: 0x0001 kfffde[31].xptr.flags: 0 ; 0x59e: L=0 E=0 D=0 S=0 kfffde[31].xptr.chk: 126 ; 0x59f: 0x7e kfffde[32].xptr.au: 84 ; 0x5a0: 0x00000054 kfffde[32].xptr.disk: 0 ; 0x5a4: 0x0000 kfffde[32].xptr.flags: 0 ; 0x5a6: L=0 E=0 D=0 S=0 kfffde[32].xptr.chk: 126 ; 0x5a7: 0x7e kfffde[33].xptr.au: 85 ; 0x5a8: 0x00000055 kfffde[33].xptr.disk: 0 ; 0x5ac: 0x0000 kfffde[33].xptr.flags: 0 ; 0x5ae: L=0 E=0 D=0 S=0 kfffde[33].xptr.chk: 127 ; 0x5af: 0x7f kfffde[34].xptr.au: 86 ; 0x5b0: 0x00000056 kfffde[34].xptr.disk: 1 ; 0x5b4: 0x0001 kfffde[34].xptr.flags: 0 ; 0x5b6: L=0 E=0 D=0 S=0 kfffde[34].xptr.chk: 125 ; 0x5b7: 0x7d kfffde[35].xptr.au: 85 ; 0x5b8: 0x00000055 kfffde[35].xptr.disk: 3 ; 0x5bc: 0x0003 kfffde[35].xptr.flags: 0 ; 0x5be: L=0 E=0 D=0 S=0 kfffde[35].xptr.chk: 124 ; 0x5bf: 0x7c kfffde[36].xptr.au: 87 ; 0x5c0: 0x00000057 kfffde[36].xptr.disk: 1 ; 0x5c4: 0x0001 kfffde[36].xptr.flags: 0 ; 0x5c6: L=0 E=0 D=0 S=0 kfffde[36].xptr.chk: 124 ; 0x5c7: 0x7c kfffde[37].xptr.au: 87 ; 0x5c8: 0x00000057 kfffde[37].xptr.disk: 2 ; 0x5cc: 0x0002 kfffde[37].xptr.flags: 0 ; 0x5ce: L=0 E=0 D=0 S=0 kfffde[37].xptr.chk: 127 ; 0x5cf: 0x7f kfffde[38].xptr.au: 86 ; 0x5d0: 0x00000056 kfffde[38].xptr.disk: 3 ; 0x5d4: 0x0003 kfffde[38].xptr.flags: 0 ; 0x5d6: L=0 E=0 D=0 S=0 kfffde[38].xptr.chk: 127 ; 0x5d7: 0x7f kfffde[39].xptr.au: 87 ; 0x5d8: 0x00000057 kfffde[39].xptr.disk: 3 ; 0x5dc: 0x0003 kfffde[39].xptr.flags: 0 ; 0x5de: L=0 E=0 D=0 S=0 kfffde[39].xptr.chk: 126 ; 0x5df: 0x7e kfffde[40].xptr.au: 88 ; 0x5e0: 0x00000058 kfffde[40].xptr.disk: 1 ; 0x5e4: 0x0001 kfffde[40].xptr.flags: 0 ; 0x5e6: L=0 E=0 D=0 S=0 kfffde[40].xptr.chk: 115 ; 0x5e7: 0x73 kfffde[41].xptr.au: 86 ; 0x5e8: 0x00000056 kfffde[41].xptr.disk: 0 ; 0x5ec: 0x0000 kfffde[41].xptr.flags: 0 ; 0x5ee: L=0 E=0 D=0 S=0 kfffde[41].xptr.chk: 124 ; 0x5ef: 0x7c kfffde[42].xptr.au: 88 ; 0x5f0: 0x00000058 kfffde[42].xptr.disk: 2 ; 0x5f4: 0x0002 kfffde[42].xptr.flags: 0 ; 0x5f6: L=0 E=0 D=0 S=0 kfffde[42].xptr.chk: 112 ; 0x5f7: 0x70 kfffde[43].xptr.au: 88 ; 0x5f8: 0x00000058 kfffde[43].xptr.disk: 3 ; 0x5fc: 0x0003 kfffde[43].xptr.flags: 0 ; 0x5fe: L=0 E=0 D=0 S=0 kfffde[43].xptr.chk: 113 ; 0x5ff: 0x71 kfffde[44].xptr.au: 89 ; 0x600: 0x00000059 kfffde[44].xptr.disk: 1 ; 0x604: 0x0001 kfffde[44].xptr.flags: 0 ; 0x606: L=0 E=0 D=0 S=0 kfffde[44].xptr.chk: 114 ; 0x607: 0x72 kfffde[45].xptr.au: 87 ; 0x608: 0x00000057 kfffde[45].xptr.disk: 0 ; 0x60c: 0x0000 kfffde[45].xptr.flags: 0 ; 0x60e: L=0 E=0 D=0 S=0 kfffde[45].xptr.chk: 125 ; 0x60f: 0x7d kfffde[46].xptr.au: 89 ; 0x610: 0x00000059 kfffde[46].xptr.disk: 2 ; 0x614: 0x0002 kfffde[46].xptr.flags: 0 ; 0x616: L=0 E=0 D=0 S=0 kfffde[46].xptr.chk: 113 ; 0x617: 0x71 kfffde[47].xptr.au: 90 ; 0x618: 0x0000005a kfffde[47].xptr.disk: 1 ; 0x61c: 0x0001 kfffde[47].xptr.flags: 0 ; 0x61e: L=0 E=0 D=0 S=0 kfffde[47].xptr.chk: 113 ; 0x61f: 0x71 kfffde[48].xptr.au: 91 ; 0x620: 0x0000005b kfffde[48].xptr.disk: 1 ; 0x624: 0x0001 kfffde[48].xptr.flags: 0 ; 0x626: L=0 E=0 D=0 S=0 kfffde[48].xptr.chk: 112 ; 0x627: 0x70 kfffde[49].xptr.au: 88 ; 0x628: 0x00000058 kfffde[49].xptr.disk: 0 ; 0x62c: 0x0000 kfffde[49].xptr.flags: 0 ; 0x62e: L=0 E=0 D=0 S=0 kfffde[49].xptr.chk: 114 ; 0x62f: 0x72 kfffde[50].xptr.au: 90 ; 0x630: 0x0000005a kfffde[50].xptr.disk: 2 ; 0x634: 0x0002 kfffde[50].xptr.flags: 0 ; 0x636: L=0 E=0 D=0 S=0 kfffde[50].xptr.chk: 114 ; 0x637: 0x72 kfffde[51].xptr.au: 89 ; 0x638: 0x00000059 kfffde[51].xptr.disk: 3 ; 0x63c: 0x0003 kfffde[51].xptr.flags: 0 ; 0x63e: L=0 E=0 D=0 S=0 kfffde[51].xptr.chk: 112 ; 0x63f: 0x70 kfffde[52].xptr.au: 91 ; 0x640: 0x0000005b kfffde[52].xptr.disk: 2 ; 0x644: 0x0002 kfffde[52].xptr.flags: 0 ; 0x646: L=0 E=0 D=0 S=0 kfffde[52].xptr.chk: 115 ; 0x647: 0x73 kfffde[53].xptr.au: 92 ; 0x648: 0x0000005c kfffde[53].xptr.disk: 1 ; 0x64c: 0x0001 kfffde[53].xptr.flags: 0 ; 0x64e: L=0 E=0 D=0 S=0 kfffde[53].xptr.chk: 119 ; 0x64f: 0x77 kfffde[54].xptr.au: 92 ; 0x650: 0x0000005c kfffde[54].xptr.disk: 2 ; 0x654: 0x0002 kfffde[54].xptr.flags: 0 ; 0x656: L=0 E=0 D=0 S=0 kfffde[54].xptr.chk: 116 ; 0x657: 0x74 kfffde[55].xptr.au: 89 ; 0x658: 0x00000059 kfffde[55].xptr.disk: 0 ; 0x65c: 0x0000 kfffde[55].xptr.flags: 0 ; 0x65e: L=0 E=0 D=0 S=0 kfffde[55].xptr.chk: 115 ; 0x65f: 0x73 kfffde[56].xptr.au: 90 ; 0x660: 0x0000005a kfffde[56].xptr.disk: 3 ; 0x664: 0x0003 kfffde[56].xptr.flags: 0 ; 0x666: L=0 E=0 D=0 S=0 kfffde[56].xptr.chk: 115 ; 0x667: 0x73 kfffde[57].xptr.au: 90 ; 0x668: 0x0000005a kfffde[57].xptr.disk: 0 ; 0x66c: 0x0000 kfffde[57].xptr.flags: 0 ; 0x66e: L=0 E=0 D=0 S=0 kfffde[57].xptr.chk: 112 ; 0x66f: 0x70 kfffde[58].xptr.au: 91 ; 0x670: 0x0000005b kfffde[58].xptr.disk: 3 ; 0x674: 0x0003 kfffde[58].xptr.flags: 0 ; 0x676: L=0 E=0 D=0 S=0 kfffde[58].xptr.chk: 114 ; 0x677: 0x72 kfffde[59].xptr.au: 93 ; 0x678: 0x0000005d kfffde[59].xptr.disk: 2 ; 0x67c: 0x0002 kfffde[59].xptr.flags: 0 ; 0x67e: L=0 E=0 D=0 S=0 kfffde[59].xptr.chk: 117 ; 0x67f: 0x75 kfffde[60].xptr.au: 93 ; 0x680: 0x0000005d kfffde[60].xptr.disk: 1 ; 0x684: 0x0001 kfffde[60].xptr.flags: 0 ; 0x686: L=0 E=0 D=0 S=0 kfffde[60].xptr.chk: 118 ; 0x687: 0x76 kfffde[61].xptr.au: 91 ; 0x688: 0x0000005b kfffde[61].xptr.disk: 0 ; 0x68c: 0x0000 kfffde[61].xptr.flags: 0 ; 0x68e: L=0 E=0 D=0 S=0 kfffde[61].xptr.chk: 113 ; 0x68f: 0x71 kfffde[62].xptr.au: 94 ; 0x690: 0x0000005e kfffde[62].xptr.disk: 2 ; 0x694: 0x0002 kfffde[62].xptr.flags: 0 ; 0x696: L=0 E=0 D=0 S=0 kfffde[62].xptr.chk: 118 ; 0x697: 0x76
上面数据可以看出,file directory元数据结构分为3个部分:
1.第一部分kfbh字段
确认这是一个ASM文件目录的block(kfbh.type=KFBTYP_FILEDIR),而且是描述263号文件的(kfbh.block.blk=257)。
2.第二部分kfffdb字段则包含:
File incarnation number(kfffdb.node.incarn=930412709)文件的incarnation号,属于文件名的一部分(257号文件(current.257.930412709))
File size in bytes (kfffdb.lobytes=18595840) 文件的大小
Physical extent count (kfffdb.xtntcnt=72) 该文件分配的物理extent的数量
File block size in bytes (kfffdb.blkSize=16384) 文件的块大小
File type (kfffdb.fileType=1), i.e. the database control file 文件的类型,这里为控制文件
3.第三部分kfffde为物理extent分布,这部分输出与从X$KFFXP中查询到的结果一致
例如,物理extent 0在磁盘1(kfffde[0].xptr.disk=1)的AU 78上(kfffde[0].xptr.au:=1309),物理extent 1在磁盘2(kfffde[0].xptr.disk=2)的AU 78上(kfffde[0].xptr.au:=1309),
物理extent 2在磁盘3(kfffde[0].xptr.disk=3)的AU 77上(kfffde[0].xptr.au:=1310),以此类推。
File directory entries for large files
本文中所指的大文件指的是超过60个extent的文件。先到数据库中找出几个大的文件:
SQL> SELECT name, bytes/1024/1024 "Size (MB)" 2 FROM v$datafile; NAME Size (MB) -------------------------------------------------- ---------- +DATADG/jyrac/datafile/system.259.930413057 760 +DATADG/jyrac/datafile/sysaux.258.930413055 1370 +DATADG/jyrac/datafile/undotbs1.262.930413057 100 +DATADG/jyrac/datafile/users.263.930413057 5 +DATADG/jyrac/datafile/example.260.930413057 346.25 +DATADG/jyrac/datafile/undotbs2.261.930413057 150 +DATADG/jyrac/datafile/test01.dbf 100 7 rows selected.
Directly addressed extents
以system表空间的数据文件为例,我们看一下该文件对应的文件目录条目。该文件编号为259,大小为760MB。
SQL> select xnum_kffxp "extent", au_kffxp "au", disk_kffxp "disk" 2 from x$kffxp 3 where group_kffxp=3 and number_kffxp=259 and xnum_kffxp <> 2147483648 4 order by 1,2; extent au disk ---------- ---------- ---------- 0 628 0 0 629 1 1 626 3 1 629 0 2 627 3 2 627 2 3 628 3 3 630 0 4 628 2 4 630 1 5 629 3 ...... ---------- ---------- ---------- 759 1006 3 759 1009 0 760 1007 2 760 1009 1 1522 rows selected.
我们看到ASM实例为该文件分配了1552个物理extent。现在我们通过kfed工具来查看该文件的ASM文件目录条目,它会在文件目录的259号block,也就是文件目录中1号(虚拟)extent的3号block(259减去256得出3)。1号extent位于3号磁盘的第76个AU,并在1号磁盘的第76个AU和2号磁盘的第77个AU上分别存在一份冗余。。下面我们来看看3号磁盘(/dev/raw/raw10)的第76个AU的3号块
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=76 blkn=3 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 259 ; 0x004: blk=259 kfbh.block.obj: 1 ; 0x008: file=1 kfbh.check: 1713481479 ; 0x00c: 0x6621a707 kfbh.fcn.base: 3712 ; 0x010: 0x00000e80 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfffdb.node.incarn: 930413057 ; 0x000: A=1 NUMM=0x1bba7d00 kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 kfffdb.hibytes: 0 ; 0x00c: 0x00000000 kfffdb.lobytes: 796925952 ; 0x010: 0x2f802000 kfffdb.xtntcnt: 1522 ; 0x014: 0x000005f2 kfffdb.xtnteof: 1522 ; 0x018: 0x000005f2 kfffdb.blkSize: 8192 ; 0x01c: 0x00002000 kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0 kfffdb.fileType: 2 ; 0x021: 0x02 kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2 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: 63 ; 0x03c: 0x003f 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]: 107 ; 0x044: 0x0000006b kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff kfffdb.strpwdth: 1 ; 0x04c: 0x01 kfffdb.strpsz: 20 ; 0x04d: 0x14 kfffdb.usmsz: 0 ; 0x04e: 0x0000 kfffdb.crets.hi: 33042832 ; 0x050: HOUR=0x10 DAYS=0xc MNTH=0xc YEAR=0x7e0 kfffdb.crets.lo: 285262848 ; 0x054: USEC=0x0 MSEC=0x31 SECS=0x10 MINS=0x4 kfffdb.modts.hi: 33042897 ; 0x058: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0 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: 629 ; 0x4a0: 0x00000275 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: 92 ; 0x4a7: 0x5c kfffde[1].xptr.au: 628 ; 0x4a8: 0x00000274 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: 92 ; 0x4af: 0x5c kfffde[2].xptr.au: 626 ; 0x4b0: 0x00000272 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: 89 ; 0x4b7: 0x59 ...... kfffde[58].xptr.au: 641 ; 0x670: 0x00000281 kfffde[58].xptr.disk: 3 ; 0x674: 0x0003 kfffde[58].xptr.flags: 0 ; 0x676: L=0 E=0 D=0 S=0 kfffde[58].xptr.chk: 170 ; 0x677: 0xaa kfffde[59].xptr.au: 643 ; 0x678: 0x00000283 kfffde[59].xptr.disk: 1 ; 0x67c: 0x0001 kfffde[59].xptr.flags: 0 ; 0x67e: L=0 E=0 D=0 S=0 kfffde[59].xptr.chk: 170 ; 0x67f: 0xaa kfffde[60].xptr.au: 641 ; 0x680: 0x00000281 kfffde[60].xptr.disk: 2 ; 0x684: 0x0002 kfffde[60].xptr.flags: 0 ; 0x686: L=0 E=0 D=0 S=0 kfffde[60].xptr.chk: 171 ; 0x687: 0xab kfffde[61].xptr.au: 643 ; 0x688: 0x00000283 kfffde[61].xptr.disk: 0 ; 0x68c: 0x0000 kfffde[61].xptr.flags: 0 ; 0x68e: L=0 E=0 D=0 S=0 kfffde[61].xptr.chk: 171 ; 0x68f: 0xab .....
0-59号extent(kfffde[0]-kfffde[59])被称作directly addressed extent,因为它们直接指向数据extent。而编号59以上的extent,被称为indirectly addressed extent,因为它们指向的extent持有的是剩余extent的信息。
Indirectly addressed extents
下面查看2号磁盘(/dev/raw/raw3)(kfffde[60].xptr.disk=2)的641号AU(kfffde[60].xptr.au=641)的内容
[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=641 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 12 ; 0x002: KFBTYP_INDIRECT kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 2147483648 ; 0x004: blk=0 (indirect) kfbh.block.obj: 259 ; 0x008: file=259 kfbh.check: 4179528366 ; 0x00c: 0xf91e8aae kfbh.fcn.base: 2090 ; 0x010: 0x0000082a kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kffixb.dxsn: 30 ; 0x000: 0x0000001e kffixb.xtntblk: 480 ; 0x004: 0x01e0 kffixb.dXrs: 18 ; 0x006: SCHE=0x1 NUMB=0x2 kffixb.ub1spare: 0 ; 0x007: 0x00 kffixb.ub4spare: 0 ; 0x008: 0x00000000 kffixe[0].xptr.au: 642 ; 0x00c: 0x00000282 kffixe[0].xptr.disk: 2 ; 0x010: 0x0002 kffixe[0].xptr.flags: 0 ; 0x012: L=0 E=0 D=0 S=0 kffixe[0].xptr.chk: 168 ; 0x013: 0xa8 kffixe[1].xptr.au: 644 ; 0x014: 0x00000284 kffixe[1].xptr.disk: 0 ; 0x018: 0x0000 kffixe[1].xptr.flags: 0 ; 0x01a: L=0 E=0 D=0 S=0 kffixe[1].xptr.chk: 172 ; 0x01b: 0xac kffixe[2].xptr.au: 645 ; 0x01c: 0x00000285 kffixe[2].xptr.disk: 0 ; 0x020: 0x0000 kffixe[2].xptr.flags: 0 ; 0x022: L=0 E=0 D=0 S=0 kffixe[2].xptr.chk: 173 ; 0x023: 0xad kffixe[3].xptr.au: 645 ; 0x024: 0x00000285 kffixe[3].xptr.disk: 1 ; 0x028: 0x0001 kffixe[3].xptr.flags: 0 ; 0x02a: L=0 E=0 D=0 S=0 kffixe[3].xptr.chk: 172 ; 0x02b: 0xac kffixe[4].xptr.au: 646 ; 0x02c: 0x00000286 kffixe[4].xptr.disk: 1 ; 0x030: 0x0001 kffixe[4].xptr.flags: 0 ; 0x032: L=0 E=0 D=0 S=0 kffixe[4].xptr.chk: 175 ; 0x033: 0xaf kffixe[5].xptr.au: 642 ; 0x034: 0x00000282 kffixe[5].xptr.disk: 3 ; 0x038: 0x0003 kffixe[5].xptr.flags: 0 ; 0x03a: L=0 E=0 D=0 S=0 kffixe[5].xptr.chk: 169 ; 0x03b: 0xa9 kffixe[6].xptr.au: 643 ; 0x03c: 0x00000283 kffixe[6].xptr.disk: 3 ; 0x040: 0x0003 kffixe[6].xptr.flags: 0 ; 0x042: L=0 E=0 D=0 S=0 kffixe[6].xptr.chk: 168 ; 0x043: 0xa8 kffixe[7].xptr.au: 643 ; 0x044: 0x00000283 kffixe[7].xptr.disk: 2 ; 0x048: 0x0002 kffixe[7].xptr.flags: 0 ; 0x04a: L=0 E=0 D=0 S=0 kffixe[7].xptr.chk: 169 ; 0x04b: 0xa9 kffixe[8].xptr.au: 644 ; 0x04c: 0x00000284 kffixe[8].xptr.disk: 2 ; 0x050: 0x0002 kffixe[8].xptr.flags: 0 ; 0x052: L=0 E=0 D=0 S=0 kffixe[8].xptr.chk: 174 ; 0x053: 0xae kffixe[9].xptr.au: 647 ; 0x054: 0x00000287 kffixe[9].xptr.disk: 1 ; 0x058: 0x0001 kffixe[9].xptr.flags: 0 ; 0x05a: L=0 E=0 D=0 S=0 kffixe[9].xptr.chk: 174 ; 0x05b: 0xae kffixe[10].xptr.au: 646 ; 0x05c: 0x00000286 kffixe[10].xptr.disk: 0 ; 0x060: 0x0000 kffixe[10].xptr.flags: 0 ; 0x062: L=0 E=0 D=0 S=0 kffixe[10].xptr.chk: 174 ; 0x063: 0xae
通过上面的信息可以确定这确实是一个indirect extent block(kfbh.type=KFBTYP_INDIRECT),它持有该数据文件剩余的extent的分布信息。
ASM 10G版本,ASM实例在初始化时,会向数据库实例发送所有数据文件的Extent map,由于这种方式非常影响性能,数据库文件如果很大,需要消耗很多的时间,因此在ASM 11G版本以后,初始化时仅发送Extent map中的前60个Extent(也就是元文件1中记录的60个Extent),其余的在数据库实例有需要时再发送。
小结:
ASM文件目录维护了磁盘组中所有文件的相关信息,包括元信息文件、用户创建的文件、数据库文件。我们可以通过查询v$asm_file视图来获取数据库文件的信息,通过v$asm_alias视图来获取相关文件的文件号。