Oracle ASM Volume Directory

Volume Directory
从oracle 11gR2开始,引入了ACFS,其中11gR2同时又引入了ASM Dynamic Volume Manager (ADVM)去支持ACFS。在11.2的asm中,不仅仅用于存储database files,还能存储一些非结构化的数据,例如clusterware 文件、以及一些通常的二进制文件、external files和text files。逻辑卷目录的ASM文件号为7,它用于跟踪与ADVM有关的文件。ASM动态逻辑卷设备是由ASM动态逻辑卷构建的。一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备。ASM集群文件系统通过ADVM接口构建在ASM磁盘组之上。ADVM像数据库一样,也是ASM的一个客户端。当一个逻辑卷被访问时,相应的ASM文件会被打开并且ASM extent的信息会被发送到ADVM驱动。有两种与ADVM逻辑卷相关的文件类型:
.ASMVOL:逻辑卷文件,作为逻辑卷存储的容器。
.ASMVDRL:包含脏数据记录区域信息的文件;重新同步镜像数据时会用到此文件。

在未创建ADVM之前,直接查询是看不到file 7的

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=7
  6  group by number_kffxp, disk_kffxp
  7  order by 1;

no rows selected

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=7
  7  order by 1,2,3;

no rows selected

创建ADVM

为ADVM创建一个单独的磁盘组并不是必须的,但这样做确实是有意义的,通过这种方式,可以把数据库文件与ACFS文件隔离开。要创建逻辑卷,首先需要有一个磁盘组,下面创建了一个名称为acfs的磁盘组。为了能在磁盘组中创建逻辑卷,磁盘组的COMPATIBLE.ASM与COMPATIBLE.ADVM必须设置为11.2或以上,同时ADVM/ACFS驱动要被加载(在集群环境中,已经默认加载,而在单实例环境中,需要手动加载)。

单实例加载ADVM/ACFS驱动的命令如下,RAC环境不需要,因为已经默认加载

[root@jyrac1 bin]# ./acfsroot install
ACFS-9300: ADVM/ACFS distribution files found.
ACFS-9118: oracleadvm.ko driver in use - cannot unload.
ACFS-9312: Existing ADVM/ACFS installation detected.
ACFS-9118: oracleadvm.ko driver in use - cannot unload.
ACFS-9314: Removing previous ADVM/ACFS installation.
ACFS-9315: Previous ADVM/ACFS components successfully removed.
ACFS-9307: Installing requested ADVM/ACFS software.
ACFS-9308: Loading installed ADVM/ACFS drivers.
ACFS-9321: Creating udev for ADVM/ACFS.
ACFS-9323: Creating module dependencies - this may take some time.
ACFS-9154: Loading 'oracleacfs.ko' driver.
ACFS-9327: Verifying ADVM/ACFS devices.
ACFS-9156: Detecting control device '/dev/asm/.asm_ctl_spec'.
ACFS-9156: Detecting control device '/dev/ofsctl'.
ACFS-9309: ADVM/ACFS installation correctness verified.
[root@jyrac1 bin]#  ./acfsload  start
ACFS-9391: Checking for existing ADVM/ACFS installation.
ACFS-9392: Validating ADVM/ACFS installation files for operating system.
ACFS-9393: Verifying ASM Administrator setup.
ACFS-9308: Loading installed ADVM/ACFS drivers.
ACFS-9327: Verifying ADVM/ACFS devices.
ACFS-9156: Detecting control device '/dev/asm/.asm_ctl_spec'.
ACFS-9156: Detecting control device '/dev/ofsctl'.
ACFS-9322: completed
[root@jyrac1 bin]# ./acfsdriverstate version
ACFS-9325:     Driver OS kernel version = 2.6.18-8.el5(x86_64).
ACFS-9326:     Driver Oracle version = 130707.


SQL> create diskgroup acfs disk '/dev/raw/raw5','/dev/raw/raw6' attribute 'COMPATIBLE.ASM' = '11.2', 'COMPATIBLE.ADVM' = '11.2'; 

Diskgroup created.

创建advm卷组

SQL> select
  2     nvl(a.name, '[candidate]')                       disk_group_name
  3   , b.path                                           disk_file_path
  4   , b.name                                           disk_file_name
  5   , b.failgroup                                      disk_file_fail_group
  6   , b.total_mb                                       total_mb
  7   , (b.total_mb - b.free_mb)                         used_mb
  8  -- , round((1- (b.free_mb / b.total_mb))*100, 2)      pct_used
  9  from
 10      v$asm_diskgroup a,v$asm_disk b  where a.group_number(+)=b.group_number
 11  order by  1,3,2,4  ;

disk group name      path              file name            fail group           file size (mb) used size (mb)
-------------------- ----------------- -------------------- -------------------- -------------- --------------
ACFS                 /dev/raw/raw5     ACFS_0000            ACFS_0000                     5,120             53
ACFS                 /dev/raw/raw6     ACFS_0001            ACFS_0001                     5,120             53
ARCHDG               /dev/raw/raw2     ARCHDG_0000          ARCHDG_0000                   5,120          3,447
ARCHDG               /dev/raw/raw9     ARCHDG_0001          ARCHDG_0001                   5,120          3,447
CRSDG                /dev/raw/raw1     CRSDG_0000           CRSDG_0000                    5,120            215
CRSDG                /dev/raw/raw8     CRSDG_0001           CRSDG_0001                    5,120            183
DATADG               /dev/raw/raw10    DATADG_0000          DATADG_0000                   5,120          1,673
DATADG               /dev/raw/raw11    DATADG_0001          DATADG_0001                   5,120          1,670
DATADG               /dev/raw/raw3     DATADG_0002          DATADG_0002                   5,120          1,666
DATADG               /dev/raw/raw4     DATADG_0003          DATADG_0003                   5,120          1,666
[candidate]          /dev/raw/raw12                                                           0              0
[candidate]          /dev/raw/raw13                                                           0              0
[candidate]          /dev/raw/raw14                                                           0              0
[candidate]          /dev/raw/raw7                                                            0              0

14 rows selected.

上面的查询显示ACFS磁盘中可用空间还有大约5G,那么在磁盘组ACFS中有足够的空间来创建2个2G大小的建逻辑卷

[grid@jyrac1 ~]$ asmcmd volcreate -G ACFS -s 2G ACFS_VOL1
[grid@jyrac1 ~]$ asmcmd volcreate -G ACFS -s 2G ACFS_VOL2
[grid@jyrac1 ~]$ asmcmd volinfo -a
Diskgroup Name: ACFS

         Volume Name: ACFS_VOL1
         Volume Device: /dev/asm/acfs_vol1-319
         State: ENABLED
         Size (MB): 2048
         Resize Unit (MB): 32
         Redundancy: MIRROR
         Stripe Columns: 4
         Stripe Width (K): 128
         Usage: 
         Mountpath: 

         Volume Name: ACFS_VOL2
         Volume Device: /dev/asm/acfs_vol2-319
         State: ENABLED
         Size (MB): 2048
         Resize Unit (MB): 32
         Redundancy: MIRROR
         Stripe Columns: 4
         Stripe Width (K): 128
         Usage: 
         Mountpath: 

从上面,大家可以看到,默认创建advm是必须镜像的,且其分配单元是32m,条带宽度是128k。创建完advm之后,我们再次查询试图,看能否看到asm file 7

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

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         7          0          1
         7          1          1

从查询结果可以看到在磁盘组ACFS创建ADVM之后可以查询到7号文件。

到现在,还没有相应的挂载目录与逻辑卷相关联,所以还不能使用它们。这时,我们可以先看看ADVM逻辑卷元信息,我们先从逻辑卷目录获取其所在的分配单元

SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name",d.path "disk path"
  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=4
  6  and x.number_kffxp=7
  7  order by 1,2,3;

virtual extent physical extent         au     disk # disk name                      disk path
-------------- --------------- ---------- ---------- ------------------------------ ----------------------------------------
             0               0         53          0 ACFS_0000                      /dev/raw/raw5
             0               1         53          1 ACFS_0001                      /dev/raw/raw6

上面的结果显示有一个虚拟区,并且它有两个物理区,说明7号文件Volume Directory存在镜像,逻辑卷目录分布在0号磁盘(/dev/raw/raw5)的53号AU,与1号磁盘(/dev/raw/raw6)的53号AU中。

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

[grid@jyrac1 ~]$ kfed read /dev/raw/raw5 aun=2 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:                       7 ; 0x004: blk=7
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                  3972298863 ; 0x00c: 0xecc4786f
kfbh.fcn.base:                     6805 ; 0x010: 0x00001a95
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:               33043401 ; 0x050: HOUR=0x9 DAYS=0x1e MNTH=0xc YEAR=0x7e0
kfffdb.crets.lo:             1933631488 ; 0x054: USEC=0x0 MSEC=0x38 SECS=0x34 MINS=0x1c
kfffdb.modts.hi:               33043401 ; 0x058: HOUR=0x9 DAYS=0x1e MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             1933631488 ; 0x05c: USEC=0x0 MSEC=0x38 SECS=0x34 MINS=0x1c
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:                   53 ; 0x4a0: 0x00000035
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:                  31 ; 0x4a7: 0x1f
kfffde[1].xptr.au:                   53 ; 0x4a8: 0x00000035
kfffde[1].xptr.disk:                  1 ; 0x4ac: 0x0001
kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk:                  30 ; 0x4af: 0x1e
kfffde[2].xptr.au:           4294967294 ; 0x4b0: 0xfffffffe
kfffde[2].xptr.disk:              65534 ; 0x4b4: 0xfffe
kfffde[2].xptr.flags:                 0 ; 0x4b6: L=0 E=0 D=0 S=0
kfffde[2].xptr.chk:                  42 ; 0x4b7: 0x2a

从kfffde[0].xptr.au=53,kfffde[0].xptr.disk=0与kfffde[1].xptr.au=53,kfffde[1].xptr.disk=1可以确定逻辑卷目录分布在0号磁盘(/dev/raw/raw5)的53号AU与1号磁盘(/dev/raw/raw6)的53号AU中,与上面SQL语句所查询的分布情况完全一致。

在逻辑卷设备上创建ASM集群文件系统(ACFS)

[root@jyrac1 bin]# /sbin/mkfs -t acfs /dev/asm/acfs_vol1-319
mkfs.acfs: version                   = 11.2.0.4.0
mkfs.acfs: on-disk version           = 39.0
mkfs.acfs: volume                    = /dev/asm/acfs_vol1-319
mkfs.acfs: volume size               = 2147483648
mkfs.acfs: Format complete.
[root@jyrac1 bin]# /sbin/mkfs -t acfs /dev/asm/acfs_vol2-319
mkfs.acfs: version                   = 11.2.0.4.0
mkfs.acfs: on-disk version           = 39.0
mkfs.acfs: volume                    = /dev/asm/acfs_vol2-319
mkfs.acfs: volume size               = 2147483648
mkfs.acfs: Format complete.


[root@jyrac1 bin]# mkdir /acfs1
[root@jyrac1 bin]# mkdir /acfs2

[root@jyrac1 bin]# chown -R grid:oinstall /acfs1
[root@jyrac1 bin]# chown -R grid:oinstall /acfs2

[root@jyrac1 bin]# mount -t acfs /dev/asm/acfs_vol1-319 /acfs1
[root@jyrac1 bin]# mount -t acfs /dev/asm/acfs_vol2-319 /acfs2
[root@jyrac1 bin]# mount
/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/asm/acfs_vol1-319 on /acfs1 type acfs (rw)
/dev/asm/acfs_vol2-319 on /acfs2 type acfs (rw)


[grid@jyrac1 ~]$ asmcmd volinfo -G ACFS ACFS_VOL1
Diskgroup Name: ACFS

         Volume Name: ACFS_VOL1
         Volume Device: /dev/asm/acfs_vol1-319
         State: ENABLED
         Size (MB): 2048
         Resize Unit (MB): 32
         Redundancy: MIRROR
         Stripe Columns: 4
         Stripe Width (K): 128
         Usage: ACFS
         Mountpath: /acfs1 

[grid@jyrac1 ~]$ asmcmd volinfo -G ACFS ACFS_VOL2
Diskgroup Name: ACFS

         Volume Name: ACFS_VOL2
         Volume Device: /dev/asm/acfs_vol2-319
         State: ENABLED
         Size (MB): 2048
         Resize Unit (MB): 32
         Redundancy: MIRROR
         Stripe Columns: 4
         Stripe Width (K): 128
         Usage: ACFS
         Mountpath: /acfs2 


[root@jyrac1 bin]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              35G   25G  8.4G  75% /
tmpfs                 3.9G  170M  3.8G   5% /dev/shm
/dev/asm/acfs_vol1-319
                      2.0G   43M  2.0G   3% /acfs1
/dev/asm/acfs_vol2-319
                      2.0G   43M  2.0G   3% /acfs2

使用kfed工具查看ADVM真实的元数据

[grid@jyrac1 ~]$ kfed read /dev/raw/raw5 aun=53 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           22 ; 0x002: KFBTYP_VOLUMEDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       7 ; 0x008: file=7
kfbh.check:                  1546379724 ; 0x00c: 0x5c2be1cc
kfbh.fcn.base:                     7356 ; 0x010: 0x00001cbc
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:                 1 ; 0x00c: 0x00000001
kffdnd.overfl.incarn:                 1 ; 0x010: A=1 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
kfvvde.entry.incarn:                  1 ; 0x024: A=1 NUMM=0x0
kfvvde.entry.hash:                    0 ; 0x028: 0x00000000
kfvvde.entry.refer.number:   4294967295 ; 0x02c: 0xffffffff
kfvvde.entry.refer.incarn:            0 ; 0x030: A=0 NUMM=0x0
kfvvde.volnm:           ++AVD_DG_NUMBER ; 0x034: length=15
kfvvde.usage:                           ; 0x054: length=0
kfvvde.dgname:                          ; 0x074: length=0
kfvvde.clname:                          ; 0x094: length=0
kfvvde.mountpath:                       ; 0x0b4: length=0
kfvvde.drlinit:                       0 ; 0x4b5: 0x00
kfvvde.pad1:                          0 ; 0x4b6: 0x0000
kfvvde.volfnum.number:                0 ; 0x4b8: 0x00000000
kfvvde.volfnum.incarn:                0 ; 0x4bc: 0x00000000
kfvvde.drlfnum.number:                0 ; 0x4c0: 0x00000000
kfvvde.drlfnum.incarn:                0 ; 0x4c4: 0x00000000
kfvvde.volnum:                        0 ; 0x4c8: 0x0000
kfvvde.avddgnum:                    319 ; 0x4ca: 0x013f
kfvvde.extentsz:                      0 ; 0x4cc: 0x00000000
kfvvde.volstate:                      4 ; 0x4d0: D=0 C=0 R=1
kfvvde.pad[0]:                        0 ; 0x4d1: 0x00
kfvvde.pad[1]:                        0 ; 0x4d2: 0x00
kfvvde.pad[2]:                        0 ; 0x4d3: 0x00
kfvvde.pad[3]:                        0 ; 0x4d4: 0x00
kfvvde.pad[4]:                        0 ; 0x4d5: 0x00

上面的输出信息显示了53号AU的block 0.它只包含了ADVM逻辑卷的标记(++AVD_DG_NUMBER),而真正的逻辑卷的信息其实位于1号块与之后的块中

[grid@jyrac1 ~]$ kfed read /dev/raw/raw5 aun=53 blkn=1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           22 ; 0x002: KFBTYP_VOLUMEDIR --指数据类型
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       1 ; 0x004: blk=1 --该数据所在的au block号
kfbh.block.obj:                       7 ; 0x008: file=7 --指该元数据的asm file number,advm是file 7,所以这里看到的是7
kfbh.check:                  3589956819 ; 0x00c: 0xd5fa64d3
kfbh.fcn.base:                     7697 ; 0x010: 0x00001e11
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 --分配信息,包括block的分支号和指向next freelist block的指针
kffdnd.bnode.frlist.number:  4294967295 ; 0x004: 0xffffffff
kffdnd.bnode.frlist.incarn:           0 ; 0x008: A=0 NUMM=0x0
kffdnd.overfl.number:                 2 ; 0x00c: 0x00000002 --overfl,表示指向同层级的下一个block
kffdnd.overfl.incarn:                 1 ; 0x010: A=1 NUMM=0x0
kffdnd.parent.number:        4294967295 ; 0x014: 0xffffffff
kffdnd.parent.incarn:                 0 ; 0x018: A=0 NUMM=0x0
kffdnd.fstblk.number:                 0 ; 0x01c: 0x00000000 --表示指向上一层的block
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfvvde.entry.incarn:                  1 ; 0x024: A=1 NUMM=0x0
kfvvde.entry.hash:                    0 ; 0x028: 0x00000000
kfvvde.entry.refer.number:   4294967295 ; 0x02c: 0xffffffff
kfvvde.entry.refer.incarn:            0 ; 0x030: A=0 NUMM=0x0
kfvvde.volnm:                 ACFS_VOL1 ; 0x034: length=9 --表示asm advm 卷名称
kfvvde.usage:                      ACFS ; 0x054: length=4 --advm的type类型,这里是使用的acfs
kfvvde.dgname:                          ; 0x074: length=0
kfvvde.clname:                          ; 0x094: length=0
kfvvde.mountpath:                /acfs1 ; 0x0b4: length=6 --这里表示acfs mount的路径
kfvvde.drlinit:                       1 ; 0x4b5: 0x01
kfvvde.pad1:                          0 ; 0x4b6: 0x0000
kfvvde.volfnum.number:              257 ; 0x4b8: 0x00000101 --这里表示volume file number.
kfvvde.volfnum.incarn:        931944533 ; 0x4bc: 0x378c5855
kfvvde.drlfnum.number:              256 ; 0x4c0: 0x00000100 --这里表示volume dirty region logging 信息对应的file number
kfvvde.drlfnum.incarn:        931944533 ; 0x4c4: 0x378c5855
kfvvde.volnum:                        1 ; 0x4c8: 0x0001 --这里表示对应的卷组number号,从1开始
kfvvde.avddgnum:                    319 ; 0x4ca: 0x013f
kfvvde.extentsz:                      8 ; 0x4cc: 0x00000008 --这里表示advm的extent大小,有点类似database中的extent概念。这里stripe是4,而其分配unit是32m,所以这里是64.
kfvvde.volstate:                      2 ; 0x4d0: D=0 C=1 R=0 --这里表示advm卷组状态。2应该是表示可用
kfvvde.pad[0]:                        0 ; 0x4d1: 0x00
kfvvde.pad[1]:                        0 ; 0x4d2: 0x00
kfvvde.pad[2]:                        0 ; 0x4d3: 0x00
kfvvde.pad[3]:                        0 ; 0x4d4: 0x00
kfvvde.pad[4]:                        0 ; 0x4d5: 0x00

ASM元信息7号文件block 1包含的是第一个逻辑卷的信息(kfvvde.volnm: ACFS_VOL1),并且有两个文件关联到这个逻辑卷:
.DRL脏数据记录区域文件(kfvvde.drlfnum.number: 256)
.逻辑卷文件(kfvvde.volfnum.number: 257)

[grid@jyrac1 ~]$ kfed read /dev/raw/raw5 aun=53 blkn=2 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           22 ; 0x002: KFBTYP_VOLUMEDIR --指数据类型
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       2 ; 0x004: blk=2 --该数据所在的au block号
kfbh.block.obj:                       7 ; 0x008: file=7 --指该元数据的asm file number,advm是file 7,所以这里看到的是7
kfbh.check:                   705009710 ; 0x00c: 0x2a05982e
kfbh.fcn.base:                     7699 ; 0x010: 0x00001e13
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 --分配信息,包括block的分支号和指向next freelist block的指针
kffdnd.bnode.frlist.number:  4294967295 ; 0x004: 0xffffffff
kffdnd.bnode.frlist.incarn:           0 ; 0x008: A=0 NUMM=0x0
kffdnd.overfl.number:        4294967295 ; 0x00c: 0xffffffff --overfl,表示指向同层级的下一个block
kffdnd.overfl.incarn:                 0 ; 0x010: A=0 NUMM=0x0
kffdnd.parent.number:        4294967295 ; 0x014: 0xffffffff
kffdnd.parent.incarn:                 0 ; 0x018: A=0 NUMM=0x0
kffdnd.fstblk.number:                 0 ; 0x01c: 0x00000000 --表示指向上一层的block
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfvvde.entry.incarn:                  1 ; 0x024: A=1 NUMM=0x0
kfvvde.entry.hash:                    0 ; 0x028: 0x00000000
kfvvde.entry.refer.number:   4294967295 ; 0x02c: 0xffffffff
kfvvde.entry.refer.incarn:            0 ; 0x030: A=0 NUMM=0x0
kfvvde.volnm:                 ACFS_VOL2 ; 0x034: length=9 --表示asm advm 卷名称
kfvvde.usage:                      ACFS ; 0x054: length=4 --advm的type类型,这里是使用的acfs
kfvvde.dgname:                          ; 0x074: length=0
kfvvde.clname:                          ; 0x094: length=0
kfvvde.mountpath:                /acfs2 ; 0x0b4: length=6 --这里表示acfs mount的路径
kfvvde.drlinit:                       1 ; 0x4b5: 0x01
kfvvde.pad1:                          0 ; 0x4b6: 0x0000
kfvvde.volfnum.number:              259 ; 0x4b8: 0x00000103 --这里表示volume file number.
kfvvde.volfnum.incarn:        931944539 ; 0x4bc: 0x378c585b
kfvvde.drlfnum.number:              258 ; 0x4c0: 0x00000102 --这里表示volume dirty region logging 信息对应的file number
kfvvde.drlfnum.incarn:        931944539 ; 0x4c4: 0x378c585b
kfvvde.volnum:                        2 ; 0x4c8: 0x0002 --这里表示对应的卷组number号,从1开始
kfvvde.avddgnum:                    319 ; 0x4ca: 0x013f
kfvvde.extentsz:                      8 ; 0x4cc: 0x00000008 --这里表示advm的extent大小,有点类似database中的extent概念。这里stripe是4,而其分配unit是32m,所以这里是64.
kfvvde.volstate:                      2 ; 0x4d0: D=0 C=1 R=0 --这里表示advm卷组状态。2应该是表示可用
kfvvde.pad[0]:                        0 ; 0x4d1: 0x00
kfvvde.pad[1]:                        0 ; 0x4d2: 0x00
kfvvde.pad[2]:                        0 ; 0x4d3: 0x00
kfvvde.pad[3]:                        0 ; 0x4d4: 0x00
kfvvde.pad[4]:                        0 ; 0x4d5: 0x00

ASM元信息7号文件block 2包含的是第二个逻辑卷的信息(kfvvde.volnm: ACFS_VOL2),并且有两个文件关联到这个逻辑卷:
.DRL脏数据记录区域文件(kfvvde.drlfnum.number: 258)
.逻辑卷文件(kfvvde.volfnum.number: 259)

小结:
一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备。ASM集群文件系统通过ADVM接口构建于ASM磁盘组之上。ADVM跟数据库一样,也是ASM的一个客户端。有两种与ADVM逻辑卷相关的文件类型:
.ASMVOL:逻辑卷文件,作为逻辑卷存储设备的容器
.ASMVDRL:包含脏数据记录区域信息的文件,恢复镜像数据时会用到此文件。

Oracle ASM Alias Directory

Alias Directory
别名目录的ASM文件号为6,它对磁盘组中的所有文件提供了一种层次结构的命名系统。对每个文件创建的系统文件名是基于文件类型,数据库实例与类型特定信息,比如表空间名。当文件创建时如果指定了完整路径名将会生成用户别名。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被设置给系统创建的别名与目录,但不对用户创建的别名或目录进行设置。

可以通过查询v$asm_alias视图来获得ASM别名信息。

SQL> select * from v$asm_alias where group_number=3 and file_number<>4294967295;

NAME                                     GROUP_NUMBER FILE_NUMBER FILE_INCARNATION ALIAS_INDEX ALIAS_INCARNATION PARENT_INDEX REFERENCE_INDEX ALIAS_DIRECTORY      SYSTEM_CREATED
---------------------------------------- ------------ ----------- ---------------- ----------- ----------------- ------------ --------------- -------------------- --------------------
SYSAUX.258.930413055                                3         258        930413055         106                 1     50331754        67108863 N                    Y
SYSTEM.259.930413057                                3         259        930413057         107                 1     50331754        67108863 N                    Y
EXAMPLE.260.930413057                               3         260        930413057         108                 1     50331754        67108863 N                    Y
UNDOTBS2.261.930413057                              3         261        930413057         109                 1     50331754        67108863 N                    Y
UNDOTBS1.262.930413057                              3         262        930413057         110                 1     50331754        67108863 N                    Y
USERS.263.930413057                                 3         263        930413057         111                 1     50331754        67108863 N                    Y
FILE_TRANSFER.270.930515465                         3         270        930515465         112                 1     50331754        67108863 N                    Y
test01.dbf                                          3         270        930515465         113                 1     50331754        67108863 N                    N
CS.271.931880499                                    3         271        931880499         114                 5     50331754        67108863 N                    Y
CS_STRIPE_COARSE.272.931882089                      3         272        931882089         115                 3     50331754        67108863 N                    Y
NOT_IMPORTANT.273.931882831                         3         273        931882831         116                 1     50331754        67108863 N                    Y
current.257.930412709                               3         257        930412709         159                 3     50331807        67108863 N                    Y
group_1.264.930413221                               3         264        930413221         265                 1     50331913        67108863 N                    Y
group_2.265.930413225                               3         265        930413225         266                 1     50331913        67108863 N                    Y
group_3.266.930413227                               3         266        930413227         267                 1     50331913        67108863 N                    Y
group_4.267.930413231                               3         267        930413231         268                 1     50331913        67108863 N                    Y
TEMP.268.930413239                                  3         268        930413239         318                 1     50331966        67108863 N                    Y
spfilejyrac.ora                                     3         256        930411925          60                 1     50331701        67108863 N                    N
FILE_TRANSFER_0_0.269.930515105                     3         269        930515105         583                 3     50332231        67108863 N                    Y
SPFILE.256.930411925                                3         256        930411925         530                 1     50332178        67108863 N                    Y
tts.dmp                                             3         269        930515105           2                 3     50331648        67108863 N                    N

21 rows selected.

下面查询的输出将包含目录列表,接下来文件的完整路径名列表。并且假设所有文件是使用ASM文件命名规则所创建,在特定情况下,将假设在别名中(full_path列)将会存在指定的数据库名。查询中的full_path变量引用别名。DIR列指示目录,SYS列指示是否由系统创建。

SQL> col full_path format a64
SQL> col dir format a3
SQL> col sys format a3
SQL> set pagesize 1000
SQL> set linesize 200
SQL> select concat ('+'|| gname, sys_connect_by_path (aname,'/')) full_path, dir, sys
  2   from (
  3    select g.name gname, 
  4     a.parent_index pindex, 
  5     a.name aname,
  6     a.reference_index rindex, 
  7     a.alias_directory dir, 
  8     a.system_created sys 
  9    from v$asm_alias a, v$asm_diskgroup g 
 10    where a.group_number = g.group_number and a.group_number=3)
 11   start with (mod(pindex, power(2, 24))) = 0
 12   connect by prior rindex = pindex
 13   order by dir desc, full_path asc;

FULL_PATH                                                        DIR SYS
---------------------------------------------------------------- --- ---
+DATADG/DB_UNKNOWN                                               Y   Y
+DATADG/DB_UNKNOWN/PARAMETERFILE                                 Y   Y
+DATADG/JYRAC                                                    Y   N
+DATADG/JYRAC/CONTROLFILE                                        Y   N
+DATADG/JYRAC/DATAFILE                                           Y   N
+DATADG/JYRAC/DUMPSET                                            Y   Y
+DATADG/JYRAC/ONLINELOG                                          Y   N
+DATADG/JYRAC/PARAMETERFILE                                      Y   N
+DATADG/JYRAC/TEMPFILE                                           Y   N
+DATADG/JYRAC/oradata                                            Y   N
+DATADG/JYRAC/temp_files                                         Y   N
+DATADG/DB_UNKNOWN/PARAMETERFILE/SPFILE.256.930411925            N   Y
+DATADG/JYRAC/CONTROLFILE/current.257.930412709                  N   Y
+DATADG/JYRAC/DATAFILE/CS.271.931880499                          N   Y
+DATADG/JYRAC/DATAFILE/CS_STRIPE_COARSE.272.931882089            N   Y
+DATADG/JYRAC/DATAFILE/EXAMPLE.260.930413057                     N   Y
+DATADG/JYRAC/DATAFILE/FILE_TRANSFER.270.930515465               N   Y
+DATADG/JYRAC/DATAFILE/NOT_IMPORTANT.273.931882831               N   Y
+DATADG/JYRAC/DATAFILE/SYSAUX.258.930413055                      N   Y
+DATADG/JYRAC/DATAFILE/SYSTEM.259.930413057                      N   Y
+DATADG/JYRAC/DATAFILE/UNDOTBS1.262.930413057                    N   Y
+DATADG/JYRAC/DATAFILE/UNDOTBS2.261.930413057                    N   Y
+DATADG/JYRAC/DATAFILE/USERS.263.930413057                       N   Y
+DATADG/JYRAC/DATAFILE/test01.dbf                                N   N
+DATADG/JYRAC/DUMPSET/FILE_TRANSFER_0_0.269.930515105            N   Y
+DATADG/JYRAC/ONLINELOG/group_1.264.930413221                    N   Y
+DATADG/JYRAC/ONLINELOG/group_2.265.930413225                    N   Y
+DATADG/JYRAC/ONLINELOG/group_3.266.930413227                    N   Y
+DATADG/JYRAC/ONLINELOG/group_4.267.930413231                    N   Y
+DATADG/JYRAC/TEMPFILE/TEMP.268.930413239                        N   Y
+DATADG/JYRAC/spfilejyrac.ora                                    N   N
+DATADG/tts.dmp                                                  N   N

32 rows selected.

别名目录内容其实很重要,因为如果说你需要从asm中抽取数据文件,你起码要知道数据库里面的文件名信息吧?知道了以后,你使用amdu来进行数据文件的抽取,将事半功倍。那么asm alias元数据到底在什么地方呢,如下我们来查询磁盘组3的别名AU分布情况。

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,path from v$asm_disk where group_number=3;

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

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=6
  6  group by number_kffxp, disk_kffxp
  7  order by 1;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         6          1          1
         6          2          1
         6          3          1

上面的查询显示别名目录分布在1,2,3号磁盘中,因为磁盘组DATADG是normal冗余,并且故障磁盘组有4个,所以别名目录有3份镜像,下面的查询将会返回别名目录分别存储在1,2,3号磁盘(/dev/raw/raw4,/dev/raw/raw3,/dev/raw/raw10)中的36,38,37号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=6
  7  order by 1,2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0         38          2 DATADG_0002
             0               1         37          3 DATADG_0000
             0               2         36          1 DATADG_0003

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

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=6 | 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:                       6 ; 0x004: blk=6
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                   893084381 ; 0x00c: 0x353b62dd
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:                   38 ; 0x4a0: 0x00000026
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:                  14 ; 0x4a7: 0x0e
kfffde[1].xptr.au:                   37 ; 0x4a8: 0x00000025
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:                  12 ; 0x4af: 0x0c
kfffde[2].xptr.au:                   36 ; 0x4b0: 0x00000024
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:                  15 ; 0x4b7: 0x0f
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[0].xptr.au=38,kfffde[0].xptr.disk=2,kfffde[1].xptr.au=37,kfffde[1].xptr.disk=3,kfffde[2].xptr.au=36,kfffde[2].xptr.disk=1,可知别名目录存储在1,2,3号磁盘(/dev/raw/raw4,/dev/raw/raw3,/dev/raw/raw10)中的36,38,37号AU中,而且这三个AU存储的内容相同,与之前用查询语句所获得的分布情况完全一致。

下面使用kfed工具来读取别名目录的元数据

[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=36 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           11 ; 0x002: KFBTYP_ALIASDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       6 ; 0x008: file=6
kfbh.check:                  2235498606 ; 0x00c: 0x853f006e
kfbh.fcn.base:                     3565 ; 0x010: 0x00000ded
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
kfade[0].entry.incarn:                1 ; 0x024: A=1 NUMM=0x0
kfade[0].entry.hash:         2990280982 ; 0x028: 0xb23c1116
kfade[0].entry.refer.number:          1 ; 0x02c: 0x00000001 --指向下一层的block号
kfade[0].entry.refer.incarn:          1 ; 0x030: A=1 NUMM=0x0 --entry部分内容,表示分支号,hash值和指向下一层block的指针等信息,这部分不需要过多关注
kfade[0].name:                    JYRAC ; 0x034: length=5 --表示对应的alias元数据名称
kfade[0].fnum:               4294967295 ; 0x064: 0xffffffff --对应文件号,这里为最大值,表示无意义
kfade[0].finc:               4294967295 ; 0x068: 0xffffffff --文件分支号
kfade[0].flags:                       8 ; 0x06c: U=0 S=0 S=0 U=1 F=0 --标志信息
--标志信息有以下内容
O - File is original, not snapshot
S - File is striped
S - Strict allocation policy
D - File is damaged
C - File creation is committed
I - File has empty indirect block
R - File has known at-risk value
A - The at-risk value itsefl

kfade[0].ub1spare:                    0 ; 0x06d: 0x00
kfade[0].ub2spare:                    0 ; 0x06e: 0x0000
kfade[1].entry.incarn:                1 ; 0x070: A=1 NUMM=0x0
kfade[1].entry.hash:         3585957073 ; 0x074: 0xd5bd5cd1
kfade[1].entry.refer.number:          9 ; 0x078: 0x00000009
kfade[1].entry.refer.incarn:          1 ; 0x07c: A=1 NUMM=0x0
kfade[1].name:               DB_UNKNOWN ; 0x080: length=10
kfade[1].fnum:               4294967295 ; 0x0b0: 0xffffffff
kfade[1].finc:               4294967295 ; 0x0b4: 0xffffffff
kfade[1].flags:                       4 ; 0x0b8: U=0 S=0 S=1 U=0 F=0
kfade[1].ub1spare:                    0 ; 0x0b9: 0x00
kfade[1].ub2spare:                    0 ; 0x0ba: 0x0000
kfade[2].entry.incarn:                3 ; 0x0bc: A=1 NUMM=0x1
kfade[2].entry.hash:         1585230659 ; 0x0c0: 0x5e7cb343
kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffff
kfade[2].entry.refer.incarn:          0 ; 0x0c8: A=0 NUMM=0x0
kfade[2].name:                  tts.dmp ; 0x0cc: length=7
kfade[2].fnum:                      269 ; 0x0fc: 0x0000010d
kfade[2].finc:                930515105 ; 0x100: 0x377688a1
kfade[2].flags:                      17 ; 0x104: U=1 S=0 S=0 U=0 F=1
kfade[2].ub1spare:                    0 ; 0x105: 0x00
kfade[2].ub2spare:                    0 ; 0x106: 0x0000

从kfade[0].entry.refer.number=1,说明我们需要读取1号块来查看其它文件的别名目录

[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=36 blkn=1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           11 ; 0x002: KFBTYP_ALIASDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       1 ; 0x004: blk=1
kfbh.block.obj:                       6 ; 0x008: file=6
kfbh.check:                  3120935190 ; 0x00c: 0xba05b116
kfbh.fcn.base:                     3558 ; 0x010: 0x00000de6
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:                 1 ; 0x01c: 0x00000001
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfade[0].entry.incarn:                1 ; 0x024: A=1 NUMM=0x0
kfade[0].entry.hash:          710518681 ; 0x028: 0x2a59a799
kfade[0].entry.refer.number:          2 ; 0x02c: 0x00000002 --指向下一层的block号
kfade[0].entry.refer.incarn:          1 ; 0x030: A=1 NUMM=0x0
kfade[0].name:                 DATAFILE ; 0x034: length=8   --表示对应的alias元数据名称,datafile指数据文件
kfade[0].fnum:               4294967295 ; 0x064: 0xffffffff
kfade[0].finc:               4294967295 ; 0x068: 0xffffffff
kfade[0].flags:                       8 ; 0x06c: U=0 S=0 S=0 U=1 F=0
kfade[0].ub1spare:                    0 ; 0x06d: 0x00
kfade[0].ub2spare:                    0 ; 0x06e: 0x0000
kfade[1].entry.incarn:                1 ; 0x070: A=1 NUMM=0x0
kfade[1].entry.hash:         4053320104 ; 0x074: 0xf198c1a8
kfade[1].entry.refer.number:          3 ; 0x078: 0x00000003   --指向下一层的block号
kfade[1].entry.refer.incarn:          1 ; 0x07c: A=1 NUMM=0x0
kfade[1].name:              CONTROLFILE ; 0x080: length=11    --表示对应的alias元数据名称,controlfile指控制文件
kfade[1].fnum:               4294967295 ; 0x0b0: 0xffffffff
kfade[1].finc:               4294967295 ; 0x0b4: 0xffffffff
kfade[1].flags:                       8 ; 0x0b8: U=0 S=0 S=0 U=1 F=0
kfade[1].ub1spare:                    0 ; 0x0b9: 0x00
kfade[1].ub2spare:                    0 ; 0x0ba: 0x0000
kfade[2].entry.incarn:                1 ; 0x0bc: A=1 NUMM=0x0
kfade[2].entry.hash:          873035404 ; 0x0c0: 0x3409768c
kfade[2].entry.refer.number:          4 ; 0x0c4: 0x00000004
kfade[2].entry.refer.incarn:          1 ; 0x0c8: A=1 NUMM=0x0
kfade[2].name:               temp_files ; 0x0cc: length=10   ---表示对应的alias元数据名称,temp_files指临时文件
kfade[2].fnum:               4294967295 ; 0x0fc: 0xffffffff
kfade[2].finc:               4294967295 ; 0x100: 0xffffffff
kfade[2].flags:                       8 ; 0x104: U=0 S=0 S=0 U=1 F=0
kfade[2].ub1spare:                    0 ; 0x105: 0x00
kfade[2].ub2spare:                    0 ; 0x106: 0x0000
kfade[3].entry.incarn:                1 ; 0x108: A=1 NUMM=0x0
kfade[3].entry.hash:         2803485489 ; 0x10c: 0xa719cb31
kfade[3].entry.refer.number:          5 ; 0x110: 0x00000005
kfade[3].entry.refer.incarn:          1 ; 0x114: A=1 NUMM=0x0
kfade[3].name:                ONLINELOG ; 0x118: length=9  --表示对应的alias元数据名称,onlinelog指联机重做日志
kfade[3].fnum:               4294967295 ; 0x148: 0xffffffff
kfade[3].finc:               4294967295 ; 0x14c: 0xffffffff
kfade[3].flags:                       8 ; 0x150: U=0 S=0 S=0 U=1 F=0
kfade[3].ub1spare:                    0 ; 0x151: 0x00
kfade[3].ub2spare:                    0 ; 0x152: 0x0000
kfade[4].entry.incarn:                1 ; 0x154: A=1 NUMM=0x0
kfade[4].entry.hash:         2905271101 ; 0x158: 0xad2aeb3d
kfade[4].entry.refer.number:          6 ; 0x15c: 0x00000006
kfade[4].entry.refer.incarn:          1 ; 0x160: A=1 NUMM=0x0
kfade[4].name:                 TEMPFILE ; 0x164: length=8 --表示对应的alias元数据名称,tempfile指临时文件
kfade[4].fnum:               4294967295 ; 0x194: 0xffffffff
kfade[4].finc:               4294967295 ; 0x198: 0xffffffff
kfade[4].flags:                       8 ; 0x19c: U=0 S=0 S=0 U=1 F=0
kfade[4].ub1spare:                    0 ; 0x19d: 0x00
kfade[4].ub2spare:                    0 ; 0x19e: 0x0000
kfade[5].entry.incarn:                1 ; 0x1a0: A=1 NUMM=0x0
kfade[5].entry.hash:         3261836913 ; 0x1a4: 0xc26bae71
kfade[5].entry.refer.number:          7 ; 0x1a8: 0x00000007
kfade[5].entry.refer.incarn:          1 ; 0x1ac: A=1 NUMM=0x0
kfade[5].name:            PARAMETERFILE ; 0x1b0: length=13 --表示对应的alias元数据名称,PARAMETERFILE指参数文件
kfade[5].fnum:               4294967295 ; 0x1e0: 0xffffffff
kfade[5].finc:               4294967295 ; 0x1e4: 0xffffffff
kfade[5].flags:                       8 ; 0x1e8: U=0 S=0 S=0 U=1 F=0
kfade[5].ub1spare:                    0 ; 0x1e9: 0x00
kfade[5].ub2spare:                    0 ; 0x1ea: 0x0000
kfade[6].entry.incarn:                1 ; 0x1ec: A=1 NUMM=0x0
kfade[6].entry.hash:         1858399388 ; 0x1f0: 0x6ec4ec9c
kfade[6].entry.refer.number:          8 ; 0x1f4: 0x00000008
kfade[6].entry.refer.incarn:          1 ; 0x1f8: A=1 NUMM=0x0
kfade[6].name:                  oradata ; 0x1fc: length=7 
kfade[6].fnum:               4294967295 ; 0x22c: 0xffffffff
kfade[6].finc:               4294967295 ; 0x230: 0xffffffff
kfade[6].flags:                       8 ; 0x234: U=0 S=0 S=0 U=1 F=0
kfade[6].ub1spare:                    0 ; 0x235: 0x00
kfade[6].ub2spare:                    0 ; 0x236: 0x0000
kfade[7].entry.incarn:                1 ; 0x238: A=1 NUMM=0x0
kfade[7].entry.hash:         4097001356 ; 0x23c: 0xf433478c
kfade[7].entry.refer.number: 4294967295 ; 0x240: 0xffffffff
kfade[7].entry.refer.incarn:          0 ; 0x244: A=0 NUMM=0x0
kfade[7].name:          spfilejyrac.ora ; 0x248: length=15
kfade[7].fnum:                      256 ; 0x278: 0x00000100
kfade[7].finc:                930411925 ; 0x27c: 0x3774f595
kfade[7].flags:                      17 ; 0x280: U=1 S=0 S=0 U=0 F=1
kfade[7].ub1spare:                    0 ; 0x281: 0x00
kfade[7].ub2spare:                    0 ; 0x282: 0x0000
kfade[8].entry.incarn:                1 ; 0x284: A=1 NUMM=0x0
kfade[8].entry.hash:         2514510081 ; 0x288: 0x95e06101
kfade[8].entry.refer.number:         11 ; 0x28c: 0x0000000b
kfade[8].entry.refer.incarn:          3 ; 0x290: A=1 NUMM=0x1
kfade[8].name:                  DUMPSET ; 0x294: length=7
kfade[8].fnum:               4294967295 ; 0x2c4: 0xffffffff
kfade[8].finc:               4294967295 ; 0x2c8: 0xffffffff
kfade[8].flags:                       4 ; 0x2cc: U=0 S=0 S=1 U=0 F=0
kfade[8].ub1spare:                    0 ; 0x2cd: 0x00
kfade[8].ub2spare:                    0 ; 0x2ce: 0x0000

如果要查看数据文件别名目录,根据kfade[0].entry.refer.number=2与kfade[0].name=DATAFILE,可知在2号块

[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=36 blkn=2 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           11 ; 0x002: KFBTYP_ALIASDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       2 ; 0x004: blk=2
kfbh.block.obj:                       6 ; 0x008: file=6
kfbh.check:                  2753078160 ; 0x00c: 0xa418a390
kfbh.fcn.base:                     6551 ; 0x010: 0x00001997
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:                 1 ; 0x014: 0x00000001
kffdnd.parent.incarn:                 1 ; 0x018: A=1 NUMM=0x0
kffdnd.fstblk.number:                 2 ; 0x01c: 0x00000002
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfade[0].entry.incarn:                1 ; 0x024: A=1 NUMM=0x0
kfade[0].entry.hash:         3486922491 ; 0x028: 0xcfd636fb
kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfade[0].entry.refer.incarn:          0 ; 0x030: A=0 NUMM=0x0
kfade[0].name:                   SYSAUX ; 0x034: length=6
kfade[0].fnum:                      258 ; 0x064: 0x00000102
kfade[0].finc:                930413055 ; 0x068: 0x3774f9ff
kfade[0].flags:                      18 ; 0x06c: U=0 S=1 S=0 U=0 F=1
kfade[0].ub1spare:                    0 ; 0x06d: 0x00
kfade[0].ub2spare:                    0 ; 0x06e: 0x0000
kfade[1].entry.incarn:                1 ; 0x070: A=1 NUMM=0x0
kfade[1].entry.hash:          564369944 ; 0x074: 0x21a39a18
kfade[1].entry.refer.number: 4294967295 ; 0x078: 0xffffffff
kfade[1].entry.refer.incarn:          0 ; 0x07c: A=0 NUMM=0x0
kfade[1].name:                   SYSTEM ; 0x080: length=6
kfade[1].fnum:                      259 ; 0x0b0: 0x00000103
kfade[1].finc:                930413057 ; 0x0b4: 0x3774fa01
kfade[1].flags:                      18 ; 0x0b8: U=0 S=1 S=0 U=0 F=1
kfade[1].ub1spare:                    0 ; 0x0b9: 0x00
kfade[1].ub2spare:                    0 ; 0x0ba: 0x0000
kfade[2].entry.incarn:                1 ; 0x0bc: A=1 NUMM=0x0
kfade[2].entry.hash:           75817004 ; 0x0c0: 0x0484e02c
kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffff
kfade[2].entry.refer.incarn:          0 ; 0x0c8: A=0 NUMM=0x0
kfade[2].name:                  EXAMPLE ; 0x0cc: length=7
kfade[2].fnum:                      260 ; 0x0fc: 0x00000104
kfade[2].finc:                930413057 ; 0x100: 0x3774fa01
kfade[2].flags:                      18 ; 0x104: U=0 S=1 S=0 U=0 F=1
kfade[2].ub1spare:                    0 ; 0x105: 0x00
kfade[2].ub2spare:                    0 ; 0x106: 0x0000
kfade[3].entry.incarn:                1 ; 0x108: A=1 NUMM=0x0
kfade[3].entry.hash:         3945580605 ; 0x10c: 0xeb2cc83d
kfade[3].entry.refer.number: 4294967295 ; 0x110: 0xffffffff
kfade[3].entry.refer.incarn:          0 ; 0x114: A=0 NUMM=0x0
kfade[3].name:                 UNDOTBS2 ; 0x118: length=8
kfade[3].fnum:                      261 ; 0x148: 0x00000105
kfade[3].finc:                930413057 ; 0x14c: 0x3774fa01
kfade[3].flags:                      18 ; 0x150: U=0 S=1 S=0 U=0 F=1
kfade[3].ub1spare:                    0 ; 0x151: 0x00
kfade[3].ub2spare:                    0 ; 0x152: 0x0000
kfade[4].entry.incarn:                1 ; 0x154: A=1 NUMM=0x0
kfade[4].entry.hash:         1431819651 ; 0x158: 0x5557d583
kfade[4].entry.refer.number: 4294967295 ; 0x15c: 0xffffffff
kfade[4].entry.refer.incarn:          0 ; 0x160: A=0 NUMM=0x0
kfade[4].name:                 UNDOTBS1 ; 0x164: length=8
kfade[4].fnum:                      262 ; 0x194: 0x00000106
kfade[4].finc:                930413057 ; 0x198: 0x3774fa01
kfade[4].flags:                      18 ; 0x19c: U=0 S=1 S=0 U=0 F=1
kfade[4].ub1spare:                    0 ; 0x19d: 0x00
kfade[4].ub2spare:                    0 ; 0x19e: 0x0000
kfade[5].entry.incarn:                1 ; 0x1a0: A=1 NUMM=0x0
kfade[5].entry.hash:         3705183464 ; 0x1a4: 0xdcd89ce8
kfade[5].entry.refer.number: 4294967295 ; 0x1a8: 0xffffffff
kfade[5].entry.refer.incarn:          0 ; 0x1ac: A=0 NUMM=0x0
kfade[5].name:                    USERS ; 0x1b0: length=5
kfade[5].fnum:                      263 ; 0x1e0: 0x00000107
kfade[5].finc:                930413057 ; 0x1e4: 0x3774fa01
kfade[5].flags:                      18 ; 0x1e8: U=0 S=1 S=0 U=0 F=1
kfade[5].ub1spare:                    0 ; 0x1e9: 0x00
kfade[5].ub2spare:                    0 ; 0x1ea: 0x0000
kfade[6].entry.incarn:                1 ; 0x1ec: A=1 NUMM=0x0
kfade[6].entry.hash:         1752863906 ; 0x1f0: 0x687a94a2
kfade[6].entry.refer.number: 4294967295 ; 0x1f4: 0xffffffff
kfade[6].entry.refer.incarn:          0 ; 0x1f8: A=0 NUMM=0x0
kfade[6].name:            FILE_TRANSFER ; 0x1fc: length=13
kfade[6].fnum:                      270 ; 0x22c: 0x0000010e
kfade[6].finc:                930515465 ; 0x230: 0x37768a09
kfade[6].flags:                      18 ; 0x234: U=0 S=1 S=0 U=0 F=1
kfade[6].ub1spare:                    0 ; 0x235: 0x00
kfade[6].ub2spare:                    0 ; 0x236: 0x0000
kfade[7].entry.incarn:                1 ; 0x238: A=1 NUMM=0x0
kfade[7].entry.hash:         2844469351 ; 0x23c: 0xa98b2867
kfade[7].entry.refer.number: 4294967295 ; 0x240: 0xffffffff
kfade[7].entry.refer.incarn:          0 ; 0x244: A=0 NUMM=0x0
kfade[7].name:               test01.dbf ; 0x248: length=10
kfade[7].fnum:                      270 ; 0x278: 0x0000010e
kfade[7].finc:                930515465 ; 0x27c: 0x37768a09
kfade[7].flags:                      17 ; 0x280: U=1 S=0 S=0 U=0 F=1
kfade[7].ub1spare:                    0 ; 0x281: 0x00
kfade[7].ub2spare:                    0 ; 0x282: 0x0000
kfade[8].entry.incarn:                5 ; 0x284: A=1 NUMM=0x2
kfade[8].entry.hash:         2512381731 ; 0x288: 0x95bfe723
kfade[8].entry.refer.number: 4294967295 ; 0x28c: 0xffffffff
kfade[8].entry.refer.incarn:          0 ; 0x290: A=0 NUMM=0x0
kfade[8].name:                       CS ; 0x294: length=2
kfade[8].fnum:                      271 ; 0x2c4: 0x0000010f
kfade[8].finc:                931880499 ; 0x2c8: 0x378b5e33
kfade[8].flags:                      18 ; 0x2cc: U=0 S=1 S=0 U=0 F=1
kfade[8].ub1spare:                    0 ; 0x2cd: 0x00
kfade[8].ub2spare:                    0 ; 0x2ce: 0x0000
kfade[9].entry.incarn:                3 ; 0x2d0: A=1 NUMM=0x1
kfade[9].entry.hash:         4011892030 ; 0x2d4: 0xef209d3e
kfade[9].entry.refer.number: 4294967295 ; 0x2d8: 0xffffffff
kfade[9].entry.refer.incarn:          0 ; 0x2dc: A=0 NUMM=0x0
kfade[9].name:         CS_STRIPE_COARSE ; 0x2e0: length=16
kfade[9].fnum:                      272 ; 0x310: 0x00000110
kfade[9].finc:                931882089 ; 0x314: 0x378b6469
kfade[9].flags:                      18 ; 0x318: U=0 S=1 S=0 U=0 F=1
kfade[9].ub1spare:                    0 ; 0x319: 0x00
kfade[9].ub2spare:                    0 ; 0x31a: 0x0000
kfade[10].entry.incarn:               1 ; 0x31c: A=1 NUMM=0x0
kfade[10].entry.hash:        1365029949 ; 0x320: 0x515cb43d
kfade[10].entry.refer.number:4294967295 ; 0x324: 0xffffffff
kfade[10].entry.refer.incarn:         0 ; 0x328: A=0 NUMM=0x0
kfade[10].name:           NOT_IMPORTANT ; 0x32c: length=13
kfade[10].fnum:                     273 ; 0x35c: 0x00000111
kfade[10].finc:               931882831 ; 0x360: 0x378b674f
kfade[10].flags:                     18 ; 0x364: U=0 S=1 S=0 U=0 F=1
kfade[10].ub1spare:                   0 ; 0x365: 0x00
kfade[10].ub2spare:                   0 ; 0x366: 0x0000

从上面信息,我们可以知道sysaux对应是file 258,system对应file 259,EXAMPLE对应file 260,UNDOTBS2 对应file 261等等,与视图中查询的结果完全一致。

同理,controlfile控制文件在3号块。

[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=36 blkn=3 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           11 ; 0x002: KFBTYP_ALIASDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       3 ; 0x004: blk=3
kfbh.block.obj:                       6 ; 0x008: file=6
kfbh.check:                  3091636595 ; 0x00c: 0xb846a173
kfbh.fcn.base:                      734 ; 0x010: 0x000002de
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:                 1 ; 0x014: 0x00000001
kffdnd.parent.incarn:                 1 ; 0x018: A=1 NUMM=0x0
kffdnd.fstblk.number:                 3 ; 0x01c: 0x00000003
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfade[0].entry.incarn:                3 ; 0x024: A=1 NUMM=0x1
kfade[0].entry.hash:           62930150 ; 0x028: 0x03c03ce6
kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfade[0].entry.refer.incarn:          0 ; 0x030: A=0 NUMM=0x0
kfade[0].name:                  current ; 0x034: length=7
kfade[0].fnum:                      257 ; 0x064: 0x00000101
kfade[0].finc:                930412709 ; 0x068: 0x3774f8a5
kfade[0].flags:                      18 ; 0x06c: U=0 S=1 S=0 U=0 F=1
kfade[0].ub1spare:                    0 ; 0x06d: 0x00
kfade[0].ub2spare:                    0 ; 0x06e: 0x0000
kfade[1].entry.incarn:                0 ; 0x070: A=0 NUMM=0x0
kfade[1].entry.hash:                  0 ; 0x074: 0x00000000
kfade[1].entry.refer.number:          0 ; 0x078: 0x00000000
kfade[1].entry.refer.incarn:          0 ; 0x07c: A=0 NUMM=0x0
kfade[1].name:                          ; 0x080: length=0
kfade[1].fnum:                        0 ; 0x0b0: 0x00000000
kfade[1].finc:                        0 ; 0x0b4: 0x00000000
kfade[1].flags:                       0 ; 0x0b8: U=0 S=0 S=0 U=0 F=0
kfade[1].ub1spare:                    0 ; 0x0b9: 0x00
kfade[1].ub2spare:                    0 ; 0x0ba: 0x0000
kfade[2].entry.incarn:                0 ; 0x0bc: A=0 NUMM=0x0
kfade[2].entry.hash:                  0 ; 0x0c0: 0x00000000
kfade[2].entry.refer.number:          0 ; 0x0c4: 0x00000000
kfade[2].entry.refer.incarn:          0 ; 0x0c8: A=0 NUMM=0x0

从上面信息,你可以知道目前数据库的controlfile名称为:current.257.930412709

同理,onlinelog联机重做日志在5号块

[grid@jyrac1 ~]$ kfed read /dev/raw/raw4 aun=36 blkn=5 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           11 ; 0x002: KFBTYP_ALIASDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       5 ; 0x004: blk=5
kfbh.block.obj:                       6 ; 0x008: file=6
kfbh.check:                  1209488605 ; 0x00c: 0x481754dd
kfbh.fcn.base:                     3491 ; 0x010: 0x00000da3
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:                 1 ; 0x014: 0x00000001
kffdnd.parent.incarn:                 1 ; 0x018: A=1 NUMM=0x0
kffdnd.fstblk.number:                 5 ; 0x01c: 0x00000005
kffdnd.fstblk.incarn:                 1 ; 0x020: A=1 NUMM=0x0
kfade[0].entry.incarn:                1 ; 0x024: A=1 NUMM=0x0
kfade[0].entry.hash:         2375841806 ; 0x028: 0x8d9c780e
kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfade[0].entry.refer.incarn:          0 ; 0x030: A=0 NUMM=0x0
kfade[0].name:                  group_1 ; 0x034: length=7
kfade[0].fnum:                      264 ; 0x064: 0x00000108
kfade[0].finc:                930413221 ; 0x068: 0x3774faa5
kfade[0].flags:                      18 ; 0x06c: U=0 S=1 S=0 U=0 F=1
kfade[0].ub1spare:                    0 ; 0x06d: 0x00
kfade[0].ub2spare:                    0 ; 0x06e: 0x0000
kfade[1].entry.incarn:                1 ; 0x070: A=1 NUMM=0x0
kfade[1].entry.hash:         1478106543 ; 0x074: 0x581a1daf
kfade[1].entry.refer.number: 4294967295 ; 0x078: 0xffffffff
kfade[1].entry.refer.incarn:          0 ; 0x07c: A=0 NUMM=0x0
kfade[1].name:                  group_2 ; 0x080: length=7
kfade[1].fnum:                      265 ; 0x0b0: 0x00000109
kfade[1].finc:                930413225 ; 0x0b4: 0x3774faa9
kfade[1].flags:                      18 ; 0x0b8: U=0 S=1 S=0 U=0 F=1
kfade[1].ub1spare:                    0 ; 0x0b9: 0x00
kfade[1].ub2spare:                    0 ; 0x0ba: 0x0000
kfade[2].entry.incarn:                1 ; 0x0bc: A=1 NUMM=0x0
kfade[2].entry.hash:          429163817 ; 0x0c0: 0x19948529
kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffff
kfade[2].entry.refer.incarn:          0 ; 0x0c8: A=0 NUMM=0x0
kfade[2].name:                  group_3 ; 0x0cc: length=7
kfade[2].fnum:                      266 ; 0x0fc: 0x0000010a
kfade[2].finc:                930413227 ; 0x100: 0x3774faab
kfade[2].flags:                      18 ; 0x104: U=0 S=1 S=0 U=0 F=1
kfade[2].ub1spare:                    0 ; 0x105: 0x00
kfade[2].ub2spare:                    0 ; 0x106: 0x0000
kfade[3].entry.incarn:                1 ; 0x108: A=1 NUMM=0x0
kfade[3].entry.hash:         2232040441 ; 0x10c: 0x850a3bf9
kfade[3].entry.refer.number: 4294967295 ; 0x110: 0xffffffff
kfade[3].entry.refer.incarn:          0 ; 0x114: A=0 NUMM=0x0
kfade[3].name:                  group_4 ; 0x118: length=7
kfade[3].fnum:                      267 ; 0x148: 0x0000010b
kfade[3].finc:                930413231 ; 0x14c: 0x3774faaf
kfade[3].flags:                      18 ; 0x150: U=0 S=1 S=0 U=0 F=1
kfade[3].ub1spare:                    0 ; 0x151: 0x00
kfade[3].ub2spare:                    0 ; 0x152: 0x0000

从上面信息,你可以知道目前数据库的联机重做日志文件名称为:group_1.264.930413221,group_2.265.930413225,group_3.266.930413227,group_4.267.930413231

同理,找到spfile的alias信息为:SPFILE.256.930411925,当知道数据库文件的alias名称之后,如果利用amdu从asm diskgroup中抽取某个文件,那么就很容易了,而且如果你后面需要用来恢复,甚至你连文件名都不用改,如下例子抽取上述的spfile:

[grid@jyrac1 ~]$ amdu -dis '/dev/raw/raw*' -extract datadg.256 -output spfile.256.930411925
amdu_2016_12_29_21_15_43/
AMDU-00204: Disk N0003 is in currently mounted diskgroup DATADG
AMDU-00201: Disk N0003: '/dev/raw/raw11'
AMDU-00204: Disk N0009 is in currently mounted diskgroup DATADG
AMDU-00201: Disk N0009: '/dev/raw/raw4'
AMDU-00204: Disk N0008 is in currently mounted diskgroup DATADG
AMDU-00201: Disk N0008: '/dev/raw/raw3'

[grid@jyrac1 ~]$ cat spfile.256.930411925 

jyrac1.__db_cache_size=1795162112                                                                                                                                       jyrac2.__db_cache_size=1795162112
jyrac2.__java_pool_size=16777216
jyrac1.__java_pool_size=16777216
jyrac2.__large_pool_size=33554432
jyrac1.__large_pool_size=33554432
jyrac1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
jyrac2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
jyrac2.__pga_aggregate_target=838860800
jyrac1.__pga_aggregate_target=838860800
jyrac2.__sga_target=2516582400
jyrac1.__sga_target=2516582400
jyrac2.__shared_io_pool_size=0
jyrac1.__shared_io_pool_size=0
jyrac1.__shared_pool_size=587202560
jyrac2.__shared_pool_size=637534208
jyrac2.__streams_pool_size=0
jyrac1.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/jyrac/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.control_files='+DATADG/jyrac/controlfile/current.257.930412709'
*.db_block_size=8192
*.db_create_file_dest='+DATADG'
*.db_domain=''
*.db_name='jyrac'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jyracXDB)'
jyrac1.dispatchers='(PROTOCOL=TCP) (SERVICE=jyrac1XDB)'
jyrac2.dispatchers='(PROTOCOL=TCP) (SERVICE=jyrac2XDB)'
jyrac2.instance_number=2
jyrac1.instance_number=1
*.job_queue_processes=1000
JYRAC1.listener_networks='((NAME=network1)(LOCAL_LISTENER=10.138.130.152:1521)(REMOTE_LISTENER=10.138.130.155:1521))','((NAME=network2)(LOCAL_LISTENER=10.138.130.152:1521)(REMOTE_LISTENER=10.138.130.156:1521))','((NAME=network3)(LOCAL_LISTENER=10.138.130.152:1521)(REMOTE_LISTENER=10.138.130.157:1521))'
JYRAC2.listener_networks='((NAME=network1)(LOCAL_LISTENER=10.138.130.154:1521)(REMOTE_LISTENER=10.138.130.155:1521))','((NAME=network2)(LOCAL_LISTENER=10.138.130.154:1521)(REMOTE_LISTENER=10.138.130.156:1521))','((NAME=network3)(LOCAL_LISTENER=10.138.130.154:1521)(REMOTE_LISTENER=10.138.130.157:1521))'
jyrac2.listener_networks='((NAME=network1)(LOCAL_LISTENER=10.138.130.154:1521)(REMOTE_LISTENER=10.138.130.155:1521))','((NAME=network2)(LOCAL_LISTENER=10.138.130.154:1521)(REMOTE_LISTENER=10.138.130.156:1521))','((NAME=network3)(LOCAL_LISTENER=10.138.130.154:1521)(REMOTE_LISTENER=10.138.130.157:1521))'
jyrac1.listener_networks='((NAME=network1)(LOCAL_LISTENER=10.138.130.153:1521)(REMOTE_LISTENER=10.138.130.155:1521))','((NAME=network2)(LOCAL_LISTENER=10.138.130.153:1521)(REMOTE_LISTENER=10.138.130.156:1521))','((NAME=network3)(LOCAL_LISTENER=10.138.130.153:1521)(REMOTE_LISTENER=10.138.130.157:1521))'
*.log_archive_dest_1='location=+archdg/jyrac/'
*.open_cursors=300
*.pga_aggregate_target=836763648
*.processes=150
*.remote_listener='jyrac-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sga_target=2510290944
jyrac2.thread=2
jyrac1.thread=1
jyrac1.undo_tablespace='UNDOTBS1'
jyrac2.undo_tablespace='UNDOTBS2'   

小结:
别名目录用来跟踪ASM磁盘组中的所有别名,可以通过查询v$asm_alias来查看现有文件的别名。

Oracle ASM Template Directory

Template Directory包含关于磁盘组所有文件模板的信息。有两种类型的模板:一种是系统自带的,一种是用户创建的,默认的模板(系统自带的)已经包含ASM的所有文件类型,创建磁盘组时对于每种支持的文件类型将使用缺省的系统模板进行填充。用户创建的模板只会在用户特别指定时会使用。如果用户创建自己的模板将会增加新的条目,模板目录通过模板号进行索引。

每种模板条目包含以下内容:
.每个模板的名称(对于默认模板它的名称其实就是文件类型)
.文件冗余度(默认是磁盘组的冗余度)
.文件条带(默认是根据文件类型来决定文件的条带)
.系统标识(是否为系统自带的模板)

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

通过查询视图V$ASM_TEMPLATE可查看完整的模板信息
10G:

sql> col system for a20
sql> col primary_region for a20
sql> col mirror_region for a20
sql> select * from v$asm_template where group_number=1; 

GROUP_NUMBER ENTRY_NUMBER REDUNDANCY   STRIPE       SYSTEM               NAME
------------ ------------ ------------ ------------ -------------------- ------------------------------
           1            0 MIRROR       COARSE       Y                    PARAMETERFILE
           1            1 MIRROR       COARSE       Y                    DUMPSET
           1            2 HIGH         FINE         Y                    CONTROLFILE
           1            3 MIRROR       COARSE       Y                    ARCHIVELOG
           1            4 MIRROR       FINE         Y                    ONLINELOG
           1            5 MIRROR       COARSE       Y                    DATAFILE
           1            6 MIRROR       COARSE       Y                    TEMPFILE
           1            7 MIRROR       COARSE       Y                    BACKUPSET
           1            8 MIRROR       COARSE       Y                    AUTOBACKUP
           1            9 MIRROR       COARSE       Y                    XTRANSPORT
           1           10 MIRROR       COARSE       Y                    CHANGETRACKING
           1           11 MIRROR       FINE         Y                    FLASHBACK
           1           12 MIRROR       COARSE       Y                    DATAGUARDCONFIG

13 rows selected.

11G:

sql> col system for a20
sql> col primary_region for a20
sql> col mirror_region for a20
sql> select * from v$asm_template where group_number=3;

GROUP_NUMBER ENTRY_NUMBER REDUNDANCY   STRIPE       SYSTEM               NAME                           PRIMARY_REGION       MIRROR_REGION
------------ ------------ ------------ ------------ -------------------- ------------------------------ -------------------- --------------------
           3           60 MIRROR       COARSE       Y                    PARAMETERFILE                  COLD                 COLD
           3           61 MIRROR       COARSE       Y                    ASMPARAMETERFILE               COLD                 COLD
           3           63 MIRROR       COARSE       Y                    DUMPSET                        COLD                 COLD
           3           64 HIGH         FINE         Y                    CONTROLFILE                    COLD                 COLD
           3           65 MIRROR       COARSE       Y                    FLASHFILE                      COLD                 COLD
           3           66 MIRROR       COARSE       Y                    ARCHIVELOG                     COLD                 COLD
           3           67 MIRROR       COARSE       Y                    ONLINELOG                      COLD                 COLD
           3           68 MIRROR       COARSE       Y                    DATAFILE                       COLD                 COLD
           3           69 MIRROR       COARSE       Y                    TEMPFILE                       COLD                 COLD
           3          170 MIRROR       COARSE       Y                    BACKUPSET                      COLD                 COLD
           3          171 MIRROR       COARSE       Y                    XTRANSPORT BACKUPSET           COLD                 COLD
           3          172 MIRROR       COARSE       Y                    AUTOBACKUP                     COLD                 COLD
           3          173 MIRROR       COARSE       Y                    XTRANSPORT                     COLD                 COLD
           3          174 MIRROR       COARSE       Y                    CHANGETRACKING                 COLD                 COLD
           3          175 MIRROR       COARSE       Y                    FLASHBACK                      COLD                 COLD
           3          176 MIRROR       COARSE       Y                    DATAGUARDCONFIG                COLD                 COLD
           3          177 MIRROR       COARSE       Y                    OCRFILE                        COLD                 COLD
17 rows selected.

redundancy字段所显示的mirror为存在镜像副本,high为存在三份镜像副本,unprot为不支持镜像。其中name为controlfile的控制文件redundancy为high,stripe为fine,即为控制文件存在三份镜像,并使用细粒度条带。这是默认的数据库控制文件的模板,这是为什么每一个控制文件都会被做三重镜像的原因。有意思的是,我们可以使用它创建任何的数据库文件。例如下面将使用控制文件模板来创建一个表空间的数据文件。

连接数据库的实例

SQL> create tablespace cs datafile '+DATADG(CONTROLFILE)' size 10m;

Tablespace created.



SQL> select name from v$datafile where name like '%cs%';

NAME
--------------------------------------------------------------------------------
+DATADG/jyrac/datafile/cs.271.931879611

上面创建了一个表空间,ASM给我新创建的数据文件分配了编号271。

查看该数据文件的冗余度
连接ASM实例

SQL> select group_number, name, type "redundancy" from v$asm_diskgroup where name='DATADG';

GROUP_NUMBER NAME                           redundancy
------------ ------------------------------ ------------------------------
           3 DATADG                         NORMAL

这是一个normal冗余的磁盘组,但是由于使用了控制文件模板来创建数据文件,因此通过查询内部视图 x$kffxp来获得想要的信息

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=271
  7  order by 1,2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0       1654          0 DATADG_0001
             0               1       1647          2 DATADG_0002
             0               2       1647          1 DATADG_0003
             1               3       1648          2 DATADG_0002
             1               4       1648          1 DATADG_0003
             1               5       1655          3 DATADG_0000
             2               6       1649          1 DATADG_0003
             2               7       1655          0 DATADG_0001
             2               8       1656          3 DATADG_0000
             3               9       1657          3 DATADG_0000
             3              10       1650          1 DATADG_0003
             3              11       1656          0 DATADG_0001
             4              12       1657          0 DATADG_0001
             4              13       1658          3 DATADG_0000
             4              14       1649          2 DATADG_0002
             5              15       1650          2 DATADG_0002
             5              16       1658          0 DATADG_0001
             5              17       1651          1 DATADG_0003
             6              18       1652          1 DATADG_0003
             6              19       1651          2 DATADG_0002
             6              20       1659          0 DATADG_0001
             7              21       1659          3 DATADG_0000
             7              22       1652          2 DATADG_0002
             7              23       1653          1 DATADG_0003

24 rows selected.

这个文件被做了三重镜像,因为每一个虚拟区都由三个物理区组成,但是为什么我的数据文件仅仅只有1MB,但是却有8个虚拟区呢,这是因为控制文件的模板是一个细粒度条带的模板。隐含参数_asm_stripesize代表了细粒度条带的大小,默认为128K,隐含参数_asm_stripewidth代表了条带的宽度,默认为8。但是有一点很奇怪,细粒度条带下,数据文件头好像没有独占一个extent,因为上面查询显示了这个1MB的文件一共占用了8个extent,而不是9个extent,按照条带宽度是8的设定,文件内容本身就应该占用了8个extent。
10g:

SQL> col name for a30
SQL> col value for a50
SQL> col describ for a50
SQL> select x.ksppinm NAME,y.ksppstvl value,x.ksppdesc describ
  2  from x$ksppi x, x$ksppcv y
  3  where x.inst_id=USERENV('Instance')
  4  and y.inst_id=USERENV('Instance')
  5  and x.indx=y.indx
  6  and x.ksppinm like '%asm_strip%';   

NAME                           VALUE                                              DESCRIB
------------------------------ -------------------------------------------------- --------------------------------------------------
_asm_stripewidth               8                                                  ASM file stripe width
_asm_stripesize                131072                                             ASM file stripe size

11g:

SQL> col value for a50
SQL> col describ for a50
SQL> select x.ksppinm NAME,y.ksppstvl value,x.ksppdesc describ
  2  from x$ksppi x, x$ksppcv y
  3  where x.inst_id=USERENV('Instance')
  4  and y.inst_id=USERENV('Instance')
  5  and x.indx=y.indx
  6  and x.ksppinm like '%asm_strip%';   

NAME                           VALUE                                              DESCRIB
------------------------------ -------------------------------------------------- --------------------------------------------------
_asm_stripewidth               8                                                  ASM file stripe width
_asm_stripesize                131072                                             ASM file stripe size

而stripsize * stripwidth 恰好是1m,这也正是我们的AU size大小,而1m通常也是大多数操作系统所能达到的单次最大io量。asm 的条带分为两种COARSE和FINE,也被称为粗粒度条带和细粒度条带。粗粒度条带,默认就等于你的AU size,比如我这里au size为1m,那么粗粒度条带大小就是1m,这种情况下的条带,通常实用于连续性的大IO操作,例如全表扫描。细粒度条带,默认是128k,8个条带组成一个AU,这种条带类型通常适用于对于读写延迟比较敏感的文件,比如redo logfile,controlfile。从前面10g的查询结果可以看出,其中也就redo和controlfile以及flashback是fine类型的,其他的均为粗条带,而在11g中变为只有controlfile为fine类型。

用户模板
如果想要文件具有三重镜像但是粗粒度的条带,该怎么做?可以手工创建一个我们自己的模板,COARSE关键字指定了这是一个粗粒度的条带:

连接ASM实例

SQL> alter diskgroup datadg add template cs_stripe_coarse attributes (HIGH COARSE);  

Diskgroup altered.

SQL> select * from v$asm_template where group_number=3;

GROUP_NUMBER ENTRY_NUMBER REDUNDANCY   STRIPE       SYSTEM               NAME                           PRIMARY_REGION       MIRROR_REGION
------------ ------------ ------------ ------------ -------------------- ------------------------------ -------------------- --------------------
           3           60 MIRROR       COARSE       Y                    PARAMETERFILE                  COLD                 COLD
           3           61 MIRROR       COARSE       Y                    ASMPARAMETERFILE               COLD                 COLD
           3           63 MIRROR       COARSE       Y                    DUMPSET                        COLD                 COLD
           3           64 HIGH         FINE         Y                    CONTROLFILE                    COLD                 COLD
           3           65 MIRROR       COARSE       Y                    FLASHFILE                      COLD                 COLD
           3           66 MIRROR       COARSE       Y                    ARCHIVELOG                     COLD                 COLD
           3           67 MIRROR       COARSE       Y                    ONLINELOG                      COLD                 COLD
           3           68 MIRROR       COARSE       Y                    DATAFILE                       COLD                 COLD
           3           69 MIRROR       COARSE       Y                    TEMPFILE                       COLD                 COLD
           3          170 MIRROR       COARSE       Y                    BACKUPSET                      COLD                 COLD
           3          171 MIRROR       COARSE       Y                    XTRANSPORT BACKUPSET           COLD                 COLD
           3          172 MIRROR       COARSE       Y                    AUTOBACKUP                     COLD                 COLD
           3          173 MIRROR       COARSE       Y                    XTRANSPORT                     COLD                 COLD
           3          174 MIRROR       COARSE       Y                    CHANGETRACKING                 COLD                 COLD
           3          175 MIRROR       COARSE       Y                    FLASHBACK                      COLD                 COLD
           3          176 MIRROR       COARSE       Y                    DATAGUARDCONFIG                COLD                 COLD
           3          177 MIRROR       COARSE       Y                    OCRFILE                        COLD                 COLD
           3          280 HIGH         COARSE       N                    CS_STRIPE_COARSE               COLD                 COLD

18 rows selected.

从上面name=CS_STRIPE_COARSE,stripe=COARSE可以看到创建的模板为粗粒度条带,连接数据库实例

SQL> create tablespace cs_stripe_coarse datafile '+DATADG(CS_STRIPE_COARSE)' size 1m;

Tablespace created.

SQL> select name from v$datafile where name like 'cs_stripe_coarse%';

no rows selected

SQL> select name from v$datafile where name like '%cs_stripe_coarse%';

NAME
--------------------------------------------------------------------------------
+DATADG/jyrac/datafile/cs_stripe_coarse.272.931882089

创建的数据文件的文件号为272,连接ASM实例

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=272
  7  order by 1,2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0       1664          0 DATADG_0001
             0               1       1664          3 DATADG_0000
             0               2       1659          1 DATADG_0003
             1               3       1660          2 DATADG_0002
             1               4       1665          0 DATADG_0001
             1               5       1665          3 DATADG_0000

6 rows selected.

上面的结果显示了只为1MB的文件分配了2个虚拟区, 一个是ASM的文件头,一个用于文件。注意这个文件是三重的镜像和粗粒度的条带。也可以创建一个根本不做镜像的模板,例如:

连接ASM实例

SQL> alter diskgroup datadg add template no_mirroring attributes (UNPROTECTED); 

Diskgroup altered.

SQL> select * from v$asm_template where group_number=3;

GROUP_NUMBER ENTRY_NUMBER REDUNDANCY   STRIPE       SYSTEM               NAME                           PRIMARY_REGION       MIRROR_REGION
------------ ------------ ------------ ------------ -------------------- ------------------------------ -------------------- --------------------
           3           60 MIRROR       COARSE       Y                    PARAMETERFILE                  COLD                 COLD
           3           61 MIRROR       COARSE       Y                    ASMPARAMETERFILE               COLD                 COLD
           3           63 MIRROR       COARSE       Y                    DUMPSET                        COLD                 COLD
           3           64 HIGH         FINE         Y                    CONTROLFILE                    COLD                 COLD
           3           65 MIRROR       COARSE       Y                    FLASHFILE                      COLD                 COLD
           3           66 MIRROR       COARSE       Y                    ARCHIVELOG                     COLD                 COLD
           3           67 MIRROR       COARSE       Y                    ONLINELOG                      COLD                 COLD
           3           68 MIRROR       COARSE       Y                    DATAFILE                       COLD                 COLD
           3           69 MIRROR       COARSE       Y                    TEMPFILE                       COLD                 COLD
           3          170 MIRROR       COARSE       Y                    BACKUPSET                      COLD                 COLD
           3          171 MIRROR       COARSE       Y                    XTRANSPORT BACKUPSET           COLD                 COLD
           3          172 MIRROR       COARSE       Y                    AUTOBACKUP                     COLD                 COLD
           3          173 MIRROR       COARSE       Y                    XTRANSPORT                     COLD                 COLD
           3          174 MIRROR       COARSE       Y                    CHANGETRACKING                 COLD                 COLD
           3          175 MIRROR       COARSE       Y                    FLASHBACK                      COLD                 COLD
           3          176 MIRROR       COARSE       Y                    DATAGUARDCONFIG                COLD                 COLD
           3          177 MIRROR       COARSE       Y                    OCRFILE                        COLD                 COLD
           3          280 HIGH         COARSE       N                    CS_STRIPE_COARSE               COLD                 COLD
           3          281 UNPROT       COARSE       N                    NO_MIRRORING                   COLD                 COLD

19 rows selected.

从上面name=CS_STRIPE_COARSE,redundancy=unprot可以看到创建的模板不支持镜像,连接数据库实例

SQL> create tablespace not_important datafile '+DATADG(NO_MIRRORING)' size 1m; 

Tablespace created.

SQL> select name from v$datafile where name like '%not_important%';

NAME
--------------------------------------------------------------------------------
+DATADG/jyrac/datafile/not_important.273.931882831

创建的数据文件的文件号为273,连接ASM实例

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=273
  7  order by 1,2,3;

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0       1661          2 DATADG_0002
             1               1       1660          1 DATADG_0003

上面的结果显示一个虚拟extent只有一个物理extent,所以这个文件没有被镜像(虽然它是在一个normal冗余的磁盘组中)。

小结:
模板目录包含了磁盘组中文件模板的信息,每一个磁盘组都会有默认的一系列的系统自带的模板,用户也可以额外根据需要创建自己的模板。一个比较好的使用模板的方法是在一个normal冗余的磁盘中创建一个三重镜像的模板,注意如果想要使这个做法生效,我们至少需要这个磁盘组中有3个故障磁盘组(failgroup)。

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)