Oracle ASM Continuing Operations Directory

Continuing Operations Directory(COD)
COD用来跟踪ASM中长时间执行的操作,例如rebalance, drop disk, create/delete/resize file,这些信息ACD的简要结构不足以描述其变化,这些操作需要通过ASM的COD目录去追踪,COD是ASM的4号文件,A每一个磁盘组都会有一个COD。如果进程在执行长时间操作未正常完成前异常终止,将会有恢复进程查看COD区域的记录尝试完成或回退这个操作,有两种类型的持续性操作:后台操作和回滚操作。

后台操作
后台操作是由ASM实例的后台进程去执行的,它作为磁盘组的维护任务的一部分,而非特殊要求,直到完成或者ASM实例挂掉,如果ASM实例挂掉,执行恢复的实例需要重新执行后台操作,磁盘组的rebalance就是一个很好的后台操作的例子。我们查询内部视图X$KFFXP找到磁盘组3的COD的AU分布,COD是ASM的文件4,因此在查询中设置了number_kffxp=4。

SQL> select group_number,name,type from v$asm_diskgroup;

GROUP_NUMBER NAME                           TYPE
------------ ------------------------------ ------------
           1 ARCHDG                         NORMAL
           2 CRSDG                          EXTERN
           3 DATADG                         NORMAL
           4 TESTDG                         NORMAL

SQL> select group_number, disk_number, state, name,failgroup,mount_status from v$asm_disk where group_number=3;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           FAILGROUP                                                    MOUNT_STATUS
------------ ----------- ------------------------------ ------------------------------ ------------------------------------------------------------ --------------
           3           0 NORMAL                         DATADG_0001                    DATADG_0001                                                  CACHED
           3           3 NORMAL                         DATADG_0000                    DATADG_0000                                                  CACHED
           3           1 NORMAL                         DATADG_0003                    DATADG_0003                                                  CACHED
           3           2 NORMAL                         DATADG_0002                    DATADG_0002                                                  CACHED

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL


SQL> select number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extents
  2  from x$kffxp
  3  where group_kffxp=3
  4   and disk_kffxp <> 65534
  5   and number_kffxp=4
  6  group by number_kffxp, disk_kffxp
  7  order by 1;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         4          0          6
         4          1          5
         4          2          6
         4          3          7

可以看到,上面显示file #的信息有4条,每个COD大小分别是6个AU,5个AU,6个AU,7个AU。因磁盘组DATADG有4个磁盘所以有4行记录。

查询COD在磁盘组DATADG中的AU分布情况

SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name"
  2  from x$kffxp x, v$asm_disk_stat d
  3  where x.group_kffxp=d.group_number
  4  and x.disk_kffxp=d.disk_number
  5  and x.group_kffxp=3
  6  and x.number_kffxp=4
  7  order by 1, 2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0         36          2 DATADG_0002
             0               1         35          3 DATADG_0000
             0               2         35          1 DATADG_0003
             1               3         36          3 DATADG_0000
             1               4         37          0 DATADG_0001
             1               5         37          2 DATADG_0002
             2               6         72          1 DATADG_0003
             2               7         71          0 DATADG_0001
             2               8         71          3 DATADG_0000
             3               9         72          0 DATADG_0001
             3              10         72          3 DATADG_0000
             3              11         73          1 DATADG_0003
             4              12         73          2 DATADG_0002
             4              13         73          0 DATADG_0001
             4              14         73          3 DATADG_0000
             5              15         74          3 DATADG_0000
             5              16         74          1 DATADG_0003
             5              17         74          2 DATADG_0002
             6              18         75          1 DATADG_0003
             6              19         75          2 DATADG_0002
             6              20         74          0 DATADG_0001
             7              21         75          0 DATADG_0001
             7              22         76          2 DATADG_0002
             7              23         75          3 DATADG_0000

24 rows selected.

因磁盘组DATADG为normal冗余,并且有4个故障磁盘组所以COD信息将会有三份副本。也就是说virtual extent对应的3个physical extent所对应的3个AU所存储的内容是一样的。

通过kfed工具来查看COD的AU分布情况
由于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号文件,从中找出要读的目标文件在磁盘上的分布位置,然后再去读取相应的文件的数据。由于COD是4号文件,所以要读取0号磁盘(/dev/raw/raw11)的2号AU的4号块

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=4 | 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:                       4 ; 0x004: blk=4
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                  3953869782 ; 0x00c: 0xebab43d6
kfbh.fcn.base:                      307 ; 0x010: 0x00000133
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:               33042831 ; 0x050: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.crets.lo:             2457465856 ; 0x054: USEC=0x0 MSEC=0x27d SECS=0x27 MINS=0x24
kfffdb.modts.hi:               33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             2457465856 ; 0x05c: USEC=0x0 MSEC=0x27d 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:                   36 ; 0x4a0: 0x00000024
kfffde[0].xptr.disk:                  2 ; 0x4a4: 0x0002
kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk:                  12 ; 0x4a7: 0x0c
kfffde[1].xptr.au:                   35 ; 0x4a8: 0x00000023
kfffde[1].xptr.disk:                  3 ; 0x4ac: 0x0003
kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk:                  10 ; 0x4af: 0x0a
kfffde[2].xptr.au:                   35 ; 0x4b0: 0x00000023
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:                   8 ; 0x4b7: 0x08
kfffde[3].xptr.au:                   36 ; 0x4b8: 0x00000024
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:                  13 ; 0x4bf: 0x0d
kfffde[4].xptr.au:                   37 ; 0x4c0: 0x00000025
kfffde[4].xptr.disk:                  0 ; 0x4c4: 0x0000
kfffde[4].xptr.flags:                 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk:                  15 ; 0x4c7: 0x0f
kfffde[5].xptr.au:                   37 ; 0x4c8: 0x00000025
kfffde[5].xptr.disk:                  2 ; 0x4cc: 0x0002
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:                   72 ; 0x4d0: 0x00000048
kfffde[6].xptr.disk:                  1 ; 0x4d4: 0x0001
kfffde[6].xptr.flags:                 0 ; 0x4d6: L=0 E=0 D=0 S=0
kfffde[6].xptr.chk:                  99 ; 0x4d7: 0x63
kfffde[7].xptr.au:                   71 ; 0x4d8: 0x00000047
kfffde[7].xptr.disk:                  0 ; 0x4dc: 0x0000
kfffde[7].xptr.flags:                 0 ; 0x4de: L=0 E=0 D=0 S=0
kfffde[7].xptr.chk:                 109 ; 0x4df: 0x6d
kfffde[8].xptr.au:                   71 ; 0x4e0: 0x00000047
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:                 110 ; 0x4e7: 0x6e
kfffde[9].xptr.au:                   72 ; 0x4e8: 0x00000048
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:                  98 ; 0x4ef: 0x62
kfffde[10].xptr.au:                  72 ; 0x4f0: 0x00000048
kfffde[10].xptr.disk:                 3 ; 0x4f4: 0x0003
kfffde[10].xptr.flags:                0 ; 0x4f6: L=0 E=0 D=0 S=0
kfffde[10].xptr.chk:                 97 ; 0x4f7: 0x61
kfffde[11].xptr.au:                  73 ; 0x4f8: 0x00000049
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:                 98 ; 0x4ff: 0x62
kfffde[12].xptr.au:                  73 ; 0x500: 0x00000049
kfffde[12].xptr.disk:                 2 ; 0x504: 0x0002
kfffde[12].xptr.flags:                0 ; 0x506: L=0 E=0 D=0 S=0
kfffde[12].xptr.chk:                 97 ; 0x507: 0x61
kfffde[13].xptr.au:                  73 ; 0x508: 0x00000049
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:                 99 ; 0x50f: 0x63
kfffde[14].xptr.au:                  73 ; 0x510: 0x00000049
kfffde[14].xptr.disk:                 3 ; 0x514: 0x0003
kfffde[14].xptr.flags:                0 ; 0x516: L=0 E=0 D=0 S=0
kfffde[14].xptr.chk:                 96 ; 0x517: 0x60
kfffde[15].xptr.au:                  74 ; 0x518: 0x0000004a
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:                 99 ; 0x51f: 0x63
kfffde[16].xptr.au:                  74 ; 0x520: 0x0000004a
kfffde[16].xptr.disk:                 1 ; 0x524: 0x0001
kfffde[16].xptr.flags:                0 ; 0x526: L=0 E=0 D=0 S=0
kfffde[16].xptr.chk:                 97 ; 0x527: 0x61
kfffde[17].xptr.au:                  74 ; 0x528: 0x0000004a
kfffde[17].xptr.disk:                 2 ; 0x52c: 0x0002
kfffde[17].xptr.flags:                0 ; 0x52e: L=0 E=0 D=0 S=0
kfffde[17].xptr.chk:                 98 ; 0x52f: 0x62
kfffde[18].xptr.au:                  75 ; 0x530: 0x0000004b
kfffde[18].xptr.disk:                 1 ; 0x534: 0x0001
kfffde[18].xptr.flags:                0 ; 0x536: L=0 E=0 D=0 S=0
kfffde[18].xptr.chk:                 96 ; 0x537: 0x60
kfffde[19].xptr.au:                  75 ; 0x538: 0x0000004b
kfffde[19].xptr.disk:                 2 ; 0x53c: 0x0002
kfffde[19].xptr.flags:                0 ; 0x53e: L=0 E=0 D=0 S=0
kfffde[19].xptr.chk:                 99 ; 0x53f: 0x63
kfffde[20].xptr.au:                  74 ; 0x540: 0x0000004a
kfffde[20].xptr.disk:                 0 ; 0x544: 0x0000
kfffde[20].xptr.flags:                0 ; 0x546: L=0 E=0 D=0 S=0
kfffde[20].xptr.chk:                 96 ; 0x547: 0x60
kfffde[21].xptr.au:                  75 ; 0x548: 0x0000004b
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:                 97 ; 0x54f: 0x61
kfffde[22].xptr.au:                  76 ; 0x550: 0x0000004c
kfffde[22].xptr.disk:                 2 ; 0x554: 0x0002
kfffde[22].xptr.flags:                0 ; 0x556: L=0 E=0 D=0 S=0
kfffde[22].xptr.chk:                100 ; 0x557: 0x64
kfffde[23].xptr.au:                  75 ; 0x558: 0x0000004b
kfffde[23].xptr.disk:                 3 ; 0x55c: 0x0003
kfffde[23].xptr.flags:                0 ; 0x55e: L=0 E=0 D=0 S=0
kfffde[23].xptr.chk:                 98 ; 0x55f: 0x62
kfffde[24].xptr.au:          4294967295 ; 0x560: 0xffffffff
kfffde[24].xptr.disk:             65535 ; 0x564: 0xffff
kfffde[24].xptr.flags:                0 ; 0x566: L=0 E=0 D=0 S=0
kfffde[24].xptr.chk:                 42 ; 0x567: 0x2a

从kfffde[0].xptr.au=36,kfffde[0].xptr.disk=2可知COD存储在2号磁盘的36号AU,依此类推,这与上面的查询结果是一致的。

下面通过kfed工具来验证0号virtual extent的3个phyiscal extent所对的3个AU所存储的内容

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=36 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    17403005 ; 0x00c: 0x01098c7d
kfbh.fcn.base:                     3704 ; 0x010: 0x00000e78
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcbg.size:                          0 ; 0x000: 0x0000
kfrcbg.op:                            0 ; 0x002: 0x0000
kfrcbg.inum:                          0 ; 0x004: 0x00000000
kfrcbg.iser:                          0 ; 0x008: 0x00000000
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=35 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    17403005 ; 0x00c: 0x01098c7d
kfbh.fcn.base:                     3704 ; 0x010: 0x00000e78
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcbg.size:                          0 ; 0x000: 0x0000
kfrcbg.op:                            0 ; 0x002: 0x0000
kfrcbg.inum:                          0 ; 0x004: 0x00000000
kfrcbg.iser:                          0 ; 0x008: 0x00000000
[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=35 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    17403005 ; 0x00c: 0x01098c7d
kfbh.fcn.base:                     3704 ; 0x010: 0x00000e78
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcbg.size:                          0 ; 0x000: 0x0000
kfrcbg.op:                            0 ; 0x002: 0x0000 -- 表示后台进程操作,有2种属性值,0 表示当前没有后台进程操作,1表示当前后台进程正在进行reblance operation.
kfrcbg.inum:                          0 ; 0x004: 0x00000000 --表示后台进程所运作的asm instance number
kfrcbg.iser:                          0 ; 0x008: 0x00000000

从上面的输出可以看到,0号virtual extent的3个phyiscal extent所对应的3个AU(2号磁盘[/dev/raw/raw3]的36号AU,3号磁盘[/dev/raw/raw10]的35号AU,1号磁盘[/dev/raw/raw4]的35号AU)所存储的内容是一样的。上面显示了一个COD的块,kfbh.type=KFBTYP_COD_BGO显示为background类型的操作,不过此刻并没有后台操作发生,因为所有的kfrcbg区域都是0,这代表了当前没有活跃的后台操作,如果操作代码kfrcbg.op为1,那么将表示有活跃的磁盘的rebalance操作在进行。

回滚操作
Rollback操作类型类似于数据库的事务。ASM的前台进程发起请求,为了能够记录这个rollback操作,必须在ASM的COD目录中申请一个槽位,COD目录的block 1展示了所有的槽位和使用状态,如果所有的槽位当时都是忙的,那么这个操作会休息一段时间,直到发现其中一个可以使用。rollback类型操作过程中,磁盘组是一个不一致的状态,这个操作需要完成或者回退所有它对磁盘组的更改。数据库实例大多时候会去执行这个操作(例如添加数据文件)。如果数据库实例挂掉或者ASM前台进程挂掉,一个不可恢复的错误会发生,然后这个操作会被终止。创建文件是一个rollback操作非常好的例子,如果在文件空间分配过程中发生错误,那么已经分配过的空间需要被删除,如果数据库实例没有提交文件的创建操作,这个文件必须被自动删除,如果ASM实例挂掉,这个删除操作会由恢复实例来执行。

使用kfed来查看COD的1号块:
先执行数据文件的创建操作

SQL> create tablespace jycs datafile '+DATADG/jyrac/datafile/jycs01.dbf' size 1G ; 

再查看cod的1号块

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=36 blkn=1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           15 ; 0x002: KFBTYP_COD_RBO --表示操作类型,15即为 KFBTYP_COD_RBO,RBO 即为rollback operation的简写
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       1 ; 0x004: blk=1 --表示当前元数据所在的block号
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                    34575077 ; 0x00c: 0x020f92e5
kfbh.fcn.base:                     4320 ; 0x010: 0x000010e0
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
--kfrcrb rb即为rollback
kfrcrb[0].opcode:                     1 ; 0x000: 0x0001 --表示具体的操作类型,该opcode有很多种属性值
kfrcrb[1].opcode:                     0 ; 0x002: 0x0000
kfrcrb[2].opcode:                     0 ; 0x004: 0x0000
kfrcrb[3].opcode:                     0 ; 0x006: 0x0000
kfrcrb[4].opcode:                     0 ; 0x008: 0x0000
kfrcrb[5].opcode:                     0 ; 0x00a: 0x0000
kfrcrb[6].opcode:                     0 ; 0x00c: 0x0000
kfrcrb[7].opcode:                     0 ; 0x00e: 0x0000
kfrcrb[8].opcode:                     0 ; 0x010: 0x0000
kfrcrb[9].opcode:                     0 ; 0x012: 0x0000
kfrcrb[10].opcode:                    0 ; 0x014: 0x0000
kfrcrb[11].opcode:                    0 ; 0x016: 0x0000
kfrcrb[12].opcode:                    0 ; 0x018: 0x0000
kfrcrb[13].opcode:                    0 ; 0x01a: 0x0000
kfrcrb[14].opcode:                    0 ; 0x01c: 0x0000

kfrcrb[i] 区域跟踪了所有活跃的rollback类型操作,上面的信息可以看到有一个操作正在进行中,kfrcrb[0]的值为1,从操作代码我们可以知道这是一个文件的创建操作,rollback操作类型的代码参照表如下:

1 - Create a file
2 - Delete a file
3 - Resize a file
4 - Drop alias entry
5 - Rename alias entry
6 - Rebalance space COD
7 - Drop disks force
8 - Attribute drop
9 - Disk Resync
10 - Disk Repair Time
11 - Volume create
12 - Volume delete
13 - Attribute directory creation
14 - Set zone attributes
15 - User drop

上面的操作是11G,如果是10G,kfrcrb[i]则是不一样的多了kfrcrb[i].inum,kfrcrb[i].iser,kfrcrb[i].pnum例如:

[oracle@jyrac3 ~]$ kfed read /dev/raw/raw5 aun=7 blkn=1 aus=16777216 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           15 ; 0x002: KFBTYP_COD_RBO
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       1 ; 0x004: T=0 NUMB=0x1
kfbh.block.obj:                       4 ; 0x008: TYPE=0x0 NUMB=0x4
kfbh.check:                    17797779 ; 0x00c: 0x010f9293
kfbh.fcn.base:                     4247 ; 0x010: 0x00001097
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfrcrb[0].opcode:                     0 ; 0x000: 0x0000 --表示具体的操作类型,该opcode有很多种属性值
kfrcrb[0].inum:                       0 ; 0x002: 0x0000 --表示asm instance number
kfrcrb[0].iser:                       0 ; 0x004: 0x00000000
kfrcrb[0].pnum:                       0 ; 0x008: 0x00000000
kfrcrb[1].opcode:                     0 ; 0x00c: 0x0000
kfrcrb[1].inum:                       0 ; 0x00e: 0x0000
kfrcrb[1].iser:                       0 ; 0x010: 0x00000000
kfrcrb[1].pnum:                       0 ; 0x014: 0x00000000
kfrcrb[2].opcode:                     0 ; 0x018: 0x0000
kfrcrb[2].inum:                       0 ; 0x01a: 0x0000
kfrcrb[2].iser:                       0 ; 0x01c: 0x00000000
kfrcrb[2].pnum:                       0 ; 0x020: 0x00000000
kfrcrb[3].opcode:                     0 ; 0x024: 0x0000
kfrcrb[3].inum:                       0 ; 0x026: 0x0000
kfrcrb[3].iser:                       0 ; 0x028: 0x00000000
kfrcrb[3].pnum:                       0 ; 0x02c: 0x00000000
kfrcrb[4].opcode:                     0 ; 0x030: 0x0000
kfrcrb[4].inum:                       0 ; 0x032: 0x0000
kfrcrb[4].iser:                       0 ; 0x034: 0x00000000
kfrcrb[4].pnum:                       0 ; 0x038: 0x00000000
kfrcrb[5].opcode:                     0 ; 0x03c: 0x0000
kfrcrb[5].inum:                       0 ; 0x03e: 0x0000
kfrcrb[5].iser:                       0 ; 0x040: 0x00000000
kfrcrb[5].pnum:                       0 ; 0x044: 0x00000000
kfrcrb[6].opcode:                     0 ; 0x048: 0x0000
kfrcrb[6].inum:                       0 ; 0x04a: 0x0000
kfrcrb[6].iser:                       0 ; 0x04c: 0x00000000
kfrcrb[6].pnum:                       0 ; 0x050: 0x00000000
kfrcrb[7].opcode:                     0 ; 0x054: 0x0000
kfrcrb[7].inum:                       0 ; 0x056: 0x0000
kfrcrb[7].iser:                       0 ; 0x058: 0x00000000
kfrcrb[7].pnum:                       0 ; 0x05c: 0x00000000
kfrcrb[8].opcode:                     0 ; 0x060: 0x0000

接下来才是COD DATA

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3 aun=36 blkn=2 
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           16 ; 0x002: KFBTYP_COD_DATA
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       2 ; 0x004: blk=2
kfbh.block.obj:                       4 ; 0x008: file=4
kfbh.check:                   916174568 ; 0x00c: 0x369bb6e8
kfbh.fcn.base:                     4320 ; 0x010: 0x000010e0
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000

这部分是COD DATA内容,从上面可以看到,基本上就是只要头部信息,唯一更新的也就是check值和bash。

小结:
ASM的COD目录跟踪所有长时间运行的ASM操作,对于由于任何原因导致的问题,COD目录中相关记录可以用来把这些操作完成或回退。这些操作可能由另一个实例来完成或者由故障实例重启后来完成。

Oracle ASM Active Change Directory

Active Change Directory(ACD)
当ASM对多个数据结构执行原子性改变。ASM的active change directory 简称ACD会记录相应的日志,它类似于RDBMS的重做日志。ACD的ASM文件号为3。对应的日志记录会以单次IO的方式写入,来确保操作原子性。ACD被分成多个chunk或者thread,每个运行的ASM实例将得到一个大小为42MB的ACD chunk。当一个磁盘组被创建时,会分配一个独立的chunk给ACD。随着更多的实例挂载了该磁盘组,ACD的chunk数也会同比例增长,每个实例会使用属于自己的ACD chunk区。

ACD包含以下内容:
.ACDC – ACD checkpoint ACD检查点
.ABA – ACD block address ACD块地址
.LGE – ACD redo log record ACD 重做日志记录
.BCD – ACD block change descriptor ACD块变更描述

定位ASM active change directory
可以通过查询X$KFFXP视图来获取ACD目录包含的AU。ACD的文件号为3,因此在我们的查询中我们使number_kffxp=3

SQL> select group_number,name,type from v$asm_diskgroup;

GROUP_NUMBER NAME                           TYPE
------------ ------------------------------ ------------
           1 ARCHDG                         NORMAL
           2 CRSDG                          EXTERN
           3 DATADG                         NORMAL

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL

SQL> select number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extents
  2  from x$kffxp
  3  where group_kffxp=3
  4   and disk_kffxp <> 65534
  5   and number_kffxp=3
  6  group by number_kffxp, disk_kffxp
  7  order by 1;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         3          0         64
         3          1         63
         3          2         64
         3          3         64

file 3,即是active change directory,一个占据255个au

SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name"
  2  from x$kffxp x, v$asm_disk_stat d
  3  where x.group_kffxp=d.group_number
  4  and x.disk_kffxp=d.disk_number
  5  and x.group_kffxp=3
  6  and x.number_kffxp=3
  7  order by 1, 2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0          2          3 DATADG_0000
             0               1          4          0 DATADG_0001
             0               2          4          2 DATADG_0002
             1               3          4          1 DATADG_0003
             1               4          3          3 DATADG_0000
             1               5          5          0 DATADG_0001
             2               6          6          0 DATADG_0001
             2               7          5          2 DATADG_0002
             2               8          4          3 DATADG_0000
             3               9          6          2 DATADG_0002
             3              10          7          0 DATADG_0001
             3              11          5          1 DATADG_0003
             4              12          5          3 DATADG_0000
             4              13          6          1 DATADG_0003
             4              14          8          0 DATADG_0001
             5              15          7          1 DATADG_0003
             5              16          7          2 DATADG_0002
             5              17          6          3 DATADG_0000
             6              18          9          0 DATADG_0001
             6              19          8          1 DATADG_0003
             6              20          8          2 DATADG_0002
             7              21          9          2 DATADG_0002
             7              22          7          3 DATADG_0000
             7              23         10          0 DATADG_0001
             8              24          8          3 DATADG_0000
             8              25         10          2 DATADG_0002
             8              26          9          1 DATADG_0003
             9              27         10          1 DATADG_0003
             9              28         11          0 DATADG_0001
             9              29         11          2 DATADG_0002
            10              30         12          0 DATADG_0001
            10              31          9          3 DATADG_0000
            10              32         11          1 DATADG_0003
            11              33         12          2 DATADG_0002
            11              34         12          1 DATADG_0003
            11              35         10          3 DATADG_0000
            12              36         11          3 DATADG_0000
            12              37         13          0 DATADG_0001
            12              38         13          2 DATADG_0002
            13              39         13          1 DATADG_0003
            13              40         12          3 DATADG_0000
            13              41         14          0 DATADG_0001
            14              42         15          0 DATADG_0001
            14              43         14          2 DATADG_0002
            14              44         13          3 DATADG_0000
            15              45         15          2 DATADG_0002
            15              46         16          0 DATADG_0001
            15              47         14          1 DATADG_0003
            16              48         14          3 DATADG_0000
            16              49         15          1 DATADG_0003
            16              50         17          0 DATADG_0001
            17              51         16          1 DATADG_0003
            17              52         16          2 DATADG_0002
            17              53         15          3 DATADG_0000
            18              54         18          0 DATADG_0001
            18              55         17          1 DATADG_0003
            18              56         17          2 DATADG_0002
            19              57         18          2 DATADG_0002
            19              58         16          3 DATADG_0000
            19              59         19          0 DATADG_0001
            20              60         18          3 DATADG_0000
            20              61         20          2 DATADG_0002
            20              62         18          1 DATADG_0003
            21              63         19          1 DATADG_0003
            21              64         21          0 DATADG_0001
            21              65         21          2 DATADG_0002
            22              66         22          0 DATADG_0001
            22              67         19          3 DATADG_0000
            22              68         20          1 DATADG_0003
            23              69         22          2 DATADG_0002
            23              70         21          1 DATADG_0003
            23              71         20          3 DATADG_0000
            24              72         21          3 DATADG_0000
            24              73         23          0 DATADG_0001
            24              74         23          2 DATADG_0002
            25              75         22          1 DATADG_0003
            25              76         22          3 DATADG_0000
            25              77         24          0 DATADG_0001
            26              78         25          0 DATADG_0001
            26              79         24          2 DATADG_0002
            26              80         23          3 DATADG_0000
            27              81         25          2 DATADG_0002
            27              82         26          0 DATADG_0001
            27              83         23          1 DATADG_0003
            28              84         24          3 DATADG_0000
            28              85         24          1 DATADG_0003
            28              86         27          0 DATADG_0001
            29              87         25          1 DATADG_0003
            29              88         26          2 DATADG_0002
            29              89         25          3 DATADG_0000
            30              90         28          0 DATADG_0001
            30              91         26          1 DATADG_0003
            30              92         27          2 DATADG_0002
            31              93         28          2 DATADG_0002
            31              94         26          3 DATADG_0000
            31              95         29          0 DATADG_0001
            32              96         27          3 DATADG_0000
            32              97         29          2 DATADG_0002
            32              98         27          1 DATADG_0003
            33              99         28          1 DATADG_0003
            33             100         30          0 DATADG_0001
            33             101         30          2 DATADG_0002
            34             102         31          0 DATADG_0001
            34             103         28          3 DATADG_0000
            34             104         29          1 DATADG_0003
            35             105         31          2 DATADG_0002
            35             106         30          1 DATADG_0003
            35             107         29          3 DATADG_0000
            36             108         30          3 DATADG_0000
            36             109         32          0 DATADG_0001
            36             110         32          2 DATADG_0002
            37             111         31          1 DATADG_0003
            37             112         31          3 DATADG_0000
            37             113         33          0 DATADG_0001
            38             114         34          0 DATADG_0001
            38             115         33          2 DATADG_0002
            38             116         32          3 DATADG_0000
            39             117         34          2 DATADG_0002
            39             118         35          0 DATADG_0001
            39             119         32          1 DATADG_0003
            40             120         33          3 DATADG_0000
            40             121         33          1 DATADG_0003
            40             122         36          0 DATADG_0001
            41             123         34          1 DATADG_0003
            41             124         35          2 DATADG_0002
            41             125         34          3 DATADG_0000
            42             126         40          0 DATADG_0001
            42             127         40          1 DATADG_0003
            42             128         40          3 DATADG_0000
            43             129         41          2 DATADG_0002
            43             130         41          3 DATADG_0000
            43             131         41          0 DATADG_0001
            44             132         42          3 DATADG_0000
            44             133         42          2 DATADG_0002
            44             134         41          1 DATADG_0003
            45             135         42          1 DATADG_0003
            45             136         42          0 DATADG_0001
            45             137         43          2 DATADG_0002
            46             138         43          0 DATADG_0001
            46             139         43          1 DATADG_0003
            46             140         44          2 DATADG_0002
            47             141         45          2 DATADG_0002
            47             142         44          1 DATADG_0003
            47             143         43          3 DATADG_0000
            48             144         44          3 DATADG_0000
            48             145         44          0 DATADG_0001
            48             146         46          2 DATADG_0002
            49             147         45          1 DATADG_0003
            49             148         45          0 DATADG_0001
            49             149         47          2 DATADG_0002
            50             150         46          0 DATADG_0001
            50             151         46          1 DATADG_0003
            50             152         45          3 DATADG_0000
            51             153         48          2 DATADG_0002
            51             154         47          0 DATADG_0001
            51             155         47          1 DATADG_0003
            52             156         46          3 DATADG_0000
            52             157         48          1 DATADG_0003
            52             158         48          0 DATADG_0001
            53             159         49          1 DATADG_0003
            53             160         47          3 DATADG_0000
            53             161         49          0 DATADG_0001
            54             162         50          0 DATADG_0001
            54             163         49          2 DATADG_0002
            54             164         50          1 DATADG_0003
            55             165         50          2 DATADG_0002
            55             166         48          3 DATADG_0000
            55             167         51          0 DATADG_0001
            56             168         49          3 DATADG_0000
            56             169         51          2 DATADG_0002
            56             170         51          1 DATADG_0003
            57             171         52          1 DATADG_0003
            57             172         52          2 DATADG_0002
            57             173         50          3 DATADG_0000
            58             174         52          0 DATADG_0001
            58             175         51          3 DATADG_0000
            58             176         53          2 DATADG_0002
            59             177         54          2 DATADG_0002
            59             178         53          1 DATADG_0003
            59             179         52          3 DATADG_0000
            60             180         53          3 DATADG_0000
            60             181         53          0 DATADG_0001
            60             182         55          2 DATADG_0002
            61             183         54          1 DATADG_0003
            61             184         54          0 DATADG_0001
            61             185         56          2 DATADG_0002
            62             186         55          0 DATADG_0001
            62             187         55          1 DATADG_0003
            62             188         54          3 DATADG_0000
            63             189         57          2 DATADG_0002
            63             190         56          0 DATADG_0001
            63             191         56          1 DATADG_0003
            64             192         55          3 DATADG_0000
            64             193         57          1 DATADG_0003
            64             194         57          0 DATADG_0001
            65             195         58          1 DATADG_0003
            65             196         56          3 DATADG_0000
            65             197         58          0 DATADG_0001
            66             198         59          0 DATADG_0001
            66             199         58          2 DATADG_0002
            66             200         59          1 DATADG_0003
            67             201         59          2 DATADG_0002
            67             202         57          3 DATADG_0000
            67             203         60          0 DATADG_0001
            68             204         58          3 DATADG_0000
            68             205         60          2 DATADG_0002
            68             206         60          1 DATADG_0003
            69             207         61          1 DATADG_0003
            69             208         61          2 DATADG_0002
            69             209         59          3 DATADG_0000
            70             210         61          0 DATADG_0001
            70             211         60          3 DATADG_0000
            70             212         62          2 DATADG_0002
            71             213         63          2 DATADG_0002
            71             214         62          1 DATADG_0003
            71             215         61          3 DATADG_0000
            72             216         62          3 DATADG_0000
            72             217         62          0 DATADG_0001
            72             218         64          2 DATADG_0002
            73             219         63          1 DATADG_0003
            73             220         63          0 DATADG_0001
            73             221         65          2 DATADG_0002
            74             222         64          0 DATADG_0001
            74             223         64          1 DATADG_0003
            74             224         63          3 DATADG_0000
            75             225         66          2 DATADG_0002
            75             226         65          0 DATADG_0001
            75             227         65          1 DATADG_0003
            76             228         64          3 DATADG_0000
            76             229         66          1 DATADG_0003
            76             230         66          0 DATADG_0001
            77             231         67          1 DATADG_0003
            77             232         65          3 DATADG_0000
            77             233         67          0 DATADG_0001
            78             234         68          0 DATADG_0001
            78             235         67          2 DATADG_0002
            78             236         68          1 DATADG_0003
            79             237         68          2 DATADG_0002
            79             238         66          3 DATADG_0000
            79             239         69          0 DATADG_0001
            80             240         67          3 DATADG_0000
            80             241         69          2 DATADG_0002
            80             242         69          1 DATADG_0003
            81             243         70          1 DATADG_0003
            81             244         70          2 DATADG_0002
            81             245         68          3 DATADG_0000
            82             246         70          0 DATADG_0001
            82             247         69          3 DATADG_0000
            82             248         71          2 DATADG_0002
            83             249         72          2 DATADG_0002
            83             250         71          1 DATADG_0003
            83             251         70          3 DATADG_0000
    2147483648               0         20          0 DATADG_0001
    2147483648               1         17          3 DATADG_0000
    2147483648               2         19          2 DATADG_0002

255 rows selected.

查询返回了255行,即255个AU。其中虚拟extent为2147483648是当前没有被格式化的AU有3个,那么真正使用的是255-3=252,也就从虚拟extent的编号(0-83),由于磁盘组DATADG是normal冗余磁盘组并且存在三个或多个故障磁盘组,所以ACD有三份镜像,252/3=84个AU,而这里有2个ASM实例,所以每个ASM实例有42个AU,AU的大小为1MB,所以就是42MB。

使用kfed来读取元数据
首先读取磁盘组datadg的0号磁盘(/dev/raw/raw11)中的2号AU的3号块来定位到active change directory 所在AU

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 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:                       3 ; 0x004: blk=3
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                    40592047 ; 0x00c: 0x026b62af
kfbh.fcn.base:                      121 ; 0x010: 0x00000079
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:                88080384 ; 0x010: 0x05400000
kfffdb.xtntcnt:                     252 ; 0x014: 0x000000fc
kfffdb.xtnteof:                     252 ; 0x018: 0x000000fc
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:                      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]:             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:             2457465856 ; 0x054: USEC=0x0 MSEC=0x27d SECS=0x27 MINS=0x24
kfffdb.modts.hi:               33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             2457465856 ; 0x05c: USEC=0x0 MSEC=0x27d 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:                  3 ; 0x4a4: 0x0003
kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk:                  43 ; 0x4a7: 0x2b
kfffde[1].xptr.au:                    4 ; 0x4a8: 0x00000004
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:                  46 ; 0x4af: 0x2e
kfffde[2].xptr.au:                    4 ; 0x4b0: 0x00000004
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:                  44 ; 0x4b7: 0x2c
kfffde[3].xptr.au:                    4 ; 0x4b8: 0x00000004
kfffde[3].xptr.disk:                  1 ; 0x4bc: 0x0001
kfffde[3].xptr.flags:                 0 ; 0x4be: L=0 E=0 D=0 S=0
kfffde[3].xptr.chk:                  47 ; 0x4bf: 0x2f
kfffde[4].xptr.au:                    3 ; 0x4c0: 0x00000003
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:                  42 ; 0x4c7: 0x2a
kfffde[5].xptr.au:                    5 ; 0x4c8: 0x00000005
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:                  47 ; 0x4cf: 0x2f

从kfffde[0].xptr.au=2,kfffde[0].xptr.disk=3,可知ACD所在AU为3号磁盘的2号AU,它还有两个镜像副本存储在0号磁盘4号AU与2号磁盘4号AU上,这与查询视图所得到的结果完全一致。

SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name"
  2  from x$kffxp x, v$asm_disk_stat d
  3  where x.group_kffxp=d.group_number
  4  and x.disk_kffxp=d.disk_number
  5  and x.group_kffxp=3
  6  and x.number_kffxp=3
  7  order by 1, 2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0          2          3 DATADG_0000
             0               1          4          0 DATADG_0001
             0               2          4          2 DATADG_0002
.....

使用kfed查看ASM active change directory
接下来使用kfed工具对ACD进行查看。因为上一个查询显示ACD是从DATADG_0000(/dev/raw/raw10)磁盘的第2个AU开始的,而且有2个ASM实例,总共有84个AU,每个AU有三份镜像,那么是不是1

号ASM实例的ACD分布在虚拟extent(0-41),而2号ASM实例的ACD分布在虚拟extent(42-83),下面进行验证。

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=2 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            7 ; 0x002: KFBTYP_ACDC --ACDC,即是Active Change Diectory Checkpoint
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0 --这是对应的block号
kfbh.block.obj:                       3 ; 0x008: file=3
kfbh.check:                  1111751467 ; 0x00c: 0x4243fb2b
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
--kfracdc,这部分即表示active change directory checkpoint信息。
kfracdc.eyec[0]:                     65 ; 0x000: 0x41
kfracdc.eyec[1]:                     67 ; 0x001: 0x43
kfracdc.eyec[2]:                     68 ; 0x002: 0x44
kfracdc.eyec[3]:                     67 ; 0x003: 0x43
kfracdc.thread:                       1 ; 0x004: 0x00000001 --thread 1,表示对应1号asm实例。
kfracdc.lastAba.seq:         4294967295 ; 0x008: 0xffffffff --last ACD block address sequences
kfracdc.lastAba.blk:         4294967295 ; 0x00c: 0xffffffff --last ACD block address block number
kfracdc.blk0:                         1 ; 0x010: 0x00000001
kfracdc.blks:                     10751 ; 0x014: 0x000029ff --ACD 数据(元数据和数据)所占block总数,换算一下即为42m. 10751*4096/1024/1024=42MB
kfracdc.ckpt.seq:                     3 ; 0x018: 0x00000003 --checkpoint当前的sequences号
kfracdc.ckpt.blk:                   598 ; 0x01c: 0x00000256 --checkpoint信息所占的block数
kfracdc.fcn.base:                  4288 ; 0x020: 0x000010c0
kfracdc.fcn.wrap:                     0 ; 0x024: 0x00000000
kfracdc.bufBlks:                    256 ; 0x028: 0x00000100 --block总数
kfracdc.strt112.seq:                  2 ; 0x02c: 0x00000002
kfracdc.strt112.blk:                  0 ; 0x030: 0x00000000

从上面的kfracdc.thread=1,可以确定存储在3号磁盘DATADG_0000(/dev/raw/raw10)的第2个AU上的ACD属于1号ASM实例,从之前的查询结果可知从虚拟extent(42-83)所存储的ACD应该属于2号

ASM实例,2号ASM实例上第一个ACD就分布在虚拟extent 42所对应的3号磁盘DATADG_0000(/dev/raw/raw10)的第40个AU(0号磁盘与1号磁盘上的第40个AU为镜像副本)

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=40 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            7 ; 0x002: KFBTYP_ACDC --ACDC,即是Active Change Diectory Checkpoint
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                   10752 ; 0x004: blk=10752 --这是对应的block号,这也1号ASM实例中所查到的ACD元数据中的kfracdc.blks:=10751对应上了
kfbh.block.obj:                       3 ; 0x008: file=3
kfbh.check:                  1111751043 ; 0x00c: 0x4243f983
kfbh.fcn.base:                       77 ; 0x010: 0x0000004d
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfracdc.eyec[0]:                     65 ; 0x000: 0x41
kfracdc.eyec[1]:                     67 ; 0x001: 0x43
kfracdc.eyec[2]:                     68 ; 0x002: 0x44
kfracdc.eyec[3]:                     67 ; 0x003: 0x43
kfracdc.thread:                       2 ; 0x004: 0x00000002  --thread 2,表示对应2号asm实例。
kfracdc.lastAba.seq:         4294967295 ; 0x008: 0xffffffff  --last ACD block address sequences
kfracdc.lastAba.blk:         4294967295 ; 0x00c: 0xffffffff  --last ACD block address block number
kfracdc.blk0:                     10753 ; 0x010: 0x00002a01
kfracdc.blks:                     10751 ; 0x014: 0x000029ff  --ACD 数据(元数据和数据)所占block总数,换算一下即为42m. 10751*4096/1024/1024=42MB
kfracdc.ckpt.seq:                     3 ; 0x018: 0x00000003  --checkpoint当前的sequences号
kfracdc.ckpt.blk:                   187 ; 0x01c: 0x000000bb  --checkpoint信息所占的block数
kfracdc.fcn.base:                  4299 ; 0x020: 0x000010cb
kfracdc.fcn.wrap:                     0 ; 0x024: 0x00000000
kfracdc.bufBlks:                    256 ; 0x028: 0x00000100  --block总数
kfracdc.strt112.seq:                  2 ; 0x02c: 0x00000002
kfracdc.strt112.blk:                  0 ; 0x030: 0x00000000

以上是ACD的开始,也就是block 0。我们来看一下block 1,也就是ACD的实际数据

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=2 blkn=1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            8 ; 0x002: KFBTYP_CHNGDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       1 ; 0x004: blk=1
kfbh.block.obj:                       3 ; 0x008: file=3
kfbh.check:                    17400326 ; 0x00c: 0x01098206
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfracdb.aba.seq:                      2 ; 0x000: 0x00000002 --ACD block address sequences
kfracdb.aba.blk:                      0 ; 0x004: 0x00000000 --ACD block address block number
kfracdb.ents:                         2 ; 0x008: 0x0002 --这里应该是指的包含的extent数。即2m
kfracdb.ub2spare:                     0 ; 0x00a: 0x0000
--下面的信息为ACD redo log records记录
kfracdb.lge[0].valid:                 1 ; 0x00c: V=1 B=0 M=0
kfracdb.lge[0].chgCount:              1 ; 0x00d: 0x01
kfracdb.lge[0].len:                  64 ; 0x00e: 0x0040
kfracdb.lge[0].kfcn.base:             1 ; 0x010: 0x00000001
kfracdb.lge[0].kfcn.wrap:             0 ; 0x014: 0x00000000

--下面的bcd信息是表示ACD block change description信息
kfracdb.lge[0].bcd[0].kfbl.blk:       0 ; 0x018: blk=0
kfracdb.lge[0].bcd[0].kfbl.obj:       4 ; 0x01c: file=4
kfracdb.lge[0].bcd[0].kfcn.base:      0 ; 0x020: 0x00000000
kfracdb.lge[0].bcd[0].kfcn.wrap:      0 ; 0x024: 0x00000000
kfracdb.lge[0].bcd[0].oplen:          4 ; 0x028: 0x0004 --表示长度,类似logfile dump的LEN
kfracdb.lge[0].bcd[0].blkIndex:       0 ; 0x02a: 0x0000
kfracdb.lge[0].bcd[0].flags:         28 ; 0x02c: F=0 N=0 F=1 L=1 V=1 A=0 C=0
kfracdb.lge[0].bcd[0].opcode:       212 ; 0x02e: 0x00d4 --opcode,类似数据库实例中的update/delete/insert操作的opcode编号
kfracdb.lge[0].bcd[0].kfbtyp:         9 ; 0x030: KFBTYP_COD_BGO  --操作类型,类似数据库实例中的update/delete/insert等类型
kfracdb.lge[0].bcd[0].redund:        19 ; 0x031: SCHE=0x1 NUMB=0x3 --这里表示冗余级别,17是unport,18是mirror,19表示high
kfracdb.lge[0].bcd[0].pad:        63903 ; 0x032: 0xf99f
kfracdb.lge[0].bcd[0].KFRCOD_CRASH:   1 ; 0x034: 0x00000001
kfracdb.lge[0].bcd[0].au[0]:         36 ; 0x038: 0x00000024
kfracdb.lge[0].bcd[0].au[1]:         35 ; 0x03c: 0x00000023
kfracdb.lge[0].bcd[0].au[2]:         35 ; 0x040: 0x00000023
kfracdb.lge[0].bcd[0].disks[0]:       2 ; 0x044: 0x0002
kfracdb.lge[0].bcd[0].disks[1]:       3 ; 0x046: 0x0003
kfracdb.lge[0].bcd[0].disks[2]:       1 ; 0x048: 0x0001
kfracdb.lge[1].valid:                 1 ; 0x04c: V=1 B=0 M=0 
kfracdb.lge[1].chgCount:              1 ; 0x04d: 0x01
kfracdb.lge[1].len:                  64 ; 0x04e: 0x0040
kfracdb.lge[1].kfcn.base:             2 ; 0x050: 0x00000002
kfracdb.lge[1].kfcn.wrap:             0 ; 0x054: 0x00000000
kfracdb.lge[1].bcd[0].kfbl.blk:       1 ; 0x058: blk=1
kfracdb.lge[1].bcd[0].kfbl.obj:       4 ; 0x05c: file=4
kfracdb.lge[1].bcd[0].kfcn.base:      0 ; 0x060: 0x00000000
kfracdb.lge[1].bcd[0].kfcn.wrap:      0 ; 0x064: 0x00000000
kfracdb.lge[1].bcd[0].oplen:          4 ; 0x068: 0x0004
kfracdb.lge[1].bcd[0].blkIndex:       1 ; 0x06a: 0x0001
kfracdb.lge[1].bcd[0].flags:         28 ; 0x06c: F=0 N=0 F=1 L=1 V=1 A=0 C=0
kfracdb.lge[1].bcd[0].opcode:       212 ; 0x06e: 0x00d4
kfracdb.lge[1].bcd[0].kfbtyp:        15 ; 0x070: KFBTYP_COD_RBO
kfracdb.lge[1].bcd[0].redund:        19 ; 0x071: SCHE=0x1 NUMB=0x3
kfracdb.lge[1].bcd[0].pad:        63903 ; 0x072: 0xf99f
kfracdb.lge[1].bcd[0].KFRCOD_CRASH:   0 ; 0x074: 0x00000000
kfracdb.lge[1].bcd[0].au[0]:         36 ; 0x078: 0x00000024
kfracdb.lge[1].bcd[0].au[1]:         35 ; 0x07c: 0x00000023
kfracdb.lge[1].bcd[0].au[2]:         35 ; 0x080: 0x00000023
kfracdb.lge[1].bcd[0].disks[0]:       2 ; 0x084: 0x0002
kfracdb.lge[1].bcd[0].disks[1]:       3 ; 0x086: 0x0003
kfracdb.lge[1].bcd[0].disks[2]:       1 ; 0x088: 0x0001

当运行的asm实例,突然crash后,那么重启asm实例以后,asm可以根据ACD信息去进行instance recover

小结:
Active change dictectory,也就是asm元数据file 3,一共占据42个AU 大小,简称ACD. 每个asm实例对应一份ACD信息,换句话讲,你是双节点asm rac,那么就有84M的ACD数据,以此类推.(事实上不管你AU是多大ACD的信息都是固定的大小)。asm中ACD就类似数据库实例中的redo,记录asm元数据操作记录,以便于asm crash后进行instance recover。ACD信息所在AU,第一个block是其元数据,后面的block是data信息。 ACD data的数据,跟redo的结构有点类似,里面记录的也是thread,sequence,len,opcode等信息。

Oracle ASM Disk Directory

ASM的2号文件就是ASM磁盘目录,它用来跟踪磁盘组中的所有磁盘。当磁盘组是一个独立的存储单元时,每个磁盘组有属于它自己的ASM磁盘目录。ASM中每一个磁盘组都是自解释的,磁盘组之间没有任何的信息上依赖。

对ASM来说,磁盘目录只是一个普通的ASM文件。在ASM的文件目录中也会有它的条目,当磁盘组应用冗余策略时,磁盘目录也会生成镜像副本,并且也会像其他文件一样根据实际需要而增长。

每个磁盘目录条目维护以下内容:
.磁盘号
.磁盘的状态
.磁盘的名称(可能与操作系统所显示的磁盘名不一样)
.所在的Failgroup名称
.创建的时间戳
.故障的时间戳
.故障时间(自失败时间戳截止目前的时间)
.resize目标值
.磁盘修复时间
.Zone的信息

V$ASM_DISK视图
磁盘目录中所维护的大部分信息都可以通过查询v$asm_disk视图来获得。对于被发现的每个磁盘在视图中都有一条记录来表示,包括那些不属于任何磁盘组的磁盘。当每次查询v$asm_disk视图时,ASM就会执行磁盘发现操作,因此对这个视图执行查询的是有代价的。

下面的例子显示了在ASM实例中查询V$ASM_DISK视图的输出

SQL> select group_number, disk_number, state, name, mount_status from v$asm_disk order by 1,2;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           MOUNT_STATUS
------------ ----------- ------------------------------ ------------------------------ --------------
           0           0 NORMAL                                                        CLOSED
           0           1 NORMAL                                                        CLOSED
           0           2 NORMAL                                                        CLOSED
           0           3 NORMAL                                                        CLOSED
           0           4 NORMAL                                                        CLOSED
           0           5 NORMAL                                                        CLOSED
           1           0 NORMAL                         ARCHDG_0000                    CACHED
           1           1 NORMAL                         ARCHDG_0001                    CACHED
           2           0 NORMAL                         CRSDG_0000                     CACHED
           2           1 NORMAL                         CRSDG_0001                     CACHED
           3           0 NORMAL                         DATADG_0001                    CACHED
           3           1 NORMAL                         DATADG_0003                    CACHED
           3           2 NORMAL                         DATADG_0002                    CACHED
           3           3 NORMAL                         DATADG_0000                    CACHED

14 rows selected.

获得了所有ASM识别到的磁盘,包括了哪些不是当前正mount磁盘组(GROUP_NUMBER=0)的磁盘。

V$ASM_DISK_STAT视图
视图V$ASM_DISK_STAT展示了跟V$ASM_DISK相同的信息,不过查询V$ASM_DISK_STAT并不会执行发现所有磁盘的操作。它的信息来自于ASM实例的SGA区,查询V$ASM_DISK_STAT的代价不大,因为并不进行发现磁盘的操作,但是这个查询的结果可能并不能实时反应系统磁盘的现状。并且V$ASM_DISK_STAT中的信息只能反映出当前挂载磁盘组的磁盘信息,而不仅仅是不能反映出系统新加入的盘的信息。

下面的查询显示了在ASM实例中查询V$ASM_DISK_STAT视图的输出

SQL> select group_number, disk_number, state, name, mount_status from v$asm_disk_stat order by 1,2;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           MOUNT_STATUS
------------ ----------- ------------------------------ ------------------------------ --------------
           1           0 NORMAL                         ARCHDG_0000                    CACHED
           1           1 NORMAL                         ARCHDG_0001                    CACHED
           2           0 NORMAL                         CRSDG_0000                     CACHED
           2           1 NORMAL                         CRSDG_0001                     CACHED
           3           0 NORMAL                         DATADG_0001                    CACHED
           3           1 NORMAL                         DATADG_0003                    CACHED
           3           2 NORMAL                         DATADG_0002                    CACHED
           3           3 NORMAL                         DATADG_0000                    CACHED

8 rows selected.

只看到了mount的磁盘组上的磁盘

磁盘目录存储位置
可通过在ASM实例中查询固定表X$KFFXP来找到属于ASM 2号文件磁盘目录的AU分布情况。并且通过关联v$asm_disk_stat视图可以获得磁盘名,下面来查询磁盘组3(datadg)的磁盘目录AU分布情况。

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3 order by 1,2;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL



SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name"
  2  from x$kffxp x, v$asm_disk_stat d
  3  where x.group_kffxp=d.group_number
  4  and x.disk_kffxp=d.disk_number
  5  and x.group_kffxp=3
  6  and x.number_kffxp=2
  7  order by 1, 2;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0          3          2 DATADG_0002
             0               1          3          0 DATADG_0001
             0               2          3          1 DATADG_0003

上面的结果可以看出ASM的磁盘目录有三份镜像,当前磁盘目录的大小是3个物理extent(本例中也就是3个AU),再次强调,即使在一个normal冗余的磁盘组中,ASM的磁盘目录也有三份镜像。让我们使用kfed工具查看下磁盘目录的具体内容,由于数据在3个AU中是一样的,我们只需要查看第一个AU的内容就可以了,这里是DATADG_0001(/dev/raw/raw11)的AU 3:

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=3 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            6 ; 0x002: KFBTYP_DISKDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       2 ; 0x008: file=2
kfbh.check:                    17204021 ; 0x00c: 0x01068335
kfbh.fcn.base:                      311 ; 0x010: 0x00000137
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kffdnd.bnode.incarn:                  1 ; 0x000: A=1 NUMM=0x0
kffdnd.bnode.frlist.number:  4294967295 ; 0x004: 0xffffffff
kffdnd.bnode.frlist.incarn:           0 ; 0x008: A=0 NUMM=0x0
kffdnd.overfl.number:        4294967295 ; 0x00c: 0xffffffff
kffdnd.overfl.incarn:                 0 ; 0x010: A=0 NUMM=0x0
kffdnd.parent.number:                 0 ; 0x014: 0x00000000
kffdnd.parent.incarn:                 1 ; 0x018: A=1 NUMM=0x0
kffdnd.fstblk.number:                 0 ; 0x01c: 0x00000000
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfddde[0].entry.incarn:               1 ; 0x024: A=1 NUMM=0x0
kfddde[0].entry.hash:                 0 ; 0x028: 0x00000000
kfddde[0].entry.refer.number:4294967295 ; 0x02c: 0xffffffff
kfddde[0].entry.refer.incarn:         0 ; 0x030: A=0 NUMM=0x0
kfddde[0].dsknum:                     0 ; 0x034: 0x0000  --diskgroup中,该disk的disk编号,从0开始排序,该值为0,说明该disk是这个磁盘组中的第一个disk
kfddde[0].state:                      2 ; 0x036: KFDSTA_NORMAL--disk状态。其中2表示normal。在asm中,该值对应v$asm_disk.state,主要有如下几种值: 
UNKNOWN ---disk不被diskgroup所识别,通常是diskgroup没有mount。
NORMAL  ---disk目前处于online状态,操作正常。
ADDING  ---表示disk正在被加入到diskgroup当中,其中add disk过程涉及到一系列的操作,包括更新pst,fst,disk dir以及reblance等各项操作。
DROPPING ---表示disk正在被从某个diskgroup中删除,该操作可以认为是adding的相反过程
HUNG   ---该状态表示在drop disk的过程中,由于diskgroup 空间不足而不能完成reblance操作而导致disk处于hung状态。
FORCING ---该状态表示disk已经从diskgroup中移除,但是其disk上的数据尚未被卸载,很可能是强制drop。
DROPPED ---表示disk已经从diskgroup中删除且完成了一系列的相关操作。
#define KFDSTA_INVALID  ((kfdsta)0)  /* Illegal value */
#define KFDSTA_UNKNOWN  ((kfdsta)1)  /* ASM disk state not known */
#define KFDSTA_NORMAL   ((kfdsta)2)  /* Happy disk */
#define KFDSTA_UNUSED   ((kfdsta)3)  /* Unused State - Open */
#define KFDSTA_DROPPING ((kfdsta)4)  /* Disk being dropped from group */
#define KFDSTA_HUNG     ((kfdsta)5)  /* Disk drop operation hung */
#define KFDSTA_FORCING  ((kfdsta)6)  /* Disk beinng drop forced */
#define KFDSTA_DROPPED  ((kfdsta)7)  /* Disk no longer part of group */
#define KFDSTA_ADDING   ((kfdsta)8)  /* Disk being globally validated */

kfddde[0].ddchgfl:                  132 ; 0x037: 0x84
kfddde[0].dskname:          DATADG_0001 ; 0x038: length=11 --磁盘名称,这是asm中定义的diskname.
kfddde[0].fgname:           DATADG_0001 ; 0x058: length=11 --这表示failgroup diskname
kfddde[0].crestmp.hi:          33042831 ; 0x078: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[0].crestmp.lo:        2456905728 ; 0x07c: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[0].failstmp.hi:                0 ; 0x080: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[0].failstmp.lo:                0 ; 0x084: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[0].timer:                      0 ; 0x088: 0x00000000
kfddde[0].size:                    5120 ; 0x08c: 0x00001400 --disk大小,由于au默认是1m,所以这里是5120m
kfddde[0].srRloc.super.hiStart:       0 ; 0x090: 0x00000000
kfddde[0].srRloc.super.loStart:       0 ; 0x094: 0x00000000
kfddde[0].srRloc.super.length:        0 ; 0x098: 0x00000000
kfddde[0].srRloc.incarn:              0 ; 0x09c: 0x00000000
kfddde[0].dskrprtm:                   0 ; 0x0a0: 0x00000000
kfddde[0].start0:                     0 ; 0x0a4: 0x00000000
kfddde[0].size0:                   5120 ; 0x0a8: 0x00001400
kfddde[0].used0:                     76 ; 0x0ac: 0x0000004c
kfddde[0].slot:                       0 ; 0x0b0: 0x00000000
.....
kfddde[1].entry.incarn:               1 ; 0x1e4: A=1 NUMM=0x0
kfddde[1].entry.hash:                 1 ; 0x1e8: 0x00000001
kfddde[1].entry.refer.number:4294967295 ; 0x1ec: 0xffffffff
kfddde[1].entry.refer.incarn:         0 ; 0x1f0: A=0 NUMM=0x0
kfddde[1].dsknum:                     1 ; 0x1f4: 0x0001
kfddde[1].state:                      2 ; 0x1f6: KFDSTA_NORMAL
kfddde[1].ddchgfl:                  132 ; 0x1f7: 0x84
kfddde[1].dskname:          DATADG_0003 ; 0x1f8: length=11
kfddde[1].fgname:           DATADG_0003 ; 0x218: length=11
kfddde[1].crestmp.hi:          33042831 ; 0x238: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[1].crestmp.lo:        2456905728 ; 0x23c: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[1].failstmp.hi:                0 ; 0x240: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[1].failstmp.lo:                0 ; 0x244: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[1].timer:                      0 ; 0x248: 0x00000000
kfddde[1].size:                    5120 ; 0x24c: 0x00001400
kfddde[1].srRloc.super.hiStart:       0 ; 0x250: 0x00000000
kfddde[1].srRloc.super.loStart:       0 ; 0x254: 0x00000000
kfddde[1].srRloc.super.length:        0 ; 0x258: 0x00000000
kfddde[1].srRloc.incarn:              0 ; 0x25c: 0x00000000
kfddde[1].dskrprtm:                   0 ; 0x260: 0x00000000
kfddde[1].start0:                     0 ; 0x264: 0x00000000
kfddde[1].size0:                   5120 ; 0x268: 0x00001400
kfddde[1].used0:                     76 ; 0x26c: 0x0000004c
kfddde[1].slot:                       0 ; 0x270: 0x00000000
....
kfddde[2].entry.incarn:               1 ; 0x3a4: A=1 NUMM=0x0
kfddde[2].entry.hash:                 2 ; 0x3a8: 0x00000002
kfddde[2].entry.refer.number:4294967295 ; 0x3ac: 0xffffffff
kfddde[2].entry.refer.incarn:         0 ; 0x3b0: A=0 NUMM=0x0
kfddde[2].dsknum:                     2 ; 0x3b4: 0x0002
kfddde[2].state:                      2 ; 0x3b6: KFDSTA_NORMAL
kfddde[2].ddchgfl:                  132 ; 0x3b7: 0x84
kfddde[2].dskname:          DATADG_0002 ; 0x3b8: length=11
kfddde[2].fgname:           DATADG_0002 ; 0x3d8: length=11
kfddde[2].crestmp.hi:          33042831 ; 0x3f8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[2].crestmp.lo:        2456905728 ; 0x3fc: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[2].failstmp.hi:                0 ; 0x400: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[2].failstmp.lo:                0 ; 0x404: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[2].timer:                      0 ; 0x408: 0x00000000
kfddde[2].size:                    5120 ; 0x40c: 0x00001400
kfddde[2].srRloc.super.hiStart:       0 ; 0x410: 0x00000000
kfddde[2].srRloc.super.loStart:       0 ; 0x414: 0x00000000
kfddde[2].srRloc.super.length:        0 ; 0x418: 0x00000000
kfddde[2].srRloc.incarn:              0 ; 0x41c: 0x00000000
kfddde[2].dskrprtm:                   0 ; 0x420: 0x00000000
kfddde[2].start0:                     0 ; 0x424: 0x00000000
kfddde[2].size0:                   5120 ; 0x428: 0x00001400
kfddde[2].used0:                     77 ; 0x42c: 0x0000004d
kfddde[2].slot:                       0 ; 0x430: 0x00000000
...
kfddde[3].entry.incarn:               1 ; 0x564: A=1 NUMM=0x0
kfddde[3].entry.hash:                 3 ; 0x568: 0x00000003
kfddde[3].entry.refer.number:4294967295 ; 0x56c: 0xffffffff
kfddde[3].entry.refer.incarn:         0 ; 0x570: A=0 NUMM=0x0
kfddde[3].dsknum:                     3 ; 0x574: 0x0003
kfddde[3].state:                      2 ; 0x576: KFDSTA_NORMAL
kfddde[3].ddchgfl:                  132 ; 0x577: 0x84
kfddde[3].dskname:          DATADG_0000 ; 0x578: length=11
kfddde[3].fgname:           DATADG_0000 ; 0x598: length=11
kfddde[3].crestmp.hi:          33042831 ; 0x5b8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[3].crestmp.lo:        2456905728 ; 0x5bc: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[3].failstmp.hi:                0 ; 0x5c0: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[3].failstmp.lo:                0 ; 0x5c4: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[3].timer:                      0 ; 0x5c8: 0x00000000
kfddde[3].size:                    5120 ; 0x5cc: 0x00001400
kfddde[3].srRloc.super.hiStart:       0 ; 0x5d0: 0x00000000
kfddde[3].srRloc.super.loStart:       0 ; 0x5d4: 0x00000000
kfddde[3].srRloc.super.length:        0 ; 0x5d8: 0x00000000
kfddde[3].srRloc.incarn:              0 ; 0x5dc: 0x00000000
kfddde[3].dskrprtm:                   0 ; 0x5e0: 0x00000000
kfddde[3].start0:                     0 ; 0x5e4: 0x00000000
kfddde[3].size0:                   5120 ; 0x5e8: 0x00001400
kfddde[3].used0:                     76 ; 0x5ec: 0x0000004c
kfddde[3].slot:                       0 ; 0x5f0: 0x00000000
....

输出信息中的kfbh.type为KFBTYP_DISKDIR代表了这是一个磁盘目录。ASM中的磁盘的信息存储在上面输出内容的kfddde的区域,kfddde[0] 是关于磁盘0,kfddde[1]是关于磁盘1,以此类推。

以这种方式我们可以知道磁盘组中所有磁盘的信息,就像你看到的,大部分的信息都可以通过视图V$ASM_DISK去获取,而不需要通过kfed这种工具去查看。

使用kfed工具来判断磁盘目录位置
使用查询得到的磁盘目录AU分布如下:

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3 order by 1,2;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL



SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name"
  2  from x$kffxp x, v$asm_disk_stat d
  3  where x.group_kffxp=d.group_number
  4  and x.disk_kffxp=d.disk_number
  5  and x.group_kffxp=3
  6  and x.number_kffxp=2
  7  order by 1, 2;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0          3          2 DATADG_0002
             0               1          3          0 DATADG_0001
             0               2          3          1 DATADG_0003

上面的结果可以看出ASM的磁盘目录有三份镜像,当前磁盘目录的大小是3个物理extent(本例中也就是3个AU),再次强调,即使在一个normal冗余的磁盘组中,ASM的磁盘目录也有三份镜像。

读取磁盘头

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3  | more
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:                  3693686872 ; 0x00c: 0xdc293058
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
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:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0002 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0002 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042831 ; 0x0a8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:           2456905728 ; 0x0ac: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfdhdb.mntstmp.hi:             33042897 ; 0x0b0: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:            144833536 ; 0x0b4: USEC=0x0 MSEC=0x7f SECS=0xa MINS=0x2
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize:                    5120 ; 0x0c4: 0x00001400
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002 --allocate table
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002 --file directory
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

allocate table元数据在第2个AU里面,而那么必然disk directory信息也在该AU里面,因为进行在读取alocate table信息时,必然要先读取disk directory。file directoryb也在第2个AU中

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11  | grep kfdhdb.f1b1locn
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002

由于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号文件,从中找出要读的目标文件在磁盘上的分布位置,然后再去读取相应的文件的数据。

由于磁盘目录的文件号为2,所以读取2号AU的2号块

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=2 | 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:                       2 ; 0x004: blk=2
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                   305881854 ; 0x00c: 0x123b62fe
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
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:                 1048576 ; 0x010: 0x00100000
kfffdb.xtntcnt:                       3 ; 0x014: 0x00000003
kfffdb.xtnteof:                       3 ; 0x018: 0x00000003
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:                       3 ; 0x03c: 0x0003
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:             2457465856 ; 0x054: USEC=0x0 MSEC=0x27d SECS=0x27 MINS=0x24
kfffdb.modts.hi:               33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             2457465856 ; 0x05c: USEC=0x0 MSEC=0x27d 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:                    3 ; 0x4a0: 0x00000003
kfffde[0].xptr.disk:                  2 ; 0x4a4: 0x0002
kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk:                  43 ; 0x4a7: 0x2b
kfffde[1].xptr.au:                    3 ; 0x4a8: 0x00000003
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:                  41 ; 0x4af: 0x29
kfffde[2].xptr.au:                    3 ; 0x4b0: 0x00000003
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:                  40 ; 0x4b7: 0x28
kfffde[3].xptr.au:           4294967295 ; 0x4b8: 0xffffffff
kfffde[3].xptr.disk:              65535 ; 0x4bc: 0xffff
kfffde[3].xptr.flags:                 0 ; 0x4be: L=0 E=0 D=0 S=0
kfffde[3].xptr.chk:                  42 ; 0x4bf: 0x2a
kfffde[4].xptr.au:           4294967295 ; 0x4c0: 0xffffffff
kfffde[4].xptr.disk:              65535 ; 0x4c4: 0xffff
kfffde[4].xptr.flags:                 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk:                  42 ; 0x4c7: 0x2a
kfffde[5].xptr.au:           4294967295 ; 0x4c8: 0xffffffff

kfffde,是结构数组。由于我这里磁盘目录有三份镜像,kfffde[0]的数据元素,
存放了2号文件第一个AU的位置。kfffde[1]存放了2号文件第二个AU位置,kfffde[2]存放了2号文件第三个AU位置等等,依次类推。我们来看一下上面的信息:
kfffde[0].xptr.au=3 –3号AU
kfffde[0].xptr.disk=2 –2号磁盘
上两个信息合起来,2号盘3号AU,这就是2号文件(磁盘目录)第一个AU的位置
kfffde[1].xptr.au=3 –3号AU
kfffde[1].xptr.disk=0 –0号磁盘
kfffde[2].xptr.au=3 –3号AU
kfffde[2].xptr.disk=1 –1号磁盘
上面的信息显示了2号文件的镜像副本存储在0号盘3号AU与1号盘的3号AU中。这与用查询x$kffxp视图所得到的元数据分布情况一致。

Oracle ASM File Directory

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视图来获取相关文件的文件号。

Oracle ASM Allocation Table

Allocation Table(AT)
每个ASM磁盘有一个Allocation Table来描述磁盘的内容。在disk中对于每个AU,AT都有一个条目llocation Table Entry(ATE)。如果AU被分配给一个ASM文件,它们包含了文件号与区号

查找Allocation Table
在ASM磁盘头(filed kfdhdb.altlocn)存储了Allocation Table的第一个块所存储的位置。在下面的例子中,显示了AT存储在块2.

SQL> select group_number,disk_number,state,name,path from v$asm_disk where group_number3;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           PATH
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 NORMAL                         DATADG_0001                    /dev/raw/raw11
           3           3 NORMAL                         DATADG_0000                    /dev/raw/raw10
           3           1 NORMAL                         DATADG_0003                    /dev/raw/raw4
           3           2 NORMAL                         DATADG_0002                    /dev/raw/raw3

[oracle@jyrac1 ~]$ kfed read /dev/raw/raw10 | grep kfdhdb.altlocn
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002

下面详细查看一下Allocation Table的第一个块

[oracle@jyrac1 ~]$ kfed read /dev/raw/raw10 blkn=2 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       2 ; 0x004: blk=2
kfbh.block.obj:              2147483651 ; 0x008: disk=3
kfbh.check:                  2183627135 ; 0x00c: 0x8227817f
kfbh.fcn.base:                     1453 ; 0x010: 0x000005ad
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdatb.aunum:                         0 ; 0x000: 0x00000000
kfdatb.shrink:                      448 ; 0x004: 0x01c0
kfdatb.ub2pad:                        0 ; 0x006: 0x0000
kfdatb.auinfo[0].link.next:           8 ; 0x008: 0x0008
kfdatb.auinfo[0].link.prev:           8 ; 0x00a: 0x0008
kfdatb.auinfo[1].link.next:          12 ; 0x00c: 0x000c
kfdatb.auinfo[1].link.prev:          12 ; 0x00e: 0x000c
kfdatb.auinfo[2].link.next:          16 ; 0x010: 0x0010
kfdatb.auinfo[2].link.prev:          16 ; 0x012: 0x0010
kfdatb.auinfo[3].link.next:          20 ; 0x014: 0x0014
kfdatb.auinfo[3].link.prev:          20 ; 0x016: 0x0014
kfdatb.auinfo[4].link.next:          24 ; 0x018: 0x0018
kfdatb.auinfo[4].link.prev:          24 ; 0x01a: 0x0018
kfdatb.auinfo[5].link.next:          28 ; 0x01c: 0x001c
kfdatb.auinfo[5].link.prev:          28 ; 0x01e: 0x001c
kfdatb.auinfo[6].link.next:          32 ; 0x020: 0x0020
kfdatb.auinfo[6].link.prev:          32 ; 0x022: 0x0020
kfdatb.spare:                         0 ; 0x024: 0x00000000
kfdate[0].discriminator:              1 ; 0x028: 0x00000001
kfdate[0].allo.lo:                    0 ; 0x028: XNUM=0x0
kfdate[0].allo.hi:              8388608 ; 0x02c: V=1 I=0 H=0 FNUM=0x0
kfdate[1].discriminator:              1 ; 0x030: 0x00000001
kfdate[1].allo.lo:                    0 ; 0x030: XNUM=0x0
kfdate[1].allo.hi:              8388608 ; 0x034: V=1 I=0 H=0 FNUM=0x0
kfdate[2].discriminator:              1 ; 0x038: 0x00000001
kfdate[2].allo.lo:                    0 ; 0x038: XNUM=0x0
kfdate[2].allo.hi:              8388611 ; 0x03c: V=1 I=0 H=0 FNUM=0x3
kfdate[3].discriminator:              1 ; 0x040: 0x00000001
kfdate[3].allo.lo:                    4 ; 0x040: XNUM=0x4
kfdate[3].allo.hi:              8388611 ; 0x044: V=1 I=0 H=0 FNUM=0x3
kfdate[4].discriminator:              1 ; 0x048: 0x00000001
kfdate[4].allo.lo:                    8 ; 0x048: XNUM=0x8
kfdate[4].allo.hi:              8388611 ; 0x04c: V=1 I=0 H=0 FNUM=0x3

从kfdatb.aunum=0,可知AU0是AT块中的第一个AU。kfdatb.shrink=448,意味着AT块可以容纳448个AU的信息。按着这个逻辑我们应该在下一个AT块中看到kfdatb.aunum=448

[oracle@jyrac1 ~]$ kfed read /dev/raw/raw10 blkn=3 | grep kfdatb.aunum
kfdatb.aunum:                       448 ; 0x000: 0x000001c0

以此类推,在一下AT块中将看到kfdatb.aunum=896:

[oracle@jyrac1 ~]$ kfed read /dev/raw/raw10 blkn=4 | grep kfdatb.aunum
kfdatb.aunum:                       896 ; 0x000: 0x00000380

Allocation table条目
对于分配的AUs,Allocation Table条目(kfdate[i])包含extent number,file number与AU的状态–正常分配(flag V=1),可用或未人分配AU(flag V=0)。下面的命令查看Allocation table block 4

[oracle@jyrac1 ~]$ kfed read /dev/raw/raw10 blkn=4 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       4 ; 0x004: blk=4
kfbh.block.obj:              2147483651 ; 0x008: disk=3
kfbh.check:                  2183629333 ; 0x00c: 0x82278a15
kfbh.fcn.base:                     3319 ; 0x010: 0x00000cf7
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdatb.aunum:                       896 ; 0x000: 0x00000380
kfdatb.shrink:                      448 ; 0x004: 0x01c0
kfdatb.ub2pad:                        0 ; 0x006: 0x0000
kfdatb.auinfo[0].link.next:           8 ; 0x008: 0x0008
kfdatb.auinfo[0].link.prev:           8 ; 0x00a: 0x0008
kfdatb.auinfo[1].link.next:          12 ; 0x00c: 0x000c
kfdatb.auinfo[1].link.prev:          12 ; 0x00e: 0x000c
kfdatb.auinfo[2].link.next:          16 ; 0x010: 0x0010
kfdatb.auinfo[2].link.prev:          16 ; 0x012: 0x0010
kfdatb.auinfo[3].link.next:          20 ; 0x014: 0x0014
kfdatb.auinfo[3].link.prev:          20 ; 0x016: 0x0014
kfdatb.auinfo[4].link.next:          24 ; 0x018: 0x0018
kfdatb.auinfo[4].link.prev:          24 ; 0x01a: 0x0018
kfdatb.auinfo[5].link.next:          28 ; 0x01c: 0x001c
kfdatb.auinfo[5].link.prev:          28 ; 0x01e: 0x001c
kfdatb.auinfo[6].link.next:          32 ; 0x020: 0x0020
kfdatb.auinfo[6].link.prev:          32 ; 0x022: 0x0020
kfdatb.spare:                         0 ; 0x024: 0x00000000
kfdate[0].discriminator:              1 ; 0x028: 0x00000001
kfdate[0].allo.lo:                 1082 ; 0x028: XNUM=0x43a
kfdate[0].allo.hi:              8388867 ; 0x02c: V=1 I=0 H=0 FNUM=0x103
kfdate[1].discriminator:              1 ; 0x030: 0x00000001
kfdate[1].allo.lo:                 1085 ; 0x030: XNUM=0x43d
kfdate[1].allo.hi:              8388867 ; 0x034: V=1 I=0 H=0 FNUM=0x103
......
kfdate[284].allo.hi:            8388868 ; 0x90c: V=1 I=0 H=0 FNUM=0x104
kfdate[285].discriminator:            1 ; 0x910: 0x00000001
kfdate[285].allo.lo:                  1 ; 0x910: XNUM=0x1
kfdate[285].allo.hi:            8388869 ; 0x914: V=1 I=0 H=0 FNUM=0x105
kfdate[286].discriminator:            1 ; 0x918: 0x00000001
kfdate[286].allo.lo:                  2 ; 0x918: XNUM=0x2
kfdate[286].allo.hi:            8388869 ; 0x91c: V=1 I=0 H=0 FNUM=0x105
kfdate[287].discriminator:            1 ; 0x920: 0x00000001
kfdate[287].allo.lo:                 10 ; 0x920: XNUM=0xa
kfdate[287].allo.hi:            8388869 ; 0x924: V=1 I=0 H=0 FNUM=0x105
kfdate[288].discriminator:            1 ; 0x928: 0x00000001
kfdate[288].allo.lo:                 13 ; 0x928: XNUM=0xd
kfdate[288].allo.hi:            8388869 ; 0x92c: V=1 I=0 H=0 FNUM=0x105
kfdate[289].discriminator:            1 ; 0x930: 0x00000001
kfdate[289].allo.lo:                 15 ; 0x930: XNUM=0xf
kfdate[289].allo.hi:            8388869 ; 0x934: V=1 I=0 H=0 FNUM=0x105
kfdate[290].discriminator:            1 ; 0x938: 0x00000001
kfdate[290].allo.lo:                 18 ; 0x938: XNUM=0x12
kfdate[290].allo.hi:            8388869 ; 0x93c: V=1 I=0 H=0 FNUM=0x105
kfdate[291].discriminator:            1 ; 0x940: 0x00000001
kfdate[291].allo.lo:                 25 ; 0x940: XNUM=0x19
kfdate[291].allo.hi:            8388869 ; 0x944: V=1 I=0 H=0 FNUM=0x105
kfdate[292].discriminator:            1 ; 0x948: 0x00000001
kfdate[292].allo.lo:                 26 ; 0x948: XNUM=0x1a
kfdate[292].allo.hi:            8388869 ; 0x94c: V=1 I=0 H=0 FNUM=0x105
kfdate[293].discriminator:            1 ; 0x950: 0x00000001
kfdate[293].allo.lo:                 34 ; 0x950: XNUM=0x22
kfdate[293].allo.hi:            8388869 ; 0x954: V=1 I=0 H=0 FNUM=0x105
kfdate[294].discriminator:            1 ; 0x958: 0x00000001
kfdate[294].allo.lo:                 37 ; 0x958: XNUM=0x25
kfdate[294].allo.hi:            8388869 ; 0x95c: V=1 I=0 H=0 FNUM=0x105
kfdate[295].discriminator:            1 ; 0x960: 0x00000001
kfdate[295].allo.lo:                 39 ; 0x960: XNUM=0x27
kfdate[295].allo.hi:            8388869 ; 0x964: V=1 I=0 H=0 FNUM=0x105
kfdate[296].discriminator:            1 ; 0x968: 0x00000001
kfdate[296].allo.lo:                 42 ; 0x968: XNUM=0x2a
kfdate[296].allo.hi:            8388869 ; 0x96c: V=1 I=0 H=0 FNUM=0x105
kfdate[297].discriminator:            1 ; 0x970: 0x00000001
kfdate[297].allo.lo:                 49 ; 0x970: XNUM=0x31
kfdate[297].allo.hi:            8388869 ; 0x974: V=1 I=0 H=0 FNUM=0x105
kfdate[298].discriminator:            1 ; 0x978: 0x00000001
kfdate[298].allo.lo:                 50 ; 0x978: XNUM=0x32
kfdate[298].allo.hi:            8388869 ; 0x97c: V=1 I=0 H=0 FNUM=0x105
kfdate[299].discriminator:            1 ; 0x980: 0x00000001
kfdate[299].allo.lo:                 58 ; 0x980: XNUM=0x3a
kfdate[299].allo.hi:            8388869 ; 0x984: V=1 I=0 H=0 FNUM=0x105
kfdate[300].discriminator:            1 ; 0x988: 0x00000001
kfdate[300].allo.lo:                  1 ; 0x988: XNUM=0x1
kfdate[300].allo.hi:           12583173 ; 0x98c: V=1 I=1 H=0 FNUM=0x105
kfdate[301].discriminator:            1 ; 0x990: 0x00000001
kfdate[301].allo.lo:                 61 ; 0x990: XNUM=0x3d
kfdate[301].allo.hi:            8388869 ; 0x994: V=1 I=0 H=0 FNUM=0x105
kfdate[302].discriminator:            1 ; 0x998: 0x00000001
kfdate[302].allo.lo:                 63 ; 0x998: XNUM=0x3f
kfdate[302].allo.hi:            8388869 ; 0x99c: V=1 I=0 H=0 FNUM=0x105
kfdate[303].discriminator:            1 ; 0x9a0: 0x00000001
kfdate[303].allo.lo:                 66 ; 0x9a0: XNUM=0x42
kfdate[303].allo.hi:            8388869 ; 0x9a4: V=1 I=0 H=0 FNUM=0x105
kfdate[304].discriminator:            1 ; 0x9a8: 0x00000001
kfdate[304].allo.lo:                 73 ; 0x9a8: XNUM=0x49
kfdate[304].allo.hi:            8388869 ; 0x9ac: V=1 I=0 H=0 FNUM=0x105
kfdate[305].discriminator:            1 ; 0x9b0: 0x00000001
kfdate[305].allo.lo:                 74 ; 0x9b0: XNUM=0x4a
kfdate[305].allo.hi:            8388869 ; 0x9b4: V=1 I=0 H=0 FNUM=0x105
kfdate[306].discriminator:            1 ; 0x9b8: 0x00000001
kfdate[306].allo.lo:                 82 ; 0x9b8: XNUM=0x52
kfdate[306].allo.hi:            8388869 ; 0x9bc: V=1 I=0 H=0 FNUM=0x105
kfdate[307].discriminator:            1 ; 0x9c0: 0x00000001
kfdate[307].allo.lo:                 85 ; 0x9c0: XNUM=0x55
kfdate[307].allo.hi:            8388869 ; 0x9c4: V=1 I=0 H=0 FNUM=0x105
kfdate[308].discriminator:            1 ; 0x9c8: 0x00000001
kfdate[308].allo.lo:                 87 ; 0x9c8: XNUM=0x57
kfdate[308].allo.hi:            8388869 ; 0x9cc: V=1 I=0 H=0 FNUM=0x105
kfdate[309].discriminator:            1 ; 0x9d0: 0x00000001
kfdate[309].allo.lo:                 90 ; 0x9d0: XNUM=0x5a
kfdate[309].allo.hi:            8388869 ; 0x9d4: V=1 I=0 H=0 FNUM=0x105
kfdate[310].discriminator:            1 ; 0x9d8: 0x00000001
kfdate[310].allo.lo:                 97 ; 0x9d8: XNUM=0x61
kfdate[310].allo.hi:            8388869 ; 0x9dc: V=1 I=0 H=0 FNUM=0x105
kfdate[311].discriminator:            1 ; 0x9e0: 0x00000001
kfdate[311].allo.lo:                 98 ; 0x9e0: XNUM=0x62
kfdate[311].allo.hi:            8388869 ; 0x9e4: V=1 I=0 H=0 FNUM=0x105
kfdate[312].discriminator:            1 ; 0x9e8: 0x00000001
kfdate[312].allo.lo:                106 ; 0x9e8: XNUM=0x6a
kfdate[312].allo.hi:            8388869 ; 0x9ec: V=1 I=0 H=0 FNUM=0x105
kfdate[313].discriminator:            1 ; 0x9f0: 0x00000001
kfdate[313].allo.lo:                109 ; 0x9f0: XNUM=0x6d
kfdate[313].allo.hi:            8388869 ; 0x9f4: V=1 I=0 H=0 FNUM=0x105
kfdate[314].discriminator:            1 ; 0x9f8: 0x00000001
kfdate[314].allo.lo:                111 ; 0x9f8: XNUM=0x6f
kfdate[314].allo.hi:            8388869 ; 0x9fc: V=1 I=0 H=0 FNUM=0x105
kfdate[315].discriminator:            1 ; 0xa00: 0x00000001
kfdate[315].allo.lo:                114 ; 0xa00: XNUM=0x72
kfdate[315].allo.hi:            8388869 ; 0xa04: V=1 I=0 H=0 FNUM=0x105
kfdate[316].discriminator:            1 ; 0xa08: 0x00000001
kfdate[316].allo.lo:                121 ; 0xa08: XNUM=0x79
kfdate[316].allo.hi:            8388869 ; 0xa0c: V=1 I=0 H=0 FNUM=0x105
kfdate[317].discriminator:            1 ; 0xa10: 0x00000001
kfdate[317].allo.lo:                122 ; 0xa10: XNUM=0x7a
kfdate[317].allo.hi:            8388869 ; 0xa14: V=1 I=0 H=0 FNUM=0x105
kfdate[318].discriminator:            1 ; 0xa18: 0x00000001
kfdate[318].allo.lo:                130 ; 0xa18: XNUM=0x82
kfdate[318].allo.hi:            8388869 ; 0xa1c: V=1 I=0 H=0 FNUM=0x105
kfdate[319].discriminator:            1 ; 0xa20: 0x00000001
kfdate[319].allo.lo:                133 ; 0xa20: XNUM=0x85
kfdate[319].allo.hi:            8388869 ; 0xa24: V=1 I=0 H=0 FNUM=0x105
kfdate[320].discriminator:            1 ; 0xa28: 0x00000001
kfdate[320].allo.lo:                135 ; 0xa28: XNUM=0x87
kfdate[320].allo.hi:            8388869 ; 0xa2c: V=1 I=0 H=0 FNUM=0x105
kfdate[321].discriminator:            1 ; 0xa30: 0x00000001
kfdate[321].allo.lo:                138 ; 0xa30: XNUM=0x8a
kfdate[321].allo.hi:            8388869 ; 0xa34: V=1 I=0 H=0 FNUM=0x105
kfdate[322].discriminator:            1 ; 0xa38: 0x00000001
kfdate[322].allo.lo:                145 ; 0xa38: XNUM=0x91
kfdate[322].allo.hi:            8388869 ; 0xa3c: V=1 I=0 H=0 FNUM=0x105
kfdate[323].discriminator:            1 ; 0xa40: 0x00000001
kfdate[323].allo.lo:                146 ; 0xa40: XNUM=0x92
kfdate[323].allo.hi:            8388869 ; 0xa44: V=1 I=0 H=0 FNUM=0x105
kfdate[324].discriminator:            1 ; 0xa48: 0x00000001
kfdate[324].allo.lo:                154 ; 0xa48: XNUM=0x9a
kfdate[324].allo.hi:            8388869 ; 0xa4c: V=1 I=0 H=0 FNUM=0x105
kfdate[325].discriminator:            1 ; 0xa50: 0x00000001
kfdate[325].allo.lo:                157 ; 0xa50: XNUM=0x9d
kfdate[325].allo.hi:            8388869 ; 0xa54: V=1 I=0 H=0 FNUM=0x105
kfdate[326].discriminator:            1 ; 0xa58: 0x00000001
kfdate[326].allo.lo:                159 ; 0xa58: XNUM=0x9f
kfdate[326].allo.hi:            8388869 ; 0xa5c: V=1 I=0 H=0 FNUM=0x105
kfdate[327].discriminator:            1 ; 0xa60: 0x00000001
kfdate[327].allo.lo:                162 ; 0xa60: XNUM=0xa2
kfdate[327].allo.hi:            8388869 ; 0xa64: V=1 I=0 H=0 FNUM=0x105
kfdate[328].discriminator:            1 ; 0xa68: 0x00000001
kfdate[328].allo.lo:                169 ; 0xa68: XNUM=0xa9
kfdate[328].allo.hi:            8388869 ; 0xa6c: V=1 I=0 H=0 FNUM=0x105
kfdate[329].discriminator:            1 ; 0xa70: 0x00000001
kfdate[329].allo.lo:                170 ; 0xa70: XNUM=0xaa
kfdate[329].allo.hi:            8388869 ; 0xa74: V=1 I=0 H=0 FNUM=0x105
kfdate[330].discriminator:            1 ; 0xa78: 0x00000001
kfdate[330].allo.lo:                178 ; 0xa78: XNUM=0xb2
kfdate[330].allo.hi:            8388869 ; 0xa7c: V=1 I=0 H=0 FNUM=0x105
kfdate[331].discriminator:            1 ; 0xa80: 0x00000001
kfdate[331].allo.lo:                181 ; 0xa80: XNUM=0xb5
kfdate[331].allo.hi:            8388869 ; 0xa84: V=1 I=0 H=0 FNUM=0x105
kfdate[332].discriminator:            1 ; 0xa88: 0x00000001
kfdate[332].allo.lo:                183 ; 0xa88: XNUM=0xb7
kfdate[332].allo.hi:            8388869 ; 0xa8c: V=1 I=0 H=0 FNUM=0x105
kfdate[333].discriminator:            1 ; 0xa90: 0x00000001
kfdate[333].allo.lo:                186 ; 0xa90: XNUM=0xba
kfdate[333].allo.hi:            8388869 ; 0xa94: V=1 I=0 H=0 FNUM=0x105
kfdate[334].discriminator:            1 ; 0xa98: 0x00000001
kfdate[334].allo.lo:                193 ; 0xa98: XNUM=0xc1
kfdate[334].allo.hi:            8388869 ; 0xa9c: V=1 I=0 H=0 FNUM=0x105
kfdate[335].discriminator:            1 ; 0xaa0: 0x00000001
kfdate[335].allo.lo:                194 ; 0xaa0: XNUM=0xc2
kfdate[335].allo.hi:            8388869 ; 0xaa4: V=1 I=0 H=0 FNUM=0x105
kfdate[336].discriminator:            1 ; 0xaa8: 0x00000001
kfdate[336].allo.lo:                202 ; 0xaa8: XNUM=0xca
kfdate[336].allo.hi:            8388869 ; 0xaac: V=1 I=0 H=0 FNUM=0x105
kfdate[337].discriminator:            1 ; 0xab0: 0x00000001
kfdate[337].allo.lo:                205 ; 0xab0: XNUM=0xcd
kfdate[337].allo.hi:            8388869 ; 0xab4: V=1 I=0 H=0 FNUM=0x105
kfdate[338].discriminator:            1 ; 0xab8: 0x00000001
kfdate[338].allo.lo:                207 ; 0xab8: XNUM=0xcf
kfdate[338].allo.hi:            8388869 ; 0xabc: V=1 I=0 H=0 FNUM=0x105
kfdate[339].discriminator:            1 ; 0xac0: 0x00000001
kfdate[339].allo.lo:                210 ; 0xac0: XNUM=0xd2
kfdate[339].allo.hi:            8388869 ; 0xac4: V=1 I=0 H=0 FNUM=0x105
kfdate[340].discriminator:            1 ; 0xac8: 0x00000001
kfdate[340].allo.lo:                217 ; 0xac8: XNUM=0xd9
kfdate[340].allo.hi:            8388869 ; 0xacc: V=1 I=0 H=0 FNUM=0x105
kfdate[341].discriminator:            1 ; 0xad0: 0x00000001
kfdate[341].allo.lo:                218 ; 0xad0: XNUM=0xda
kfdate[341].allo.hi:            8388869 ; 0xad4: V=1 I=0 H=0 FNUM=0x105
kfdate[342].discriminator:            1 ; 0xad8: 0x00000001
kfdate[342].allo.lo:                226 ; 0xad8: XNUM=0xe2
kfdate[342].allo.hi:            8388869 ; 0xadc: V=1 I=0 H=0 FNUM=0x105
kfdate[343].discriminator:            1 ; 0xae0: 0x00000001
kfdate[343].allo.lo:                229 ; 0xae0: XNUM=0xe5
kfdate[343].allo.hi:            8388869 ; 0xae4: V=1 I=0 H=0 FNUM=0x105
kfdate[344].discriminator:            1 ; 0xae8: 0x00000001
kfdate[344].allo.lo:                231 ; 0xae8: XNUM=0xe7
kfdate[344].allo.hi:            8388869 ; 0xaec: V=1 I=0 H=0 FNUM=0x105
kfdate[345].discriminator:            1 ; 0xaf0: 0x00000001
kfdate[345].allo.lo:                234 ; 0xaf0: XNUM=0xea
kfdate[345].allo.hi:            8388869 ; 0xaf4: V=1 I=0 H=0 FNUM=0x105
kfdate[346].discriminator:            1 ; 0xaf8: 0x00000001
kfdate[346].allo.lo:                241 ; 0xaf8: XNUM=0xf1
kfdate[346].allo.hi:            8388869 ; 0xafc: V=1 I=0 H=0 FNUM=0x105
kfdate[347].discriminator:            1 ; 0xb00: 0x00000001
kfdate[347].allo.lo:                242 ; 0xb00: XNUM=0xf2
kfdate[347].allo.hi:            8388869 ; 0xb04: V=1 I=0 H=0 FNUM=0x105
kfdate[348].discriminator:            1 ; 0xb08: 0x00000001
kfdate[348].allo.lo:                250 ; 0xb08: XNUM=0xfa
kfdate[348].allo.hi:            8388869 ; 0xb0c: V=1 I=0 H=0 FNUM=0x105
kfdate[349].discriminator:            1 ; 0xb10: 0x00000001
kfdate[349].allo.lo:                253 ; 0xb10: XNUM=0xfd
kfdate[349].allo.hi:            8388869 ; 0xb14: V=1 I=0 H=0 FNUM=0x105
kfdate[350].discriminator:            1 ; 0xb18: 0x00000001
kfdate[350].allo.lo:                255 ; 0xb18: XNUM=0xff
kfdate[350].allo.hi:            8388869 ; 0xb1c: V=1 I=0 H=0 FNUM=0x105
kfdate[351].discriminator:            1 ; 0xb20: 0x00000001
kfdate[351].allo.lo:                258 ; 0xb20: XNUM=0x102
kfdate[351].allo.hi:            8388869 ; 0xb24: V=1 I=0 H=0 FNUM=0x105
kfdate[352].discriminator:            1 ; 0xb28: 0x00000001
kfdate[352].allo.lo:                265 ; 0xb28: XNUM=0x109
kfdate[352].allo.hi:            8388869 ; 0xb2c: V=1 I=0 H=0 FNUM=0x105
kfdate[353].discriminator:            1 ; 0xb30: 0x00000001
kfdate[353].allo.lo:                266 ; 0xb30: XNUM=0x10a
kfdate[353].allo.hi:            8388869 ; 0xb34: V=1 I=0 H=0 FNUM=0x105
kfdate[354].discriminator:            1 ; 0xb38: 0x00000001
kfdate[354].allo.lo:                274 ; 0xb38: XNUM=0x112
kfdate[354].allo.hi:            8388869 ; 0xb3c: V=1 I=0 H=0 FNUM=0x105
kfdate[355].discriminator:            1 ; 0xb40: 0x00000001
kfdate[355].allo.lo:                277 ; 0xb40: XNUM=0x115
kfdate[355].allo.hi:            8388869 ; 0xb44: V=1 I=0 H=0 FNUM=0x105
kfdate[356].discriminator:            1 ; 0xb48: 0x00000001
kfdate[356].allo.lo:                279 ; 0xb48: XNUM=0x117
kfdate[356].allo.hi:            8388869 ; 0xb4c: V=1 I=0 H=0 FNUM=0x105
kfdate[357].discriminator:            1 ; 0xb50: 0x00000001
kfdate[357].allo.lo:                282 ; 0xb50: XNUM=0x11a
kfdate[357].allo.hi:            8388869 ; 0xb54: V=1 I=0 H=0 FNUM=0x105
kfdate[358].discriminator:            1 ; 0xb58: 0x00000001
kfdate[358].allo.lo:                289 ; 0xb58: XNUM=0x121
kfdate[358].allo.hi:            8388869 ; 0xb5c: V=1 I=0 H=0 FNUM=0x105
kfdate[359].discriminator:            1 ; 0xb60: 0x00000001
kfdate[359].allo.lo:                290 ; 0xb60: XNUM=0x122
kfdate[359].allo.hi:            8388869 ; 0xb64: V=1 I=0 H=0 FNUM=0x105
kfdate[360].discriminator:            1 ; 0xb68: 0x00000001
kfdate[360].allo.lo:                298 ; 0xb68: XNUM=0x12a
kfdate[360].allo.hi:            8388869 ; 0xb6c: V=1 I=0 H=0 FNUM=0x105
kfdate[361].discriminator:            1 ; 0xb70: 0x00000001
kfdate[361].allo.lo:                301 ; 0xb70: XNUM=0x12d
kfdate[361].allo.hi:            8388869 ; 0xb74: V=1 I=0 H=0 FNUM=0x105
kfdate[362].discriminator:            1 ; 0xb78: 0x00000001
kfdate[362].allo.lo:                  4 ; 0xb78: XNUM=0x4
kfdate[362].allo.hi:            8388870 ; 0xb7c: V=1 I=0 H=0 FNUM=0x106
kfdate[363].discriminator:            0 ; 0x4d0: 0x00000000
kfdate[363].free.lo.next:             0 ; 0x4d0: 0x0000
kfdate[363].free.lo.prev:             0 ; 0x4d2: 0x0000
kfdate[363].free.hi:                  0 ; 0x4d4: V=0 ASZM=0x0
....

上面输出内容显示了file 261(FNUM=0x105)的Allocation Table条目,从kfdate[285]开始到kfdate[361]结束。那么这说明file 261总共有77个AU。AU号等于kfdate[i]+offset[kfdatb.aunum=896]。也就是说,AU号为285+896=1181,286+896=1182….361+896=1527。我们可以通过查询x$kffxp视图来进行验证。

SQL> select au_kffxp from x$kffxp where group_kffxp=3  and number_kffxp=261  and disk_kffxp=3 order by  au_kffxp asc;

  AU_KFFXP
----------
      1181
      1182
      1183
      1184
      1185
      1186
      1187
      1188
      1189
      1190
      1191
      1192
      1193
      1194
      1195
      1196
      1197
      1198
      1199
      1200
      1201
      1202
      1203
      1204
      1205
      1206
      1207
      1208
      1209
      1210
      1211
      1212
      1213
      1214
      1215
      1216
      1217
      1218
      1219
      1220
      1221
      1222
      1223
      1224
      1225
      1226
      1227
      1228
      1229
      1230
      1231
      1232
      1233
      1234
      1235
      1236
      1237
      1238
      1239
      1240
      1241
      1242
      1243
      1244
      1245
      1246
      1247
      1248
      1249
      1250
      1251
      1252
      1253
      1254
      1255
      1256
      1257

77 rows selected.

可用空间
在下面的kfed输出中,可以看到kfdate[363]与kfdate[364]两关键字free next,这就说明它们是可以使用的或没有分配的AU(标记V=0)。

[oracle@jyrac1 ~]$ kfed read /dev/raw/raw10 blkn=4 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       4 ; 0x004: blk=4
kfbh.block.obj:              2147483651 ; 0x008: disk=3
kfbh.check:                  2183629333 ; 0x00c: 0x82278a15
kfbh.fcn.base:                     3319 ; 0x010: 0x00000cf7
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdatb.aunum:                       896 ; 0x000: 0x00000380
kfdatb.shrink:                      448 ; 0x004: 0x01c0
kfdatb.ub2pad:                        0 ; 0x006: 0x0000
kfdatb.auinfo[0].link.next:           8 ; 0x008: 0x0008
kfdatb.auinfo[0].link.prev:           8 ; 0x00a: 0x0008
kfdatb.auinfo[1].link.next:          12 ; 0x00c: 0x000c
kfdatb.auinfo[1].link.prev:          12 ; 0x00e: 0x000c
kfdatb.auinfo[2].link.next:          16 ; 0x010: 0x0010
kfdatb.auinfo[2].link.prev:          16 ; 0x012: 0x0010
kfdatb.auinfo[3].link.next:          20 ; 0x014: 0x0014
kfdatb.auinfo[3].link.prev:          20 ; 0x016: 0x0014
kfdatb.auinfo[4].link.next:          24 ; 0x018: 0x0018
kfdatb.auinfo[4].link.prev:          24 ; 0x01a: 0x0018
kfdatb.auinfo[5].link.next:          28 ; 0x01c: 0x001c
kfdatb.auinfo[5].link.prev:          28 ; 0x01e: 0x001c
kfdatb.auinfo[6].link.next:          32 ; 0x020: 0x0020
kfdatb.auinfo[6].link.prev:          32 ; 0x022: 0x0020
kfdatb.spare:                         0 ; 0x024: 0x00000000
kfdate[0].discriminator:              1 ; 0x028: 0x00000001
kfdate[0].allo.lo:                 1082 ; 0x028: XNUM=0x43a
kfdate[0].allo.hi:              8388867 ; 0x02c: V=1 I=0 H=0 FNUM=0x103
kfdate[1].discriminator:              1 ; 0x030: 0x00000001
kfdate[1].allo.lo:                 1085 ; 0x030: XNUM=0x43d
kfdate[1].allo.hi:              8388867 ; 0x034: V=1 I=0 H=0 FNUM=0x103
......
kfdate[284].allo.hi:            8388868 ; 0x90c: V=1 I=0 H=0 FNUM=0x104
kfdate[285].discriminator:            1 ; 0x910: 0x00000001
kfdate[285].allo.lo:                  1 ; 0x910: XNUM=0x1
kfdate[285].allo.hi:            8388869 ; 0x914: V=1 I=0 H=0 FNUM=0x105
.....
kfdate[361].discriminator:            1 ; 0xb70: 0x00000001
kfdate[361].allo.lo:                301 ; 0xb70: XNUM=0x12d
kfdate[361].allo.hi:            8388869 ; 0xb74: V=1 I=0 H=0 FNUM=0x105
kfdate[362].discriminator:            1 ; 0xb78: 0x00000001
kfdate[362].allo.lo:                  4 ; 0xb78: XNUM=0x4
kfdate[362].allo.hi:            8388870 ; 0xb7c: V=1 I=0 H=0 FNUM=0x106
kfdate[363].discriminator:            0 ; 0x4c8: 0x00000000
kfdate[363].free.lo.next:            16 ; 0x4c8: 0x0010
kfdate[363].free.lo.prev:            16 ; 0x4ca: 0x0010
kfdate[363].free.hi:                  2 ; 0x4cc: V=0 ASZM=0x2
kfdate[364].discriminator:            0 ; 0x4d0: 0x00000000
kfdate[364].free.lo.next:             0 ; 0x4d0: 0x0000
kfdate[364].free.lo.prev:             0 ; 0x4d2: 0x0000
kfdate[364].free.hi:                  0 ; 0x4d4: V=0 ASZM=0x0
....

Stride
每个AT块可以容纳448AU(AT中kfdatb.shrink=448),并有整个AT包含254个块(kfdfsb.max=254)。这意味着一个AT可以容纳254*448=113792个AU。这叫作stride,并且stride大小用AU的数量来表示,也就是ASM disk header中的kfdhdb.mfact的值(kfdhdb.mfact=113792)

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=4 | grep kfdatb.shrink
kfdatb.shrink:                      448 ; 0x004: 0x01c0

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=1 | grep kfdfsb.max
kfdfsb.max:                         254 ; 0x004: 0x00fe



[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=0 | grep kfdhdb.mfact
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80

上面显示的stride大小是AU大小为1MB的例子,因为1MB的AU在AU0中可以容纳256个block,因为blcok 0属于disk header,燕且block 1属于Free Space Table,所以只有254个block给AT block使用。

当AU大小为4MB(在exadata中是缺省值),stride的大小将为454272个AU或1817088MB。当使用较大AU大小时,stride也会增长。下面是linux环境下,AU大小为16M时的stride大小也为454272

[grid@jyrac1 ~]$ kfed read /dev/raw/raw5 aun=0 blkn=0 | grep kfdhdb.mfact
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
[grid@jyrac1 ~]$ kfed read /dev/raw/raw5 aun=0 blkn=0 | grep kfdhdb.ausize
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000

多个Allocation Tables
对于较大的ASM磁盘可能有多个stride。每个stride包含属于它自己的物理地址元数据,这意味着它将有属于它自己的AT。

第二个stride在stride中的第一个AU中存储了它的物理地址元数据,执行以下命令来进行验证

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 | grep mfact
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80

上面的输出显示stride的大小为113792个AU。我们来检查第二个stride中的AT条目。这些条目应该存储在AU 113792中的block 2-255中。

[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 | grep mfact
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80
[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=113792 blkn=2 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL

[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=113792 blkn=20 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=113792 blkn=200 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=113792 blkn=255 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL

上面的输出与我们所期待的一样,在AU 113792中有其它的AT存在。如果还有另一个stride,在这个stride的开始位置有另一个AT。对于一个较大的磁盘,将有多个stride,因此我们可以看到第3,4,5个stride的AT

[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=227584 blkn=255 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=341376 blkn=255 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL
[grid@db1 ~]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=455168 blkn=255 | grep type
kfbh.type:                            3 ; 0x002: KFBTYP_ALLOCTBL

小结:每个ASM磁盘至少包含一个Allocation Table(分配表)来描述磁盘的内容。AT对于磁盘中的每个allocation unit(AU)都有一个条目。如果磁盘有多个stride,每个stride有属于它自己的Allocation Table。

Oracle ASM Partnership and Status Table

Partnership and Status Table(PST)包含了关于磁盘组中所有ASM磁盘的信息,比如,磁盘号,磁盘状态,伙伴磁盘号,心跳信息与故障磁盘组信息(11g及以后版本)。PST跟踪磁盘组的成员关系与磁盘的伙伴关系。ASM为了在mount磁盘组时来判断是否有足够的一组磁盘被online就会咨询PST。每个ASM磁盘中的AU 1被保留给PST使用,但只有某些磁盘有PST数据。

PST count
在任何时候,磁盘组有受限数量的活动PSTs。PSTs的数量是由磁盘组的冗余类型与故障磁盘组数量所决定的。对于外部冗余磁盘组它只有一个PST副本。对于正常冗余磁盘组至少有两个PST副本。如果存在三个或多个故障磁盘组,它将有三个PST副本。对于高冗余磁盘组至少有三个PST副本。如果存在四个故障磁盘组,它将有四个PST副本,并且如果有五个或多个故障磁盘组,它将有五个PST副本。

下面通过例子来说明每种冗余磁盘组所包含的PST数量
1.外部冗余磁盘组

SQL> create diskgroup testdg external redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14';

Diskgroup created.

ASM alert log信息如下:

SQL> create diskgroup testdg external redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14' 
NOTE: Assigning number (4,0) to disk (/dev/raw/raw5)
NOTE: Assigning number (4,1) to disk (/dev/raw/raw6)
NOTE: Assigning number (4,2) to disk (/dev/raw/raw7)
NOTE: Assigning number (4,3) to disk (/dev/raw/raw12)
NOTE: Assigning number (4,4) to disk (/dev/raw/raw13)
NOTE: Assigning number (4,5) to disk (/dev/raw/raw14)
NOTE: initializing header on grp 4 disk TESTDG_0000
NOTE: initializing header on grp 4 disk TESTDG_0001
NOTE: initializing header on grp 4 disk TESTDG_0002
NOTE: initializing header on grp 4 disk TESTDG_0003
NOTE: initializing header on grp 4 disk TESTDG_0004
NOTE: initializing header on grp 4 disk TESTDG_0005
NOTE: initiating PST update: grp = 4
Thu Dec 22 08:51:03 2016
GMON updating group 4 at 16 for pid 30, osid 6861
NOTE: group TESTDG: initial PST location: disk 0000 (PST copy 0)
NOTE: PST update grp = 4 completed successfully 

从上面的信息可以看到只有一个PST副本

2.正常冗余磁盘组

SQL> create diskgroup testdg normal redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14';

Diskgroup created.

ASM alert log信息如下:

SQL> create diskgroup testdg normal redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14' 
NOTE: Assigning number (4,0) to disk (/dev/raw/raw5)
NOTE: Assigning number (4,1) to disk (/dev/raw/raw6)
NOTE: Assigning number (4,2) to disk (/dev/raw/raw7)
NOTE: Assigning number (4,3) to disk (/dev/raw/raw12)
NOTE: Assigning number (4,4) to disk (/dev/raw/raw13)
NOTE: Assigning number (4,5) to disk (/dev/raw/raw14)
NOTE: initializing header on grp 4 disk TESTDG_0000
NOTE: initializing header on grp 4 disk TESTDG_0001
NOTE: initializing header on grp 4 disk TESTDG_0002
NOTE: initializing header on grp 4 disk TESTDG_0003
NOTE: initializing header on grp 4 disk TESTDG_0004
NOTE: initializing header on grp 4 disk TESTDG_0005
Fri Dec 23 08:05:45 2016
GMON updating for reconfiguration, group 4 at 24 for pid 30, osid 6861
NOTE: group 4 PST updated.
NOTE: initiating PST update: grp = 4
GMON updating group 4 at 25 for pid 30, osid 6861
NOTE: group TESTDG: initial PST location: disk 0000 (PST copy 0)
NOTE: group TESTDG: initial PST location: disk 0001 (PST copy 1)
NOTE: group TESTDG: initial PST location: disk 0002 (PST copy 2)
NOTE: PST update grp = 4 completed successfully 

从上面的信息可以看到有三个PST副本

3.高冗余磁盘组

SQL> create diskgroup testdg high redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14';

Diskgroup created.

ASM alert log信息如下:

SQL> create diskgroup testdg high redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14' 
NOTE: Assigning number (4,0) to disk (/dev/raw/raw5)
NOTE: Assigning number (4,1) to disk (/dev/raw/raw6)
NOTE: Assigning number (4,2) to disk (/dev/raw/raw7)
NOTE: Assigning number (4,3) to disk (/dev/raw/raw12)
NOTE: Assigning number (4,4) to disk (/dev/raw/raw13)
NOTE: Assigning number (4,5) to disk (/dev/raw/raw14)
NOTE: initializing header on grp 4 disk TESTDG_0000
NOTE: initializing header on grp 4 disk TESTDG_0001
NOTE: initializing header on grp 4 disk TESTDG_0002
NOTE: initializing header on grp 4 disk TESTDG_0003
NOTE: initializing header on grp 4 disk TESTDG_0004
NOTE: initializing header on grp 4 disk TESTDG_0005
Fri Dec 23 08:18:04 2016
GMON updating for reconfiguration, group 4 at 33 for pid 30, osid 6861
NOTE: group 4 PST updated.
NOTE: initiating PST update: grp = 4
GMON updating group 4 at 34 for pid 30, osid 6861
NOTE: group TESTDG: initial PST location: disk 0000 (PST copy 0)
NOTE: group TESTDG: initial PST location: disk 0001 (PST copy 1)
NOTE: group TESTDG: initial PST location: disk 0002 (PST copy 2)
NOTE: group TESTDG: initial PST location: disk 0003 (PST copy 3)
NOTE: group TESTDG: initial PST location: disk 0004 (PST copy 4)
NOTE: PST update grp = 4 completed successfully 

从上面的信息可以看到有五个PST副本

PST重新定位
在以下情况下PST将会重新定位:
.(在ASM启动时)磁盘的PST不可用
.磁盘脱机
.当对PST执行读/写时出现I/O错误
.磁盘被删除

对于以上情况PST将会被重新定位到相同故障磁盘组的另一个磁盘上(相同故障磁盘组中可用的磁盘上)或另一个故障磁盘组中的磁盘上(哪些不包括PST副本的磁盘)。

例如:

SQL> drop diskgroup testdg;

Diskgroup dropped.

SQL> create diskgroup testdg normal redundancy disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7','/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14';

Diskgroup created.

ASM alert log信息显示PST副本分布存储在disk 0,1和2:

NOTE: group TESTDG: initial PST location: disk 0000 (PST copy 0)
NOTE: group TESTDG: initial PST location: disk 0001 (PST copy 1)
NOTE: group TESTDG: initial PST location: disk 0002 (PST copy 2)


我们现在来删除disk 0:
SQL> select disk_number, name, path from v$asm_disk_stat where group_number = (select group_number from v$asm_diskgroup_stat where name='TESTDG') order by disk_number asc;

DISK_NUMBER NAME                           PATH
----------- ------------------------------ ------------------------------
          0 TESTDG_0000                    /dev/raw/raw5
          1 TESTDG_0001                    /dev/raw/raw6
          2 TESTDG_0002                    /dev/raw/raw7
          3 TESTDG_0003                    /dev/raw/raw12
          4 TESTDG_0004                    /dev/raw/raw13
          5 TESTDG_0005                    /dev/raw/raw14

6 rows selected.

SQL> alter diskgroup testdg drop disk TESTDG_0000;

Diskgroup altered.

ASM alert log信息

SQL> alter diskgroup testdg drop disk TESTDG_0000 
NOTE: GroupBlock outside rolling migration privileged region
NOTE: requesting all-instance membership refresh for group=4
Fri Dec 23 09:05:37 2016
GMON updating for reconfiguration, group 4 at 50 for pid 30, osid 6861
NOTE: group 4 PST updated.
Fri Dec 23 09:05:38 2016
NOTE: membership refresh pending for group 4/0xce186197 (TESTDG)
GMON querying group 4 at 51 for pid 18, osid 5012
SUCCESS: refreshed membership for 4/0xce186197 (TESTDG)
NOTE: starting rebalance of group 4/0xce186197 (TESTDG) at power 1
SUCCESS: alter diskgroup testdg drop disk TESTDG_0000
Starting background process ARB0
Fri Dec 23 09:05:41 2016
ARB0 started with pid=36, OS id=23811 
NOTE: assigning ARB0 to group 4/0xce186197 (TESTDG) with 1 parallel I/O
cellip.ora not found.
NOTE: F1X0 copy 1 relocating from 0:2 to 4:28 for diskgroup 4 (TESTDG)
Fri Dec 23 09:05:53 2016
NOTE: stopping process ARB0
SUCCESS: rebalance completed for group 4/0xce186197 (TESTDG)
NOTE: Attempting voting file refresh on diskgroup TESTDG
NOTE: Refresh completed on diskgroup TESTDG. No voting file found.
Fri Dec 23 09:05:53 2016
NOTE: GroupBlock outside rolling migration privileged region
NOTE: requesting all-instance membership refresh for group=4
Fri Dec 23 09:05:56 2016
GMON updating for reconfiguration, group 4 at 52 for pid 36, osid 23854
NOTE: group 4 PST updated.
SUCCESS: grp 4 disk TESTDG_0000 emptied
NOTE: erasing header on grp 4 disk TESTDG_0000
NOTE: process _x000_+asm1 (23854) initiating offline of disk 0.3915944465 (TESTDG_0000) with mask 0x7e in group 4
NOTE: initiating PST update: grp = 4, dsk = 0/0xe9689211, mask = 0x6a, op = clear
GMON updating disk modes for group 4 at 53 for pid 36, osid 23854
NOTE: group TESTDG: updated PST location: disk 0001 (PST copy 0)
NOTE: group TESTDG: updated PST location: disk 0002 (PST copy 1)
NOTE: group TESTDG: updated PST location: disk 0003 (PST copy 2)

我们现在来删除disk 0:

SQL> select disk_number, name, path from v$asm_disk_stat where group_number = (select group_number from v$asm_diskgroup_stat where name='TESTDG') order by disk_number asc;

DISK_NUMBER NAME                           PATH
----------- ------------------------------ ------------------------------
          0 TESTDG_0000                    /dev/raw/raw5
          1 TESTDG_0001                    /dev/raw/raw6
          2 TESTDG_0002                    /dev/raw/raw7
          3 TESTDG_0003                    /dev/raw/raw12
          4 TESTDG_0004                    /dev/raw/raw13
          5 TESTDG_0005                    /dev/raw/raw14

6 rows selected.

PST可用性
PST表的数据要先于其他ASM元数据之前可用。当磁盘组被请求mount时,GMON进程(在ASM实例请求mount)会读取磁盘组中的所有磁盘来找到并验证所有可用的PST副本。一旦它验证有足够的PST,就会mount磁盘组。从这个时刻开始,PST表的信息储存在ASM实例的cache里;位于GMON 进程的PGA中,由PT.n.0 enqueue排他锁进行保护。对于同一集群的其他ASM实例,在启动之后会把PST表缓存在自己的GMON PGA中,加上共享的PT.n.0 enqueue。只有拥有排他PT enqueue锁的GMON进程(10gR1中为CKPT),可以更新磁盘中的PST表信息。

PST(GMON)跟踪
每次尝试mount磁盘组时,GMON trace文件就会记录PST信息。注意我说的是尝试,不是已经mount上。换句话说,GMON不管mount动作成功与否,都会记录信息。这些信息对于Oracle Support诊断磁盘组mount失败故障可能会有价值。
下面查看GMON trace文件记录的testdg磁盘组mount的信息:

[grid@jyrac1 trace]$ ls -lrt *gmon*
-rw-r----- 1 grid oinstall    276 Nov 22 18:25 +ASM1_gmon_21379.trm
-rw-r----- 1 grid oinstall   9953 Nov 22 18:25 +ASM1_gmon_21379.trc
-rw-r----- 1 grid oinstall    631 Nov 23 07:57 +ASM1_gmon_22366.trm
-rw-r----- 1 grid oinstall  26275 Nov 23 07:57 +ASM1_gmon_22366.trc
-rw-r----- 1 grid oinstall    809 Nov 24 09:01 +ASM1_gmon_4906.trm
-rw-r----- 1 grid oinstall  41769 Nov 24 09:01 +ASM1_gmon_4906.trc
-rw-r----- 1 grid oinstall    263 Nov 24 09:06 +ASM1_gmon_18658.trm
-rw-r----- 1 grid oinstall  17305 Nov 24 09:06 +ASM1_gmon_18658.trc
-rw-r----- 1 grid oinstall    256 Nov 24 09:12 +ASM1_gmon_20072.trm
-rw-r----- 1 grid oinstall  17274 Nov 24 09:12 +ASM1_gmon_20072.trc
-rw-r----- 1 grid oinstall    263 Nov 24 09:14 +ASM1_gmon_20707.trm
-rw-r----- 1 grid oinstall  17300 Nov 24 09:14 +ASM1_gmon_20707.trc
-rw-r----- 1 grid oinstall    332 Nov 24 09:26 +ASM1_gmon_22827.trm
-rw-r----- 1 grid oinstall  17595 Nov 24 09:26 +ASM1_gmon_22827.trc
-rw-r----- 1 grid oinstall    262 Nov 24 09:48 +ASM1_gmon_26737.trm
-rw-r----- 1 grid oinstall  15829 Nov 24 09:48 +ASM1_gmon_26737.trc
-rw-r----- 1 grid oinstall   2175 Dec 14 16:57 +ASM1_gmon_4909.trm
-rw-r----- 1 grid oinstall 178545 Dec 14 16:57 +ASM1_gmon_4909.trc
-rw-r----- 1 grid oinstall   1616 Dec 23 09:05 +ASM1_gmon_5014.trm
-rw-r----- 1 grid oinstall 135047 Dec 23 09:05 +ASM1_gmon_5014.trc
[grid@jyrac1 trace]$ cat +ASM1_gmon_5014.trc
*** 2016-12-23 09:05:56.534
GMON updating disk modes for group 4 at 53 for pid 36, osid 23854
  dsk = 0/0xe9689211, mask = 0x6a, op = clear
PRE
=============== PST ==================== 
grpNum:    4 
state:     1 
callCnt:   53 
(lockvalue) valid=1 ver=1.1 ndisks=3 flags=0x0 from inst=1 (I am 1) last=4
(lockvalue) dsks: 0 1 2
--------------- HDR -------------------- 
next: 	 4 
last: 	 4 
pst count: 	 3 
pst locations: 	 0  1  2 
incarn:   	 1 
dta size: 	 6 
version: 	 0 
ASM version: 	 168820736 = 10.1.0.0.0
contenttype: 	 0
partnering pattern: 	 [ ]
--------------- LOC MAP ---------------- 
0: dirty 0 	 cur_loc: 0 	 stable_loc: 0
1: dirty 0 	 cur_loc: 1 	 stable_loc: 1
--------------- DTA -------------------- 
0: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 
1: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 2 (amp) 3 (amp) 4 (amp) 5 (amp) 
2: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 3 (amp) 4 (amp) 5 (amp) 
3: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 2 (amp) 4 (amp) 5 (amp) 
4: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 2 (amp) 3 (amp) 5 (amp) 
5: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 2 (amp) 3 (amp) 4 (amp) 

=== PST ===标记的部分显示了磁盘组号(grpNum),状态,例如grpNum: 4 说明磁盘组号为4,就是testdg磁盘组

SQL> select group_number,name,block_size,allocation_unit_size,state,type from v$asm_diskgroup where group_number=4;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE                  TYPE
------------ ------------------------------ ---------- -------------------- ---------------------- ------------
           4 TESTDG                               4096              1048576 MOUNTED                NORMAL

— HDR —标记的部分显示了PST的副本数(pst count)和所在的磁盘号,例如这里显示了有3个PST,分别存储在disk

0000,0001,0002
pst count: 	 3 
pst locations: 	 0  1  2 

— DTA —显示了PST所在磁盘的状态

0: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 
1: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 2 (amp) 3 (amp) 4 (amp) 5 (amp) 
2: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 3 (amp) 4 (amp) 5 (amp) 
3: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 2 (amp) 4 (amp) 5 (amp) 
4: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 2 (amp) 3 (amp) 5 (amp) 
5: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addTs = 0 parts: 1 (amp) 2 (amp) 3 (amp) 4 (amp) 

可以看到PST副本所在磁盘从原来的disk 0000,disk 0001,disk 0002变成了现在的disk 0001,disk 0002,disk 0003了。我们也可以使用kfed来验证PST只存在于testdg磁盘组中的disk 0001,disk 0002,disk 0003的三块磁盘上

SQL> select disk_number, name, path from v$asm_disk_stat where group_number = (select group_number from v$asm_diskgroup_stat where name='TESTDG') order by disk_number asc;

DISK_NUMBER NAME                           PATH
----------- ------------------------------ ------------------------------
          1 TESTDG_0001                    /dev/raw/raw6
          2 TESTDG_0002                    /dev/raw/raw7
          3 TESTDG_0003                    /dev/raw/raw12
          4 TESTDG_0004                    /dev/raw/raw13
          5 TESTDG_0005                    /dev/raw/raw14

testdg中的disk 0001,0002,0003对应的磁盘就是/dev/raw/raw6,7,12:

[grid@jyrac1 trace]$ kfed read /dev/raw/raw6 aun=1 blkn=0 | grep type
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
[grid@jyrac1 trace]$ kfed read /dev/raw/raw6 aun=1 blkn=1 | grep type
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
[grid@jyrac1 trace]$ kfed read /dev/raw/raw6 aun=1 blkn=2 | grep type
kfbh.type:                           18 ; 0x002: KFBTYP_PST_DTA
[grid@jyrac1 trace]$ kfed read /dev/raw/raw6 aun=1 blkn=3 | grep type
kfbh.type:                           18 ; 0x002: KFBTYP_PST_DTA
[grid@jyrac1 trace]$ kfed read /dev/raw/raw6 aun=1 blkn=4 | grep type
kfbh.type:                           13 ; 0x002: KFBTYP_PST_NONE

从上面的信息可以看到在磁盘的au 1都是用来存储PST。其中块(块号从0开始)1,2用来存储的PST元数据,块3,4用来存储的PST数据,还可以看到块5没有存储任何数据,下面的磁盘/dev/raw/raw7,12的情况与/dev/raw/raw6是一样的

[grid@jyrac1 trace]$ kfed read /dev/raw/raw7 aun=1 blkn=0 | grep type
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
[grid@jyrac1 trace]$ kfed read /dev/raw/raw7 aun=1 blkn=1 | grep type
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
[grid@jyrac1 trace]$ kfed read /dev/raw/raw7 aun=1 blkn=2 | grep type
kfbh.type:                           18 ; 0x002: KFBTYP_PST_DTA
[grid@jyrac1 trace]$ kfed read /dev/raw/raw7 aun=1 blkn=3 | grep type
kfbh.type:                           18 ; 0x002: KFBTYP_PST_DTA
[grid@jyrac1 trace]$ kfed read /dev/raw/raw7 aun=1 blkn=4 | grep type
kfbh.type:                           13 ; 0x002: KFBTYP_PST_NONE
[grid@jyrac1 trace]$ kfed read /dev/raw/raw12 aun=1 blkn=0 | grep type
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
[grid@jyrac1 trace]$ kfed read /dev/raw/raw12 aun=1 blkn=1 | grep type
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
[grid@jyrac1 trace]$ kfed read /dev/raw/raw12 aun=1 blkn=2 | grep type
kfbh.type:                           18 ; 0x002: KFBTYP_PST_DTA
[grid@jyrac1 trace]$ kfed read /dev/raw/raw12 aun=1 blkn=3 | grep type
kfbh.type:                           18 ; 0x002: KFBTYP_PST_DTA
[grid@jyrac1 trace]$ kfed read /dev/raw/raw12 aun=1 blkn=4 | grep type
kfbh.type:                           13 ; 0x002: KFBTYP_PST_NONE

从下面的信息可以看到disk 0004,0005对应的/dev/raw/raw13,14的AU 1中没有存储PST相关数据。

[grid@jyrac1 trace]$ kfed read /dev/raw/raw13 aun=1 blkn=0 | grep type
kfbh.type:                           13 ; 0x002: KFBTYP_PST_NONE
[grid@jyrac1 trace]$ kfed read /dev/raw/raw14 aun=1 blkn=0 | grep type
kfbh.type:                           13 ; 0x002: KFBTYP_PST_NONE

查看PST元数据

[grid@jyrac1 trace]$ kfed read /dev/raw/raw6 aun=1 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01 --0 表示big endian,1 表示little endian.
kfbh.hard:                          130 ; 0x001: 0x82 --表示HARD magic number
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META --表示PST元数据块
kfbh.datfmt:                          1 ; 0x003: 0x01 --表示元数据块格式
kfbh.block.blk:                     256 ; 0x004: blk=256 --表示块号,那为什么这里是256,因为AU的大小是1M,块大小是4K,一个AU包含256个块,而块号是从0开始,第一个AU(AU 0)的最大块号就是255,那么第二个AU(AU 1)的第一个块的块号就是256
kfbh.block.obj:              2147483649 ; 0x008: disk=1 
kfbh.check:                  2539674092 ; 0x00c: 0x976059ec --做校验用的,check一致性
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdpHdrBv0.time.hi:            33043177 ; 0x000: HOUR=0x9 DAYS=0x17 MNTH=0xc YEAR=0x7e0 --最后一次pst元数据的更新时间,精确到小时
kfdpHdrBv0.time.lo:           395175936 ; 0x004: USEC=0x0 MSEC=0x37a SECS=0x38 MINS=0x5 --最后一次pst元数据的更新时间,精确到微秒
kfdpHdrBv0.last:                      7 ; 0x008: 0x00000007 --最新的disk版本号
kfdpHdrBv0.next:                      7 ; 0x00c: 0x00000007 --下一个disk版本号
kfdpHdrBv0.copyCnt:                   3 ; 0x010: 0x03 --表示PST元数据的备份信息,3表示磁盘组是normal冗余。1表示磁盘组是external冗余。
kfdpHdrBv0.version:                   0 ; 0x011: 0x00
kfdpHdrBv0.ub2spare:                  0 ; 0x012: 0x0000
kfdpHdrBv0.incarn:                    4 ; 0x014: 0x00000004
kfdpHdrBv0.copy[0]:                   1 ; 0x018: 0x0001
kfdpHdrBv0.copy[1]:                   2 ; 0x01a: 0x0002
kfdpHdrBv0.copy[2]:                   3 ; 0x01c: 0x0003
kfdpHdrBv0.copy[3]:                   0 ; 0x01e: 0x0000
kfdpHdrBv0.copy[4]:                   0 ; 0x020: 0x0000
kfdpHdrBv0.dtaSz:                     6 ; 0x022: 0x0006 --表示pst元数据中,diskgroup所包含的disk个数
ub1[0]:                               0 ; 0x024: 0x00
ub1[1]:                               0 ; 0x025: 0x00
ub1[2]:                               0 ; 0x026: 0x00
ub1[3]:                               0 ; 0x027: 0x00
ub1[4]:                               0 ; 0x028: 0x00
ub1[5]:                               0 ; 0x029: 0x00
ub1[6]:                               0 ; 0x02a: 0x00
ub1[7]:                               0 ; 0x02b: 0x00
ub1[8]:                               0 ; 0x02c: 0x00
ub1[9]:                               0 ; 0x02d: 0x00
ub1[10]:                              0 ; 0x02e: 0x00
ub1[11]:                              0 ; 0x02f: 0x00
ub1[12]:                              0 ; 0x030: 0x00
ub1[13]:                              0 ; 0x031: 0x00
ub1[14]:                              0 ; 0x032: 0x00
ub1[15]:                              0 ; 0x033: 0x00
ub1[16]:                              0 ; 0x034: 0x00
ub1[17]:                              0 ; 0x035: 0x00
ub1[18]:                              0 ; 0x036: 0x00

磁盘伙伴
磁盘的Partnership是在normal或者high冗余的磁盘组上,在两个磁盘之间有一个“对称”的关系。在external冗余中,不存在disk partnership。

小结
PST(Partnership and Status Table)包含一个磁盘组里所有磁盘的相关信息 — 磁盘号,磁盘状态,partner磁盘号,心跳信息和failgroup信息(11g之后)。每个ASM磁盘的第二AU(AU 1)被保留给PST使用,但是只有部分磁盘有PST数据。由于PST是重要的ASM元数据,只要故障磁盘组个数足够,在normal冗余中将会有三副本,在high冗余中将会有五副本。

Oracle ASM Disk Partner

ASM的数据冗余机制是通过将extent的镜像副本复制到同一磁盘组不同failgroup的磁盘上来实现的,这个磁盘被称为partner磁盘。在11GR2版本,一个冗余(Normal,High)的磁盘组,每一个ASM磁盘最多可以拥有8个partner磁盘,而在11GR2版本之前每一个磁盘最多拥有10个partner。在external冗余方式的磁盘组内既没有failgroup,磁盘之间也没有partner关系。其实可以通过隐含参数_asm_partner_target_disk_part来调整partner的数量。

如果正常冗余磁盘组有两个磁盘,他们就互为伙伴。磁盘0中的每个区的镜像会存储在磁盘1中,并且磁盘1中的每个区的镜像会存储在磁盘0中。因此每个磁盘都有一个伙伴磁盘。对于有3个磁盘的正常冗余磁盘组,如果在创建时没有手动指定故障磁盘组,那么每个磁盘将有两个伙伴磁盘。磁盘0的伙伴为磁盘1与磁盘2,磁盘1的伙伴为磁盘0与磁盘2,磁盘2的伙伴为磁盘0与磁盘1.当一个区存储在磁盘0上时,它的镜像副本将会存储在磁盘1或磁盘2上,但不是在磁盘1与磁盘2上都存在镜像副本。对于正常冗余磁盘,每个区有两个副本而不是三个。类似的,磁盘1上的一个区,它的镜像副本可能存储在磁盘0或磁盘2上,磁盘2上的一个区,它的镜像副本可能存储在磁盘0或磁盘1。对于存储元数据的区来说,如果故障磁盘组的数量大于三,那么在正常冗余磁盘组上会有三份副本。如果正常冗余磁盘组有大量磁盘,每个磁盘将有8个伙伴磁盘。这意味着任何磁盘上的一个区将会有一个镜像副本存储在它的8个伙伴磁盘中的一个磁盘上。对于正常冗余磁盘组来说,任何一个区只有一个镜像副本存储在它的一个伙伴磁盘上。

对于由3个磁盘所创建的high冗余磁盘组,每个磁盘将有两个伙伴磁盘。磁盘0的伙伴为磁盘1与磁盘2,磁盘1的伙伴为磁盘0与磁盘2,磁盘2的伙伴为磁盘0与磁盘1。磁盘0上的每个区的镜像将会存储磁盘1与磁盘2上。磁盘1上的每个区的镜像将会存储磁盘0与磁盘2上。

可以查询x$kfdpartner来找出关于磁盘伙伴关系的更多信息。

SQL> SELECT count(disk_number)
FROM v$asm_disk
WHERE group_number = 1;

COUNT(DISK_NUMBER)
------------------
               14

查询结果显示磁盘组内包含的磁盘数量着实不少,接下来看单个磁盘拥有多少个partner

SQL> SELECT disk "Disk", count(number_kfdpartner) "Number of partners"
FROM x$kfdpartner
WHERE grp=1
GROUP BY disk
ORDER BY 1;

      Disk Number of partners
---------- ------------------
         0                  8
         1                  8
         2                  8
         3                  8
         4                  8
         5                  8
         6                  8
         7                  8
         8                  8
         9                  8
        10                  8
        11                  8
        12                  8
        13                  8
        14                  8

14 rows selected.

查询结果显示单个磁盘都准确的拥有8个partner磁盘

SQL> set pages 1000
SQL> break on Group# on Disk#
SQL> SELECT d.group_number "Group#", d.disk_number "Disk#", p.number_kfdpartner "Partner disk#"
FROM x$kfdpartner p, v$asm_disk d
WHERE p.disk=d.disk_number and p.grp=d.group_number
ORDER BY 1, 2, 3;

    Group#      Disk# Partner disk#
---------- ---------- -------------
         1          0            1
                                 3
                                 5
                                 6
                                 7
                                 9
                                 11
                                 14
                    1            2
                                 3
                                 4
                                 5
                                 6
                                 8
                                 12
                                 13

....

partner关系是在创建磁盘组时由ASM自动分配的,在每次添加和删除磁盘操作时会自动更新。磁盘之间的partner关系信息是记录在磁盘的partner关系状态表即PST表和磁盘目录中,这两项都是重要的ASM元数据结构。

SQL> select disk_number, name, path from v$asm_disk_stat where group_number = (select group_number from v$asm_diskgroup_stat where name='DATADG') order by disk_number asc;

DISK_NUMBER NAME                           PATH
----------- ------------------------------ ------------------------------
          0 DATADG_0001                    /dev/raw/raw11
          1 DATADG_0003                    /dev/raw/raw4
          2 DATADG_0002                    /dev/raw/raw3
          3 DATADG_0000                    /dev/raw/raw10

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=1 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           17 ; 0x002: KFBTYP_PST_META
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                     256 ; 0x004: blk=256
kfbh.block.obj:              2147483648 ; 0x008: disk=0
kfbh.check:                   465161100 ; 0x00c: 0x1bb9cb8c
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdpHdrPairBv1.first.super.time.hi:33042831 ; 0x000: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfdpHdrPairBv1.first.super.time.lo:2457171968 ; 0x004: USEC=0x0 MSEC=0x15e SECS=0x27 MINS=0x24
kfdpHdrPairBv1.first.super.last:      2 ; 0x008: 0x00000002
kfdpHdrPairBv1.first.super.next:      2 ; 0x00c: 0x00000002
kfdpHdrPairBv1.first.super.copyCnt:   3 ; 0x010: 0x03
kfdpHdrPairBv1.first.super.version:   1 ; 0x011: 0x01
kfdpHdrPairBv1.first.super.ub2spare:  0 ; 0x012: 0x0000
kfdpHdrPairBv1.first.super.incarn:    1 ; 0x014: 0x00000001
kfdpHdrPairBv1.first.super.copy[0]:   0 ; 0x018: 0x0000
kfdpHdrPairBv1.first.super.copy[1]:   1 ; 0x01a: 0x0001
kfdpHdrPairBv1.first.super.copy[2]:   2 ; 0x01c: 0x0002
kfdpHdrPairBv1.first.super.copy[3]:   0 ; 0x01e: 0x0000
kfdpHdrPairBv1.first.super.copy[4]:   0 ; 0x020: 0x0000
kfdpHdrPairBv1.first.super.dtaSz:     4 ; 0x022: 0x0004
kfdpHdrPairBv1.first.asmCompat:186646528 ; 0x024: 0x0b200000
kfdpHdrPairBv1.first.newCopy[0]:      0 ; 0x028: 0x0000
kfdpHdrPairBv1.first.newCopy[1]:      0 ; 0x02a: 0x0000
kfdpHdrPairBv1.first.newCopy[2]:      0 ; 0x02c: 0x0000
kfdpHdrPairBv1.first.newCopy[3]:      0 ; 0x02e: 0x0000
kfdpHdrPairBv1.first.newCopy[4]:      0 ; 0x030: 0x0000
kfdpHdrPairBv1.first.newCopyCnt:      0 ; 0x032: 0x00
kfdpHdrPairBv1.first.contType:        1 ; 0x033: 0x01
kfdpHdrPairBv1.first.spare0:          0 ; 0x034: 0x00000000
kfdpHdrPairBv1.first.ppat[0]:         0 ; 0x038: 0x0000
kfdpHdrPairBv1.first.ppat[1]:         0 ; 0x03a: 0x0000
kfdpHdrPairBv1.first.ppat[2]:         0 ; 0x03c: 0x0000
kfdpHdrPairBv1.first.ppat[3]:         0 ; 0x03e: 0x0000
kfdpHdrPairBv1.first.ppatsz:          0 ; 0x040: 0x00
kfdpHdrPairBv1.first.spare1:          0 ; 0x041: 0x00
kfdpHdrPairBv1.first.spare2:          0 ; 0x042: 0x0000
kfdpHdrPairBv1.first.spares[0]:       0 ; 0x044: 0x00000000
kfdpHdrPairBv1.first.spares[1]:       0 ; 0x048: 0x00000000
kfdpHdrPairBv1.first.spares[2]:       0 ; 0x04c: 0x00000000

信息kfdpHdrPairBv1.first.super.copyCnt: 3 ; 0x010: 0x03说明存在3个PST副本,说明在磁盘0,1和2上有pst的副本(kfdpHdrPairBv1.first.super.copy

[0],kfdpHdrPairBv1.first.super.copy[1]和kfdpHdrPairBv1.first.super.copy[2]处有值)

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=1 blkn=3 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 18 ; 0x002: KFBTYP_PST_DTA
kfbh.datfmt: 2 ; 0x003: 0x02
kfbh.block.blk: 259 ; 0x004: blk=259
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 2182382336 ; 0x00c: 0x82148300
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdpDtaEv1[0].status: 127 ; 0x000: I=1 V=1 V=1 P=1 P=1 A=1 D=1
kfdpDtaEv1[0].fgNum: 1 ; 0x002: 0x0001
kfdpDtaEv1[0].addTs: 2199451943 ; 0x004: 0x8318f927
kfdpDtaEv1[0].partner[0]: 49154 ; 0x008: P=1 P=1 PART=0x2
kfdpDtaEv1[0].partner[1]: 49153 ; 0x00a: P=1 P=1 PART=0x1
kfdpDtaEv1[0].partner[2]: 49155 ; 0x00c: P=1 P=1 PART=0x3

以上输出代表磁盘0(kfdpDtaEv1[0])所在failgroup号为1,它有3个partner磁盘,分别为PART=0x2,PART=0x1,PART=0x3,也就是磁盘号2(/dev/raw/raw3),1(/dev/raw/raw4),3

(/dev/raw/raw10)

Oracle ASM Free Space Table

在进行创建文件或者文件resize过程中,需要有一个快捷入口,可以迅速的知道当前磁盘有哪些可用的(free状态的)AU,ASM Free Space Table 简称FST表就是提供一个这样的功能,通过它可以快速的知道哪些allocation table(AT表)元数据块中有空闲的AU,它存储的是一个个的AT表元数据块的号码,FST指示了那个AT表可能包含可用的AUs。当一个磁盘被选择用来分配AU时,ASM会咨询磁盘的FST。这允许ASM跳过那些被占用殆尽的AT块。FST对于分配是一种最佳方法。FST存储在每个AT中的第二个块中。FST表和AT表都被称为物理元数据,它们经常位于ASM磁盘的固定的位置。

FST存储位置
FST存储在ASM磁盘头,通过kfed工具可以查看磁盘头信息,其中kfdhdb.fstlocn的值代表了FST位于磁盘头的第几个块(AU)。例如下面的输出代表了,FST块位于磁盘头的块1,也就是AU 0的第二个块。(块从0开始编号)。不管是10g还是11g,FST存储在每个AT中的第二个块中。
10g ASM中的PST所在位置

[oracle@jyrac3 lib]$ kfed read /dev/raw/raw3 aun=0 blkn=0 | grep fstlocn
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001

11g ASM中的PST所在位置

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=0 | grep fstlocn
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
[grid@db1 disks]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=0 blkn=1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            2 ; 0x002: KFBTYP_FREESPC
kfbh.datfmt:                          2 ; 0x003: 0x02
kfbh.block.blk:                       1 ; 0x004: blk=1
kfbh.block.obj:              2147483651 ; 0x008: disk=3
kfbh.check:                  4111437318 ; 0x00c: 0xf50f8e06
kfbh.fcn.base:                     3323 ; 0x010: 0x00000cfb
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdfsb.aunum:                         0 ; 0x000: 0x00000000
kfdfsb.max:                         254 ; 0x004: 0x00fe
kfdfsb.cnt:                          12 ; 0x006: 0x000c
kfdfsb.bound:                         0 ; 0x008: 0x0000
kfdfsb.flag:                          1 ; 0x00a: B=1
kfdfsb.ub1spare:                      0 ; 0x00b: 0x00
kfdfsb.spare[0]:                      0 ; 0x00c: 0x00000000
kfdfsb.spare[1]:                      0 ; 0x010: 0x00000000
kfdfsb.spare[2]:                      0 ; 0x014: 0x00000000
kfdfse[0].fse:                        0 ; 0x018: FREE=0x0 FRAG=0x0
kfdfse[1].fse:                        0 ; 0x019: FREE=0x0 FRAG=0x0
kfdfse[2].fse:                        0 ; 0x01a: FREE=0x0 FRAG=0x0
kfdfse[3].fse:                      119 ; 0x01b: FREE=0x7 FRAG=0x7
kfdfse[4].fse:                       16 ; 0x01c: FREE=0x0 FRAG=0x1
kfdfse[5].fse:                       16 ; 0x01d: FREE=0x0 FRAG=0x1
kfdfse[6].fse:                       16 ; 0x01e: FREE=0x0 FRAG=0x1
kfdfse[7].fse:                       16 ; 0x01f: FREE=0x0 FRAG=0x1
kfdfse[8].fse:                       16 ; 0x020: FREE=0x0 FRAG=0x1
kfdfse[9].fse:                       16 ; 0x021: FREE=0x0 FRAG=0x1
kfdfse[10].fse:                      16 ; 0x022: FREE=0x0 FRAG=0x1
kfdfse[11].fse:                      16 ; 0x023: FREE=0x0 FRAG=0x1
kfdfse[12].fse:                       0 ; 0x024: FREE=0x0 FRAG=0x0
kfdfse[13].fse:                       0 ; 0x025: FREE=0x0 FRAG=0x0
kfdfse[14].fse:                       0 ; 0x026: FREE=0x0 FRAG=0x0
kfdfse[15].fse:                       0 ; 0x027: FREE=0x0 FRAG=0x0
kfdfse[16].fse:                       0 ; 0x028: FREE=0x0 FRAG=0x0
kfdfse[17].fse:                       0 ; 0x029: FREE=0x0 FRAG=0x0
kfdfse[18].fse:                       0 ; 0x02a: FREE=0x0 FRAG=0x0
kfdfse[19].fse:                       0 ; 0x02b: FREE=0x0 FRAG=0x0
kfdfse[20].fse:                       0 ; 0x02c: FREE=0x0 FRAG=0x0
kfdfse[21].fse:                       0 ; 0x02d: FREE=0x0 FRAG=0x0
kfdfse[22].fse:                       0 ; 0x02e: FREE=0x0 FRAG=0x0
kfdfse[23].fse:                       0 ; 0x02f: FREE=0x0 FRAG=0x0
....省略....
kfdfse[4031].fse:                     0 ; 0xfd7: FREE=0x0 FRAG=0x0
kfdfse[4032].fse:                     0 ; 0xfd8: FREE=0x0 FRAG=0x0
kfdfse[4033].fse:                     0 ; 0xfd9: FREE=0x0 FRAG=0x0
kfdfse[4034].fse:                     0 ; 0xfda: FREE=0x0 FRAG=0x0
kfdfse[4035].fse:                     0 ; 0xfdb: FREE=0x0 FRAG=0x0
kfdfse[4036].fse:                     0 ; 0xfdc: FREE=0x0 FRAG=0x0
kfdfse[4037].fse:                     0 ; 0xfdd: FREE=0x0 FRAG=0x0
kfdfse[4038].fse:                     0 ; 0xfde: FREE=0x0 FRAG=0x0
kfdfse[4039].fse:                     0 ; 0xfdf: FREE=0x0 FRAG=0x0

对于这个FST块,第一个AT表元数据块位于AU0:

kfdfsb.aunum:                         0 ; 0x000: 0x00000000

这个FST块最大数量的FST条目可以达到254个,虽然上面kfed的输出中kfdfse[i]的编号到了4039,也就是有4039+1=4040个条目,但是有效条目只有254个。

kfdfsb.max:                         254 ; 0x004: 0x00fe

大的ASM磁盘可能会有超过一个stride,ASM磁盘头的kfdhdb.mfact显示了stride的大小(单位为AU),每一个stride有它自己的物理元数据,这意味着会有它自己的FST表。第二个stride的物理元数据位于这个stride的第一个AU,我们通过kfed工具看一下:

$ kfed read /dev/sdc1 | grep mfact
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80

以上显示了stride的大小为113792个AU,由于AU是从0开始编号,因此第一个stride最后的AU号是AU 113791,我们可以推算出第二个stride的FST位置是,AU 113792的第一个块:

[grid@db1 disks]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=113792 blkn=1 | grep type
kfbh.type:                            2 ; 0x002: KFBTYP_FREESPC

如预期,我们在AU 113792上有另一个FTS表,如果我们还有其他的stride,同样会在stride的开始AU处有FST表。如下面所示,一个大的ASM磁盘,会有数个stride,这里展示了在第3到5个stride的开始处的FST表:

[grid@db1 disks]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=227584 blkn=1 | grep type
kfbh.type:                            2 ; 0x002: KFBTYP_FREESPC
[grid@db1 disks]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=341376 blkn=1 | grep type
kfbh.type:                            2 ; 0x002: KFBTYP_FREESPC
[grid@db1 disks]$ kfed read /dev/oracleasm/disks/RLZY_DATA1 aun=455168 blkn=1 | grep type
kfbh.type:                            2 ; 0x002: KFBTYP_FREESPC

参考
Oracle Automatic Storage Management: Under-the-Hood & Practical Deployment Guide
http://asmsupportguy.blogspot.jp/2013/08/free-space-table.html

Oracle ASM Disk Header

ASM Disk Header
每个ASM磁盘有一个disk header。disk header它标识了磁盘属于ASM磁盘,disk header占用了每个磁盘的第一个allocation unit(AU 0)中的第一个块(block 0)。disk header条目包括以下内容:
1.disk name
2.disk number
3.diskgroup name
4.failure group name
5.disk size
6.allocation unit(AU) size
7.creation time
8.mount time
9.ASM compatibility
10.RDBMS compatibility
11.file directory pointer
12.ASMLIB reserved block

这些内容从它们的名字就可以知道其作用。如果在特定的磁盘组中有两个磁盘都要使用相同的磁盘名称与磁盘号,那么在mount磁盘组时mount time与creation time被用来决定选择正确的磁盘。这种情况可能出现在一个磁盘临时出现故障而向磁盘组中添加另一块磁盘。

ASM compatibility指示mount磁盘组的ASM实例的最小软件版本。Oracle 10g软件总是使用10.1。录compatible.asm属性被推进到11.1后,ASM将在PST中存储版本号,但也会更新磁盘组中的disk headers来确保Oracle 10g软件将不能访问不兼容的磁盘组。

RDBMS compatibility指示RDBMS实例访问磁盘组兼容性参数的最小设置。这个值在disk header中将总是10.1。Oracle 10g软件从不更新这个值,并且如果compatible.asm设置为11.1或更高,Oracle 11g软件将对于RDBMS compatibility询问属性目录。

如果磁盘包含文件目录,那么file directory pointer描述了文件目录的第一个区所在位置。对于引导虚拟ASM元数据这个指针是需要的。

ASMLIB供应商可以在disk header中的ASMLIB保留块中存储达32 bytes的信息。Oracle的ASMLIB在这里存储了磁盘的ASMLIB名称。

因为disk header是磁盘特定的,在另一磁盘上对它进行镜像没有意义。磁盘目录包含了与disk header相同的信息。执行alter diskgroup … check命令可以验证磁盘目录与disk header的一致性

ASM磁盘是以AU为单位进行格式化的,部分AU会存放ASM元数据,其他AU存放数据库中的相关数据(如数据文件、备份文件、归档文件等等)。包含ASM元数据的AU会以元数据块的方式进行格式化(一个元数据块的大小为4K)。AU0位于ASM磁盘的起始位置,它始终用于存储ASM元数据。AU0的第一个块,即block 0,就是ASM的磁盘头。ASM 磁盘头的大部分内容仅与本磁盘相关,但也有部分信息与整个磁盘组相关,有些甚至于与整个cluster相关。

在10g中查询会得到如下结果

SQL> SELECT number_kffxp file#, disk_kffxp disk#,COUNT(disk_kffxp) extents FROM x$kffxp WHERE group_kffxp=1 AND disk_kffxp <>65534 GROUP BY number_kffxp, disk_kffxp;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         1          0          1
         1          1          1
         2          0          1
         2          1          1
         3          0          6
         3          1          6
         4          0          1
         4          1          1
         5          0          1
         5          1          1
         6          0          1
         6          1          1
       256          0         29
       256          1         29
       257          0         35
       257          1         35
       258          0          3
       258          1          3
       259          0          1
       259          1          1
       260          0          1
       260          1          1
       261          0          4
       261          1          4
       262          0          4
       262          1          4
       263          0          2
       263          1          2
       264          0          7
       264          1          7
       265          0          4
       265          1          4
       266          0          4
       266          1          4
       267          0          4
       267          1          4
       268          0          1
       268          1          1
       269          0          7
       269          1          7
       270          0          1
       270          1          1

42 rows selected.

上述查询的file信息,对于10g版本中asm所涉及的元数据信息,对应关系如下:

file#   1   ---ASM file 1,file directory
file#   2   ---ASM file 2,disk directory
file#   3   ---ASM file 3,active Change Directory(ACD)
file#   4   ---ASM file 4,continuing Operations Directory (COD)
file#   5   ---ASM file 5,template directory
file#   6   ---ASM file 6,alias directory

File Directory
文件目录包含与ASM文件相关的所有元数据。目录对于每个ASM文件都有一个条目并且通过文件号来进行索引。文件目录在每个磁盘组中都是文件号1(F1)。

文件目录包含以下内容:

.Incarnation number
.File size
.File block size
.File type
.Redundancy(none,normal,or high)
.Striping(coarse or fine-grained)
.File creation time
.File modification time(the time that the file was last opened for writing))
.File layout

如果一个文件被删除,对于新创建的文件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,文件布局受条带与冗余的影响。

Disk Directory
磁盘目录包含磁于磁盘组中所有磁盘的信息。磁盘目录信息比PST更详细。磁盘组中的每块磁盘通过磁盘号在磁盘目录索引中有一个条目。这个磁盘目录在每个磁盘组中的文件号为2(F2)
Disk Directory条目包含以下内容:

.Disk name
.Failure group name
.Disk size
.Disk free space
.Disk creation time

在磁盘目录中的许多信息在磁盘头中也可用。执行alter diskgroup … check可以验证关于磁盘这些结构的详细信息。
磁盘目录当磁盘组被mount时总是可用状态,因此对于正常或高级冗余磁盘组中的脱机磁盘也能提供信息。

Active Change Directory(ACD)

ACD是一个日志允许ASM对多个数据结构执行原子性改变。它类似于RDBMS的重做日志。每个实例将得到一个大小为42MB的ACD大块。每个大块的第一个块包含打开/关闭的状态与检查点。检查点每3秒更新一次。剩下的块被作为ACD改变记录的循环缓存区。ACD为了适应亲的ASM实例并根据需要动态增长。ASM使用ACD来执行崩溃恢复与实例恢复来确保ASM元数据的一致性。ACD在每个磁盘组中的文件号为3(F3)。

Continuing Operations Directory(COD)
COD用来跟踪长时间执行的磁盘组操作,比如文件创建与rebalance操作。长时间执行操作不适用于ACD。COD条目允许ASM在执行长时间操作期间从故障状态恢复。对于实例,ASM可以回滚没有完成的文件创建操作。RDBMS故障或用户操作可能导致这样的情况。对于磁盘的rebalance操作,如果实例执行rebalance失败,ASM可以在正常节点上重启rebalance或者当磁盘组再次在单实例ASM中mount时重启rebalance。COD在每个磁盘组中的文件号为4(F4)。

Template Directory
Template Directory包含关于磁盘组所有文件模板的信息。创建磁盘组时对于每种支持的文件类型将使用缺省的系统模板进行填充。如果用户创建自己的模板将会增加新的条目。模板目录通过模板号进行索引。
每种模板条目包含以下内容:

.Template name
.File redundancy
.File striping policy
.System flag

Template Directory在每个磁盘组中的文件号为5(F5)。缺省模板的模板名与文件类型相关。文件冗余默认为磁盘组冗余。文件条带默认是文件类型特定。system flag被设置为系统模板。用户创建的模板不会设置system flag。

Alias Directory
Alias Directory包含所有别名元数据以及每种系统别名,系统目录,用户目录与用户别名。通过别名号进行索引。
别名目录条目包含以下信息:

.Alias name(or directory name)
.Alias incarnation number
.File number
.File incarnation number
.Parent directory
.System flag

Alias Directory在每个磁盘组中的文件号为6(F6)。Alias incarnation number,很像file incarnation number,被用来区分可能重复使用相同别名号的别名或目录。system flag被设置给系统创建的别名与目录,但不对用户创建的别名或目录进行设置。

在11gr2中执行以下查询得到如下结果:

SQL> SELECT number_kffxp file#, disk_kffxp disk#,COUNT(disk_kffxp) extents FROM x$kffxp WHERE group_kffxp=3 AND disk_kffxp <>65534 GROUP BY number_kffxp, disk_kffxp;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         1          0          1
         1          1          2
         1          2          2
         1          3          1
         2          0          1
         2          1          1
         2          2          1
         3          0         64
         3          1         63
         3          2         64
         3          3         64
         4          0          6
         4          1          5
         4          2          6
         4          3          7
         5          0          1
         5          1          1
         5          3          1
         6          1          1
         6          2          1
         6          3          1
         8          0          1
         8          1          1
         8          2          1
         9          1          1
         9          2          1
         9          3          1
       256          0          1
       256          1          1
       257          0         19
       257          1         19
       257          2         19
       257          3         18
       258          0        611
       258          1        612
       258          2        611
       258          3        611
       259          0        382
       259          1        381
       259          2        381
       259          3        381
       260          0        175
       260          1        174
       260          2        174
       260          3        174
       261          0         77
       261          1         75
       261          2         76
       261          3         77
       262          0         52
       262          1         51
       262          2         51
       262          3         51
       263          0          3
       263          1          2
       263          2          4
       263          3          3
       264          0         25
       264          1         26
       264          2         27
       264          3         27
       265          0         27
       265          1         25
       265          2         26
       265          3         27
       266          0         26
       266          1         26
       266          2         26
       266          3         27
       267          0         27
       267          1         26
       267          2         24
       267          3         28
       268          0         11
       268          1         10
       268          2         10
       268          3         11
       269          1          1
       269          2          1
       270          0         52
       270          1         51
       270          2         50
       270          3         52

83 rows selected.

可以看到,file 1到9都是元数据信息。前面的file 1到 6与10g中的对应一样,后面的file 7,file 8,file 9为以下内容:

file# 7 —volume directory (使用ACFS才会有)
file# 8 —disk Used Space Directory (USD)
file# 9 —attributes directory

volume directory
ASM元信息7号文件,是ASM的逻辑卷目录,用于跟踪与ADVM有关的文件。
ASM动态逻辑卷设备是由ASM动态逻辑卷构建的。一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备。ASM集群文件系统通过ADVM接口构建在ASM磁盘组之上。ADVM像数据库一样,也是ASM的一个客户端。当一个逻辑卷被访问时,相应的ASM文件会被打开并且ASM extent的信息会被发送到ADVM驱动。

disk Used Space Directory (USD)
ASM元信息8号文件是磁盘空间使用目录Used Space Directory,简称USD,它记录了每个ASM磁盘组中每个磁盘的每个zone上被使用的AU数。一个磁盘的zone包含hot zone-热区(磁盘外圈)和cold zone-冷区(磁盘内圈)。USD目录为每个磁盘提供了一个条目,条目信息记录了2个zone(COLD和HOT)的AU使用数。USD结构是在11.2版本中引入的,并且与智能数据存放特性有关。USD元数据文件在ASM兼容性参数设置为11.2以上时会存在。

attributes directory
Attributes Directory包含了关于磁盘组属性的元数据。只有当compatible.asm设置为11.1或更高版本时目录才会在磁盘组中存在。Attribute Directory在磁盘组中的文件号为9(F9)(文件号7与8被保留给将来的功能使用,在11g中file 7为volume directory,file 8为disk Used Space Directory (USD))。AU_SIZE属性为了引导实际存储在disk header中。如果compatible.asm

设置为11.1或更高版本那么compatible.asm将会存储在PST中,否则compatible.asm将会被存储在disk header中。在Oracle 11gr1中,compatible.rdbms与disk_repair_time以及compatible.asm被存储在属性目录中。将来的版本将支持额外的属性。

这里将使用kfed工具来查看asm disk header的内容,对于10g首先需要统计kfed工具,如下:

[root@jyrac3 ~]# su - oracle
[oracle@jyrac3 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@jyrac3 lib]$ make -f ins_rdbms.mk ikfed

Linking KFED utility (kfed)
rm -f /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed
gcc -o /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed -L/u01/app/oracle/product/10.2.0/db/rdbms/lib/ -L/u01/app/oracle/product/10.2.0/db/lib/ -

L/u01/app/oracle/product/10.2.0/db/lib/stubs/ -L/usr/lib -lirc  /u01/app/oracle/product/10.2.0/db/lib/s0main.o /u01/app/oracle/product/10.2.0/db/rdbms/lib/sskfeded.o 

/u01/app/oracle/product/10.2.0/db/rdbms/lib/skfedpt.o  /u01/app/oracle/product/10.2.0/db/rdbms/lib/defopt.o -ldbtools10 -lclntsh  `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10 -lmm 

-lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10   -

lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10  -lvsn10 -

lcommon10 -lgeneric10 -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10   `cat 

/u01/app/oracle/product/10.2.0/db/lib/sysliblist` -Wl,-rpath,/u01/app/oracle/product/10.2.0/db/lib -lm    `cat /u01/app/oracle/product/10.2.0/db/lib/sysliblist` -ldl 

-lm   -L/u01/app/oracle/product/10.2.0/db/lib
mv -f /u01/app/oracle/product/10.2.0/db/bin/kfed /u01/app/oracle/product/10.2.0/db/bin/kfedO
mv /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed /u01/app/oracle/product/10.2.0/db/bin/kfed
chmod 751 /u01/app/oracle/product/10.2.0/db/bin/kfed
[oracle@jyrac3 lib]$ which kfed
/u01/app/oracle/product/10.2.0/db/bin/kfed
[oracle@jyrac3 lib]$ cd /u01/app/oracle/product/10.2.0/db/bin/kfed
-bash: cd: /u01/app/oracle/product/10.2.0/db/bin/kfed: Not a directory
[oracle@jyrac3 lib]$ kfed -h
as/mlib         ASM Library [asmlib='lib']
aun/um          AU number to examine or update [AUNUM=number]
aus/z           Allocation Unit size in bytes [AUSZ=number]
blkn/um         Block number to examine or update [BLKNUM=number]
blks/z          Metadata block size in bytes [BLKSZ=number]
ch/ksum         Update checksum before each write [CHKSUM=YES/NO]
cn/t            Count of AUs to process [CNT=number]
d/ev            ASM device to examine or update [DEV=string]
o/p             KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT]
p/rovnm         Name for provisioning purposes [PROVNM=string]
s/eek           AU number to seek to [SEEK=number]
te/xt           File name for translated block text [TEXT=string]
ty/pe           ASM metadata block type number [TYPE=number]

11gR2版本中的kfed工具,你会发现其更为强大了,还具有修复功能,在11gR2中你可以直接使用kfed修复disk header block,如下(11gR2中是不需要编译即可使用的)

[grid@jyrac1 ~]$ kfed -h
as/mlib         ASM Library [asmlib='lib']
aun/um          AU number to examine or update [AUNUM=number]
aus/z           Allocation Unit size in bytes [AUSZ=number]
blkn/um         Block number to examine or update [BLKNUM=number]
blks/z          Metadata block size in bytes [BLKSZ=number]
ch/ksum         Update checksum before each write [CHKSUM=YES/NO]
cn/t            Count of AUs to process [CNT=number]
de/v            ASM device to examine or update [DEV=string]
dm/pall         Don't suppress repeated lines when dumping corrupt blocks [DMPALL=YES/NO]
o/p             KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT]
p/rovnm         Name for provisioning purposes [PROVNM=string]
s/eek           AU number to seek to [SEEK=number]
te/xt           File name for translated block text [TEXT=string]
ty/pe           ASM metadata block type number [TYPE=number]

下面使用kfed来查看ASM磁盘头的内容:
10g操作如下:
查询磁盘组相关磁盘信息

SQL> select group_number,disk_number,name,path,redundancy from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           REDUNDANCY
------------ ----------- ------------------------------ ------------------------------ --------------
           0           1                                /dev/raw/raw1                  UNKNOWN
           0           5                                /dev/raw/raw2                  UNKNOWN
           1           1 DATADG_0001                    /dev/raw/raw4                  UNKNOWN
           2           0 YBDG_0000                      /dev/raw/raw5                  UNKNOWN
           2           1 YBDG_0001                      /dev/raw/raw6                  UNKNOWN
           1           0 DATADG_0000                    /dev/raw/raw3                  UNKNOWN

6 rows selected.

查询磁盘组相关信息,可以看到ASM磁盘组的块大小为4096 byte,也就是4K,AU大小为16777216 byte,也就是16M

SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE
------------ ------------------------------ ---------- --------------------
           1 DATADG                               4096             16777216
           2 YBDG                                 4096             16777216

磁盘组1为DATADG用来存储数据库相关文件,它包含两块磁盘/dev/raw/raw3与/dev/raw/raw4,磁盘头存储在AU0的第一个块,即block 0

[oracle@jyrac3 lib]$ kfed read /dev/raw/raw3 aun=0 blkn=0
kfbh.endian:                          1 ; 0x000: 0x01   --01即使1 表示的是Little Endian 相反,0的话即使表示BIG endian
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD --表示块类型为磁盘头
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: T=0 NUMB=0x0    --表示ASM块号,0表示ASM磁盘头块
kfbh.block.obj:              2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check:                  2110140068 ; 0x00c: 0x7dc62ea4
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr:         ORCLDISK ; 0x000: length=8    --ASMLIB磁盘是ORCLDISK+磁盘名,非ASMLIB磁盘是ORCLDISK
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:                168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000        --ASM磁盘编号
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL --磁盘组冗余方式为正常冗余
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER --磁盘header 状态  3是可用状态
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11     --ASM磁盘名
kfdhdb.grpname:                  DATADG ; 0x048: length=6      --ASM磁盘组名
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11     --ASM故障组名
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000      --ASM元数据块大小,单位是byte,大小为4K
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000  --au单位大小,单位是byte,大小为16M
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140  --该disk的大小,单位是au,由于au是16m,所以大小为5G
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001  --指针指向ASM的空闲空间表,1代表本AU中的ASM块1
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002  --指针指向ASM的分配表,2代表本AU中的ASM块2
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002  --指针指向ASM的文件目录,2代表本ASM磁盘的AU2
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 --最小的数据库兼容版本,0x0a100000=10.1
kfdhdb.grpstmp.hi:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
kfdhdb.ub4spare[0]:                   0 ; 0x0ec: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x0f0: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x0f4: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x114: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x118: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x120: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[54]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[55]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[56]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[57]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

上述kfed命令的输出结果显示这个asm块有两种类型的数据 以kfbh为前缀的块头信息和以kfdhdb为前缀的ASM磁盘头信息。实际上,每个ASM元数据块都会有块头信息和与块类型相匹配的一些相关数据。

disk header中重要的ASM元数据
kfbh.endian–系统字序,0表示大字序,1表示小字序
kfbh.type–ASM块类型,kfbtyp_diskhead表示这是一个ASM磁盘头类型块
kfbh.block.blk–ASM块号,0表示ASM磁盘头块的块编号

disk header中重要的ASM磁盘头数据
kfdhdb.driver.provstr–ASMLIB磁盘是ORCLDISK+磁盘名,非ASMLIB磁盘是ORCLDISK
kfdhdb.dsknum–ASM磁盘编号
kfdhdb.grptyp–磁盘冗余级别,KFDGTP_EXTERNAL代表external级别,KFDGTP_NORMAL代表normal级别,KFDGTP_HIGH代表high级别
kfdhdb.hdrsts–ASM磁盘头状态。v$ASM_DISK.HEADER_STATUS视图内包含的所有可能的状态
kfdhdb.dskname–ASM磁盘名
kfdhdb.grpname–ASM磁盘组名
kfdhdb.fgname –ASM故障组名
kfdhdb.crestmp.hi–磁盘添加到磁盘组的时间指示年,月,日,小时
kfdhdb.crestmp.lo–磁盘添加到磁盘组的时间指示分,秒,毫秒,微秒
kfdhdb.mntstmp.hi–磁盘最近一次被mount的时间指示年,月,日,小时
kfdhdb.mntstmp.lo–磁盘最近一次被mount的时间指示分,秒,毫秒,微秒
kfdhdb.secsize–磁盘的扇区大小(bytes)
kfdhdb.blksize–ASM元数据块的大小(bytes)
kfdhdb.ausize–Allocation unit分配单元大小(byte),默认的AU大小为1MB,我这里的AU为16MB
kfdhdb.dsksize–磁盘大小(以au为单位)。本例中的磁盘大小为AU*dsksize=16M*320=5GB
kfdhdb.fstlocn–指针指向ASM的空闲空间表,1代表本AU中的ASM块1
kfdhdb.altlocn–指针指向ASM的分配表,2代表本AU中的ASM块2
kfdhdb.f1b1locn–指针指向ASM的文件目录,2代表本ASM磁盘的AU2
kfdhdb.dbcompat–最小的数据库兼容版本,0x0a100000=10.1
kfdhdb.grpstmp.hi–指针指向ASM磁盘组创建的时间指示年,月,日,小时
kfdhdb.grpstmp.lo–指针指向ASM磁盘组创建的时间指示分,秒,毫秒,微秒

对于11G还增加了以下内容
kfdhdb.vfstart– Clusterware voting磁盘AU分配单元的开始AU编号。如果为0,表示磁盘不包含 voting磁盘数据。本特性只限于11.2或更高版本
kfdhdb.vfend — Clusterware voting磁盘AU分配单元的结束AU编号。如果为0,表示磁盘不包含 voting磁盘数据。本特性只限于11.2或更高版本
kfdhdb.spfile–ASM spfile参数文件的AU号。本特性限于11.2或更高版本
kfdhdb.spfflg–ASM spfile参数文件标识。如果这个值是1,ASM spfile参数文件则位于本磁盘的kfdhdb.spfile参数的AU。本特性限于11.2或更高版本

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=0
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:              2147483651 ; 0x008: disk=3
kfbh.check:                  3693686874 ; 0x00c: 0xdc29305a
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
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:                        3 ; 0x024: 0x0003
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042831 ; 0x0a8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:           2456905728 ; 0x0ac: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfdhdb.mntstmp.hi:             33042897 ; 0x0b0: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:            144833536 ; 0x0b4: USEC=0x0 MSEC=0x7f SECS=0xa MINS=0x2
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize:                    5120 ; 0x0c4: 0x00001400
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn:                      0 ; 0x0d4: 0x00000000
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:             33042831 ; 0x0e4: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:           2456264704 ; 0x0e8: USEC=0x0 MSEC=0x1e8 SECS=0x26 MINS=0x24
kfdhdb.vfstart:                       0 ; 0x0ec: 0x00000000
kfdhdb.vfend:                         0 ; 0x0f0: 0x00000000
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[0]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x114: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x118: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x120: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

ASM disk header的备份
ASM从10.2.0.5版本开始,磁盘头块的信息会自动备份到AU1的倒数第二个ASM元数据块中。知道AU的块大小和ASM元数据块的大小后,就能找到倒数第二个块的块编号。通过kfed工具可以从块头中读取到这些信息,并计算出AU1的倒数第二个块的块编号。

可以执行以下方法来进行计算第二个AU的倒数据第二个块的块编号

ausize=`kfed read /dev/disk | grep ausize | tr -s ' ' | cut -d' ' -f2`
blksize=`kfed read /dev/disk| grep blksize | tr -s ' ' | cut -d' ' -f2`
let n=$ausize/$blksize-2
echo $n

(ausize/blsize)-2

可以执行以下方法来进行计算第二个AU的倒数据第二个块所对应的整体块编号

(ausize/blsize)*2-2

例如在10.2.0.5计算第二个AU的倒数据第二个块的块编号的操作如下:

[oracle@jyrac3 ~]$ ausize=`kfed read /dev/raw/raw3 | grep ausize | tr -s ' ' | cut -d' ' -f2`
[oracle@jyrac3 ~]$ blksize=`kfed read /dev/raw/raw3 | grep blksize | tr -s ' ' | cut -d' ' -f2`
[oracle@jyrac3 ~]$ let n=$ausize/$blksize-2
[oracle@jyrac3 ~]$ echo $n
4094

SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE
------------ ------------------------------ ---------- --------------------
           1 DATADG                               4096             16777216
           2 YBDG                                 4096             16777216

SQL> select 16777216/4096-2 from dual;

16777216/4096-2
---------------
           4094

例如在10.2.0.5进行计算第二个AU的倒数据第二个块所对应的整体块编号

SQL> select (16777216/4096)*2-2 from dual; 

(16777216/4096)*2-2
-------------------
               8190

其实计算第二个AU的倒数据第二个块所对应的整体块编号还可以跟踪kfed repair命令来查看它所读取的块号

[oracle@jyrac3 ~]$ strace -o trace_raw3 kfed repair /dev/raw/raw3 ausz=16777216
[oracle@jyrac3 ~]$ cat trace_raw3 
....省略....
open("/dev/raw/raw3", O_RDWR|O_LARGEFILE) = 5
_llseek(5, 33546240, [33546240], SEEK_SET) = 0
read(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
_llseek(5, 0, [0], SEEK_SET)            = 0
read(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
_llseek(5, 0, [0], SEEK_SET)            = 0
write(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
close(5)                                = 0
munmap(0x476000, 143360)                = 0
munmap(0x2bd000, 143360)                = 0
exit_group(0)                           = ?

从上面的4096可知每次读取4096 byte也就是4K,而从_llseek(5, 33546240, [33546240], SEEK_SET) = 0可以计算出来所在的块号=33546240/4096=8190,8190也就是磁盘头备份信息所对应的整体块号
下面查看10.2.0.5的磁盘头备份信息

[oracle@jyrac3 ~]$ kfed read /dev/raw/raw3  aun=1 blkn=4094 aus=16777216
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: T=0 NUMB=0x0
kfbh.block.obj:              2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check:                  2110140068 ; 0x00c: 0x7dc62ea4
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
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:                168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140
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:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
kfdhdb.ub4spare[0]:                   0 ; 0x0ec: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x0f0: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x0f4: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x114: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x118: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x120: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[54]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[55]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[56]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[57]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

能够看到与AU0的元数据块0相同的内容。当磁盘头被破坏或者丢失时,这个备份将是非常有用的。只需要运行kfed repair [磁盘名]命令即可修复,如果AU大小不是默认的1MB,还需要指定AU大小的具体值。 所上面的命令指定了aus参数

使用第二个AU的倒数据第二个块所对应的整体块编号来查看备份的磁盘头信息

[oracle@jyrac3 ~]$ kfed read /dev/raw/raw3  blkn=8190
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: T=0 NUMB=0x0
kfbh.block.obj:              2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check:                  2110140068 ; 0x00c: 0x7dc62ea4
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
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:                168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140
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:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
kfdhdb.ub4spare[0]:                   0 ; 0x0ec: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x0f0: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x0f4: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x114: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x118: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x120: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[54]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[55]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[56]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[57]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

能够看到与AU0的元数据块0相同的内容。

例如在11g计算第二个AU的倒数据第二个块的块编号的操作如下:

[grid@jyrac1 ~]$ ausize=`kfed read /dev/raw/raw10 | grep ausize | tr -s ' ' | cut -d' ' -f2`
[grid@jyrac1 ~]$ blksize=`kfed read /dev/raw/raw10 | grep blksize | tr -s ' ' | cut -d' ' -f2`
[grid@jyrac1 ~]$ let n=$ausize/$blksize-2
[grid@jyrac1 ~]$ echo $n
254

SQL> set long 400
SQL> set linesize 400
SQL> col name for a30
SQL> col path for a30
SQL> select group_number,disk_number,name,path,redundancy from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           REDUNDANCY
------------ ----------- ------------------------------ ------------------------------ --------------
           3           0 DATADG_0001                    /dev/raw/raw11                 UNKNOWN
           4           0 DATA_NRML_0000                 /dev/raw/raw5                  UNKNOWN
           3           3 DATADG_0000                    /dev/raw/raw10                 UNKNOWN
           1           1 ARCHDG_0001                    /dev/raw/raw9                  UNKNOWN
           4           3 DATA_NRML_0003                 /dev/raw/raw12                 UNKNOWN
           4           2 DATA_NRML_0002                 /dev/raw/raw7                  UNKNOWN
           2           1 CRSDG_0001                     /dev/raw/raw8                  UNKNOWN
           4           1 DATA_NRML_0001                 /dev/raw/raw6                  UNKNOWN
           1           0 ARCHDG_0000                    /dev/raw/raw2                  UNKNOWN
           3           1 DATADG_0003                    /dev/raw/raw4                  UNKNOWN
           4           4 DATA_NRML_0004                 /dev/raw/raw13                 UNKNOWN
           3           2 DATADG_0002                    /dev/raw/raw3                  UNKNOWN
           2           0 CRSDG_0000                     /dev/raw/raw1                  UNKNOWN
           4           5 DATA_NRML_0005                 /dev/raw/raw14                 UNKNOWN

14 rows selected.

SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE
------------ ------------------------------ ---------- --------------------
           1 ARCHDG                               4096              1048576
           2 CRSDG                                4096              1048576
           3 DATADG                               4096              1048576
           4 DATA_NRML                            4096              1048576

SQL> select 1048576/4096-2 from dual;

1048576/4096-2
--------------
           254

例如在11g进行计算第二个AU的倒数据第二个块所对应的整体块编号

SQL> select (1048576/4096)*2-2 from dual;

(1048576/4096)*2-2
------------------
               510

对于默认的磁盘组,AU Size=1M ,每个AU中可以存储256个块,块号为0-255 。第1个AU存储256个块,第2个AU最后1个块号为255,倒数第2个块号是254,也就是整体的第510个块(从第1个AU的第1个块往后算起)。

使用bbed查看asm disk header
首先使用dd命令将disk header导出

[oracle@jyrac3 lib]$ dd if=/dev/raw/raw3 bs=4096 count=1 of=/u01/app/oracle/raw3_asm_header
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.0181451 seconds, 226 kB/s

使用bbed进行查看

[oracle@jyrac3 bin]$ ./bbed
Password: 

BBED: Release 2.0.0.0.0 - Limited Production on Tue Dec 20 20:50:58 2016

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> set filename '/u01/app/oracle/raw3_asm_header'
        FILENAME        /u01/app/oracle/raw3_asm_header
BBED> show all
        FILE#           0
        BLOCK#          1  --这里显示的是file:0,block 1
        OFFSET          0
        DBA             0x00000000 (0 0,1)
        FILENAME        /u01/app/oracle/raw3_asm_header
        BIFILE          bifile.bbd
        LISTFILE       
        BLOCKSIZE       512
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No
BBED> map /v   --查看block1里的详细信息
 File: /u01/app/oracle/raw3_asm_header (0)
 Block: 1                                     Dba:0x00000000
------------------------------------------------------------
 Undo Segment Header

 struct kcbh, 20 bytes                      @0  --kcbh 的结构占用了20个bytes,@表示该信息在block里的偏移量,即offset值     
    ub1 type_kcbh                           @0       
    ub1 frmt_kcbh                           @1       
    ub1 spare1_kcbh                         @2       
    ub1 spare2_kcbh                         @3       
    ub4 rdba_kcbh                           @4       
    ub4 bas_kcbh                            @8       
    ub2 wrp_kcbh                            @12      
    ub1 seq_kcbh                            @14      
    ub1 flg_kcbh                            @15      
    ub2 chkval_kcbh                         @16      
    ub2 spare3_kcbh                         @18      

 struct ktect, 44 bytes                     @20      
    ub4 ktectspare                          @20      
    word ktecttsn                           @24      
    ub4 ktectobj                            @28      
    ub4 ktectnex                            @32      
    ub2 ktecttbe                            @36      
    ub4 ktectcex                            @40      
    ub4 ktectces                            @44      
    ub4 ktectcbk                            @48      
    struct ktectxid, 8 bytes                @52      
    ub1 ktectlck                            @60      

 struct ktetb[1], 8 bytes                   @64      
    ub4 ktetbdba                            @64      
    ub4 ktetbnbk                            @68      

 struct ktuxc, 104 bytes                    @18776   
    struct ktuxcscn, 8 bytes                @18776   
    struct ktuxcuba, 8 bytes                @18784   
    sb2 ktuxcflg                            @18792   
    ub2 ktuxcseq                            @18794   
    sb2 ktuxcnfb                            @18796   
    ub4 ktuxcinc                            @18800   
    sb2 ktuxcchd                            @18804   
    sb2 ktuxcctl                            @18806   
    ub2 ktuxcmgc                            @18808   
    ub4 ktuxcopt                            @18816   
    struct ktuxcfbp[5], 60 bytes            @18820   

 struct ktuxe[255], 10200 bytes             @18880   
    ub4 ktuxexid                            @18880   
    ub4 ktuxebrb                            @18884   
    struct ktuxescn, 8 bytes                @18888   
    sb4 ktuxesta                            @18896   
    ub1 ktuxecfl                            @18897   
    sb2 ktuxeuel                            @18898   

 ub4 tailchk                                @508     
BBED> p kcbh                 --查看kcbh 结构里的具体值
struct kcbh, 20 bytes                       @0       
   ub1 type_kcbh                            @0        0x01
   ub1 frmt_kcbh                            @1        0x82
   ub1 spare1_kcbh                          @2        0x01
   ub1 spare2_kcbh                          @3        0x01
   ub4 rdba_kcbh                            @4        0x00000000
   ub4 bas_kcbh                             @8        0x80000000
   ub2 wrp_kcbh                             @12       0x2ea4
   ub1 seq_kcbh                             @14       0xc6
   ub1 flg_kcbh                             @15       0x7d (KCBHFNEW, KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x0000
   ub2 spare3_kcbh                          @18       0x0000
BBED> d /v count 4096              --dump 这个block,查看具体内容
 File: /u01/app/oracle/raw3_asm_header (0)
 Block: 1       Offsets:    0 to  511  Dba:0x00000000
-------------------------------------------------------
 01820101 00000000 00000080 a42ec67d l ...............}
 00000000 00000000 00000000 00000000 l ................
 4f52434c 4449534b 00000000 00000000 l ORCLDISK........
 00000000 00000000 00000000 00000000 l ................
 0000100a 00000203 44415441 44475f30 l ........DATADG_0
 30303000 00000000 00000000 00000000 l 000.............
 00000000 00000000 44415441 44470000 l ........DATADG..
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 44415441 44475f30 l ........DATADG_0
 30303000 00000000 00000000 00000000 l 000.............
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 5130f801 00d0b319 l ........Q0......
 6d30f801 00e85ca9 00020010 00000001 l m0....\.........
 80ee0600 40010000 02000000 01000000 l ....@...........
 02000000 02000000 00000000 00000000 l ................
 0000100a 5130f801 00549019 00000000 l ....Q0...T......
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................

 <16 bytes per line>

BBED> 

这里每行16个字节,即每块4个字节,如:01820101,这块就由01,82,01和01这4个字节组成。
1)第1个byte 01–这里是对应的kfbh.endian 01即使1 表示的是Little Endian 相反,0的话即使表示BIGendian
2)第2个byte 82–这里对应kfbh.hard
3)第3个byte 01–这里对应kfbh.type
4)第4个byte 01–这里对应的是kfbh_datfmt
5)第5~8个byte 00 00 0000—这里对应的是kfbh.block.blk
6)第9~12个byte00 08 0008—这里对应的是kfbh.block.obj
7)第13~16个byte a42ec67d—这里对应的是kfbh.check(0x7dc62ea4) 因为操作系统是Little Endian的原因显示的内容与kfed读取到的是相反的
8)第17~20个byte00000000 —这里对应的是kfbh.fcn.base
9)第21~23个byte 00000000—这里对应的是kfbh.fcn.wrap
10)第24~27个byte 00000000 —这里对应的是kfbh.spare1
11)第28~32个byte 00000000 —这里对应的是kfbh.spare2
12)第33~40个byte 4f52434c 4449534b—这里对应的是kfdhdb.driver.provstr –从上面的dump信息可以看出具体的值
13)第41~64个byte 00 00 00 00 —这里对应的是kfdhdb.driver.reserved[0] ~~kfdhdb.driver.reserved[5]
14)第65~68个byte 0000100a —这里对应的是kfdhdb.compat即使我们的oracle版本号
15)第69~70个byte 0000 —这里对应的是kfdhdb.dsknum 即使disk numer 取值范围 0~65335
16)第71个byte 02 —这里对应的是kfdhdb.grptyp 即磁盘组的冗余方式 02 表示normal冗余
下面对该值的属性做一下补充:
KFDGTP_INVALID((kfdgtp)0)– Illegal value
KFDGTP_EXTERNAL ((kfdgtp)1)– External redundancy
KFDGTP_NORMAL ((kfdgtp)2)– Normal redundancy
KFDGTP_HIGH ((kfdgtp)3)– High redundancy

17)第72个byte 03 —这里对应是kfdhdb.hdrsts即disk group的状态 03表示正常(这里非常重要)
下面对改值的熟悉做一下补充:
KFDHDR_INVALID((kfdhdr)0)–Illegal value
KFDHDR_UNKNOWN((kfdhdr)1) –Disk header block unreadable
KFDHDR_CANDIDATE((kfdhdr)2) –No OSM or OS disk header found
KFDHDR_MEMBER ((kfdhdr)3) –Normal member of the group —03 正常状态
KFDHDR_FORMER ((kfdhdr)4) –Disk dropped cleanly from group
KFDHDR_CONFLICT ((kfdhdr)5) –Header conflicts
KFDHDR_INCOMPAT ((kfdhdr)6) –Written by incompatible software
KFDHDR_PROVISIONED ((kfdhdr)7) –Disk was preparedbeforehand
18)第73~104个byte44415441 44475f30 到00000000 32个byte —这里对应的是kfdhdb.dskname 即磁盘名称 我们这里的DATADG_0000
19) 第105~~136个byte 44415441 44470000 到00000000 32个byte —这里对应的是kfdhdb.grpname 即是磁盘组名称 DATADG
20)第137~ 168个byte 也是44415441 44475f301开始 32个byte —这里对应的是kfdhdb.fgname即failgroup name DATADG_0000
21)第169~200 个byte一共32个byte —这里对应的是kfdhdb.capname 即是Capacitygroup name当然我这里没有使用
22)第201~204个byte 5130f801 一共4个byte —这里对应的是kfdhdb.crestmp.hi 即Creation timestamp high

SQL> select to_number('01f83051','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01F83051','XXXXXXXX
------------------------------
                      33042513

kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0


SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('2','xxxxxxxxxxxxxx') day,to_number('11','xxxxxxxxxxxxxx') hour from 

dual;
      YEAR      MONTH        DAY       HOUR
---------- ---------- ---------- ----------
      2016         12          2         17

23)第205~208个byte 00d0b319 一共4个byte —这里对应的是kfdhdb.crestmp.lo 即Creation timestamp low

SQL> select to_number('19b3d000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('19B3D000','XXXXXXXX
------------------------------
                     431214592

kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
SQL> select to_number('6','xxxxxxxxxxxxxx') min,to_number('1b','xxxxxxxxxxxxxx') sec,to_number('f4','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual;
       MIN        SEC         MS         US
---------- ---------- ---------- ----------
         6         27        244          0

与alert_+ASM1.log中的磁盘组创建时间相符

SQL> CREATE DISKGROUP datadg Normal REDUNDANCY  DISK '/dev/raw/raw3' SIZE 5120M ,
'/dev/raw/raw4' SIZE 5120M   

Fri Dec 02 17:06:27 CST 2016

24)第209~212个byte 6d30f801 一共4个byte —这里对应的是kfdhdb.mntstmp.hi

SQL> select to_number('01f8306d','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01F8306D','XXXXXXXX
------------------------------
                      33042541
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('3','xxxxxxxxxxxxxx') day,to_number('d','xxxxxxxxxxxxxx') hour from 

dual;
      YEAR      MONTH        DAY       HOUR
---------- ---------- ---------- ----------
      2016         12          3         13

25)第213~216个byte 00e85ca9 一共4个byte —这里对应的是kfdhdb.mntstmp.lo

SQL> select to_number('a95ce800','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('A95CE800','XXXXXXXX
------------------------------
                    2841438208

kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
SQL> select to_number('2a','xxxxxxxxxxxxxx') min,to_number('15','xxxxxxxxxxxxxx') sec,to_number('33a','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from 

dual;
       MIN        SEC         MS         US
---------- ---------- ---------- ----------
        42         21        826          0

与alert_+ASM1.log中的磁盘组mount时间相符

Sat Dec 03 13:42:21 CST 2016
NOTE: 
cache mounting group 1/0xB7D9694E (DATADG) succeeded

SUCCESS: diskgroup DATADG was mounted

26)第217~218一共2个byte 0002 —这里对应的是kfdhdb.secsize 即physical sector size of the disk

SQL> select to_number('0200','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('0200','XXXXXXXXXXXX
------------------------------
                           512
 kfdhdb.secsize:                     512 ; 0x0b8: 0x0200

27)第219~220一共2个byte 0010 —这里对应的是fdhdb.blksize即metadata blocksize asm block大小

SQL> select to_number('1000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('1000','XXXXXXXXXXXX
------------------------------
                          4096
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000

28)第221~224一共4个byte 00000001 —这里对应的是kfdhdb.ausize即AU 的大小16777216 即是16m

SQL> select to_number('01000000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01000000','XXXXXXXX
------------------------------
                      16777216
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000


29)第225~228一共4个byte 80ee0600—这里对应的是kfdhdb.mfact 即Stride between physical addresses of allocation units

SQL> select to_number('0006ee80','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('0006EE80','XXXXXXXX
------------------------------
                        454272

kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80

30)第229~232一共4个byte 40010000 —这里对应的是kfdhdb.dsksize 即0x00000140 转换为10进制后为320,即320个分配units =磁盘大小=320*16=5120M=5G

SQL> select to_number('00000140','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000140','XXXXXXXX
------------------------------
                           320
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140

31)第233~236一共4个byte 02000000—这里对应的是kfdhdb.pmcnt 这里该值是2即 Number of physically addressed allocation units

SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000002','XXXXXXXX
------------------------------
                             2
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002

32)第237~240一共4个byte 01000000 —这里对应的是kfdhdb.fstlocn即First FreeSpace table block number used to find freespace。

SQL> select to_number('00000001','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000001','XXXXXXXX
------------------------------
                             1

kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001

33)第241~244一共4个byte 02000000 —这里对应的是kfdhdb.altlocn即First Alocation table block numer used to find allocated space

SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000002','XXXXXXXX
------------------------------
                             2
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002

34)第245~248 一共4个byte 02000000 —这里对应的是kfdhdb.f1b1locn 即File Directory block 1 Allocation Unit number. Beginging for filedirectory

SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000002','XXXXXXXX
------------------------------
                             2
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002

即是第一个file directory 通常这里是2

35)第249~250一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[0]
36)第251~252一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[1]
37)第253~254一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[2]
38)第255~256一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[3]

39)第257~260一共4个byte 0000100a—这里对应的是kfdhdb.dbcompat 转换以为即为我们的数据库版本

SQL> select to_number('0a100000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('0A100000','XXXXXXXX
------------------------------
                     168820736
kfdhdb.dbcompat:              168820736 ; 0x0e0: 0x0a100000


40)第260~264一共4个byte 5130f801 —这里对应的是kfdhdb.grpstmp.hi

SQL> select to_number('01f83051','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01F83051','XXXXXXXX
------------------------------
                      33042513

kfdhdb.grpstmp.hi:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0

SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('2','xxxxxxxxxxxxxx') day,to_number('11','xxxxxxxxxxxxxx') hour from 

dual;
      YEAR      MONTH        DAY       HOUR
---------- ---------- ---------- ----------
      2016         12          2         17

41)第265~268 一共4个byte 00549019 —这里对应的是kfdhdb.grpstmp.lo

SQL> select to_number('19905400','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('19905400','XXXXXXXX
------------------------------
                     428889088

kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
SQL> select to_number('6','xxxxxxxxxxxxxx') min,to_number('19','xxxxxxxxxxxxxx') sec,to_number('15','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual;
       MIN        SEC         MS         US
---------- ---------- ---------- ----------
         6         25         21          0

WebLogic Server 11g and 12c Configure SSL

最近由于进行安全三级等保,对于web应用要启用https协议,由于修改应用代码需要一些时间,所以选择使用weblogic的ssl来暂时顶替,对Weblogic 11,12c配置SSL需要执行以下操作:
1.创建密钥存储库和证书
2.对Weblogic服务器配置SLL
3.测试通过SSL来访问weblogic

1.创建密钥存储库和证书

[root@ggfwapp1 base_domain]# keytool -genkey -alias server_cert -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -dname "CN=`hostname`,OU=Support,O=Oracle,L=Reading,ST=Berkshire,C=CN" -keypass abcdef -keystore keystore.jks -storepass abcdef -validity 3600

[root@ggfwapp1 base_domain]# keytool -selfcert -v -alias server_cert -keypass abcdef -keystore keystore.jks -storepass abcdef -storetype jks -validity 3600
New certificate (self-signed):
[
[
  Version: V3
  Subject: CN=ggfwapp1, OU=Support, O=Oracle, L=Reading, ST=Berkshire, C=CN
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 2048 bits
  modulus: 19602090623719098800636488696565132568971729399292278916627114486591858227333395742468863359051755318713390759458530012565088859559851142124513453375262901573573600161911606667875583835689988346028966122749514073743319097824833258333036879524621784635720260866218245014085664041715662535739270842819315383017303960463560367669088786552196892207222513740073834657274289777601277828585874837302630694982849059492221540794576755294558686273906935420995110081764654613750381617199683694501833519148327516410714923674297363912818905309716955901896590958012374365281839683438007996858276943741295216721069229600336393261499
  public exponent: 65537
  Validity: [From: Tue Dec 20 01:10:57 CST 2016,
               To: Thu Oct 29 01:10:57 CST 2026]
  Issuer: CN=ggfwapp1, OU=Support, O=Oracle, L=Reading, ST=Berkshire, C=CN
  SerialNumber: [    585814a1]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 09 FD 21 12 54 58 E6 45   56 C2 B4 FE 79 31 0C EC  ..!.TX.EV...y1..
0010: 35 AF E5 14 B8 94 26 39   DB 8F C6 B7 6E E5 03 7B  5.....&9....n...
0020: CF 48 5F 67 9D E6 3E C8   EA 0E 2E A6 B0 DD F6 1C  .H_g..>.........
0030: 5B E2 13 93 3D CF F4 80   B1 37 0B EE 0A 4E 2C 89  [...=....7...N,.
0040: CB 24 31 88 0F 0A 47 C9   1F 26 59 33 6C A4 6D 8C  .$1...G..&Y3l.m.
0050: A8 4A 7A 93 F7 25 21 9F   0E 61 50 34 8C 63 CF 16  .Jz..%!..aP4.c..
0060: 00 D5 E5 8F AC 2C F0 66   5C 60 1F 37 52 24 85 45  .....,.f\`.7R$.E
0070: BD CF A3 25 02 DF 92 F9   7D 15 D1 48 D7 DD AC D0  ...%.......H....
0080: 5A E1 01 AA 5A BD 99 4B   D6 1A 06 CC BB 31 DC 11  Z...Z..K.....1..
0090: 44 39 38 EC B9 56 8B 59   A6 99 34 54 60 D1 F6 79  D98..V.Y..4T`..y
00A0: C1 B5 0A 56 6A 3A 77 8F   A0 6F 5C B8 D1 D9 F7 AF  ...Vj:w..o\.....
00B0: DE AB 8B 59 FE 76 8E 61   B5 83 F4 F1 F6 04 AC C8  ...Y.v.a........
00C0: 5A B3 FE E5 6E 4E F8 21   FC 3F 0C 95 06 50 24 5B  Z...nN.!.?...P$[
00D0: 12 5E 1C D2 11 D5 C0 71   14 FE A4 73 8E 4E 15 96  .^.....q...s.N..
00E0: D6 28 95 ED 4E 1E 30 6F   AF 26 B7 03 47 25 9E 6F  .(..N.0o.&..G%.o
00F0: EA 15 0A EB 40 F6 F6 D8   DB 32 DD 64 AD 0F F5 70  ....@....2.d...p

]
[Storing keystore.jks]
[root@ggfwapp1 base_domain]# keytool -export -v -alias server_cert -file "`hostname`-rootCA.der" -keystore keystore.jks -storepass abcdef
Certificate stored in file 
[root@ggfwapp1 base_domain]# keytool -import -v -trustcacerts -alias server_cert -file "`hostname`-rootCA.der"   -keystore trust.jks -storepass abcdef
Owner: CN=ggfwapp1, OU=Support, O=Oracle, L=Reading, ST=Berkshire, C=CN
Issuer: CN=ggfwapp1, OU=Support, O=Oracle, L=Reading, ST=Berkshire, C=CN
Serial number: 585814a1
Valid from: Tue Dec 20 01:10:57 CST 2016 until: Thu Oct 29 01:10:57 CST 2026
Certificate fingerprints:
         MD5:  97:3B:58:6C:D0:22:0F:C3:8C:6E:29:99:2D:44:DB:A3
         SHA1: 3B:BA:5B:56:4D:9B:8D:3B:E8:EF:3A:D7:79:D9:B8:9C:43:30:FF:03
         Signature algorithm name: SHA1withRSA
         Version: 3
Trust this certificate? [no]:  yes
Certificate was added to keystore
[Storing trust.jks]

CN代表服务器的IP地址,注意要记录-alias,-keypass与-storepass参数,因为之后的配置需要使用
Identity Keystore: “/wls12c/user_projects/domains/base_domain/keystore.jks”
Trust Keystore: “/wls12c/user_projects/domains/base_domain/trust.jks”
Alias: server_cert
Store Password: abcdef
Key Password: abcdef
Valid for: 3600 Days (Approx 10 Years)

2.对Weblogic服务器配置SLL
2.1登录weblogic控制台

2.2选择环境->服务器并点击要配置的服务器


2.3选择密钥库

2.4选择密钥库更改选择 定制标识和定制信任(Custom Identity and Custom Trust)

输入以下信息
定制标识密匙库: keystore.jks
定制标识密钥库类型: JKS
定制标识密钥库密码短语: abcdef
确认定制标识密钥库密码短语: abcdef
定制信任密钥库: trust.jks
定制信任密钥库类型: JKS
定制信任密钥库密码短语: abcdef
确认定制信任密钥库密码短语: abcdef

2.5选择SSL页面

私有密钥别名: server_cert
私有密钥密码短语: abcdef
确认私有密钥密码短语句: abcdef

2.6点击一般信息,勾选SSL监听端口

3.测试通过SSL来访问weblogic