Oracle ASM Disk Used Space Directory

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

通过下面的查询获取每个磁盘组中USD目录的AU分布情况

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

    group#     disk # disk name                      disk path                                virtual extent physical extent         au
---------- ---------- ------------------------------ ---------------------------------------- -------------- --------------- ----------
         1          0 ARCHDG_0000                    /dev/raw/raw2                                         0               1         51
         1          1 ARCHDG_0001                    /dev/raw/raw9                                         0               0         51
         2          1 CRSDG_0001                     /dev/raw/raw8                                         0               0         25
         3          0 DATADG_0001                    /dev/raw/raw11                                        0               0         38
         3          1 DATADG_0003                    /dev/raw/raw4                                         0               1         38
         3          2 DATADG_0002                    /dev/raw/raw3                                         0               2         40
         4          0 ACFS_0000                      /dev/raw/raw5                                         0               1         51
         4          1 ACFS_0001                      /dev/raw/raw6                                         0               0         51
         5          0 USD_0000                       /dev/raw/raw7                                         0               1         51
         5          1 USD_0001                       /dev/raw/raw12                                        0               0         51

10 rows selected.

从上面的查询结果可知3号磁盘组的磁盘空间使用目录AU有三份镜像(因为虚拟区0有3个对应的物理区),它们分别为0号磁盘(/dev/raw/raw11)的38号AU,1号磁盘(/dev/raw/raw4)的38号AU,2号磁盘(/dev/raw/raw3)的40号AU。

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

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=8 | 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:                       8 ; 0x004: blk=8
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                   960193247 ; 0x00c: 0x393b62df
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:             2460055552 ; 0x054: USEC=0x0 MSEC=0x5e SECS=0x2a MINS=0x24
kfffdb.modts.hi:               33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             2460055552 ; 0x05c: USEC=0x0 MSEC=0x5e SECS=0x2a 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:                  0 ; 0x4a4: 0x0000
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:                   38 ; 0x4a8: 0x00000026
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:                  13 ; 0x4af: 0x0d
kfffde[2].xptr.au:                   40 ; 0x4b0: 0x00000028
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:                   0 ; 0x4b7: 0x00
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[0].xptr.au=38,kfffde[0].xptr.disk=0与kfffde[1].xptr.au=38,kfffde[1].xptr.disk=1以及kfffde[2].xptr.au=40,kfffde[2].xptr.disk=2可知3号磁盘组的磁盘空间使用目录有三份镜像,它们分别为0号磁盘(/dev/raw/raw11)的38号AU,1号磁盘(/dev/raw/raw4)的38号AU,2号磁盘(/dev/raw/raw3)的40号AU。

检查所有磁盘组中每个磁盘已经使用空间的分配情况

SQL> select group_number "group#",disk_number "disk#",name "disk name",path,hot_used_mb "hot (mb)",cold_used_mb "cold (mb)"
  2  from v$asm_disk_stat
  3  order by 1,2;

    group#      disk# disk name                      PATH                             hot (mb)  cold (mb)
---------- ---------- ------------------------------ ------------------------------ ---------- ----------
         1          0 ARCHDG_0000                    /dev/raw/raw2                           0       3447
         1          1 ARCHDG_0001                    /dev/raw/raw9                           0       3447
         2          0 CRSDG_0000                     /dev/raw/raw1                           0        215
         2          1 CRSDG_0001                     /dev/raw/raw8                           0        183
         3          0 DATADG_0001                    /dev/raw/raw11                          0       1676
         3          1 DATADG_0003                    /dev/raw/raw4                           0       1672
         3          2 DATADG_0002                    /dev/raw/raw3                           0       1670
         3          3 DATADG_0000                    /dev/raw/raw10                          0       1677
         4          0 ACFS_0000                      /dev/raw/raw5                           0       4187
         4          1 ACFS_0001                      /dev/raw/raw6                           0       4187
         5          0 USD_0000                       /dev/raw/raw7                           0         53
         5          1 USD_0001                       /dev/raw/raw12                          0         53

12 rows selected.

以上结果显示每个磁盘的所有空间都被分配在了冷区中。下面使用kfed工具来查看磁盘组3的空间使用目录。

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=38 blkn=0 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                           26 ; 0x002: KFBTYP_USEDSPC
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       8 ; 0x008: file=8
kfbh.check:                    18521018 ; 0x00c: 0x011a9bba
kfbh.fcn.base:                     6591 ; 0x010: 0x000019bf
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdusde[0].used[0].spare:             0 ; 0x000: 0x00000000
kfdusde[0].used[0].hi:                0 ; 0x004: 0x00000000
kfdusde[0].used[0].lo:             1490 ; 0x008: 0x000005d2
kfdusde[0].used[1].spare:             0 ; 0x00c: 0x00000000
kfdusde[0].used[1].hi:                0 ; 0x010: 0x00000000
kfdusde[0].used[1].lo:                0 ; 0x014: 0x00000000
kfdusde[1].used[0].spare:             0 ; 0x018: 0x00000000
kfdusde[1].used[0].hi:                0 ; 0x01c: 0x00000000
kfdusde[1].used[0].lo:             1481 ; 0x020: 0x000005c9
kfdusde[1].used[1].spare:             0 ; 0x024: 0x00000000
kfdusde[1].used[1].hi:                0 ; 0x028: 0x00000000
kfdusde[1].used[1].lo:                0 ; 0x02c: 0x00000000
kfdusde[2].used[0].spare:             0 ; 0x030: 0x00000000
kfdusde[2].used[0].hi:                0 ; 0x034: 0x00000000
kfdusde[2].used[0].lo:             1476 ; 0x038: 0x000005c4
kfdusde[2].used[1].spare:             0 ; 0x03c: 0x00000000
kfdusde[2].used[1].hi:                0 ; 0x040: 0x00000000
kfdusde[2].used[1].lo:                0 ; 0x044: 0x00000000
kfdusde[3].used[0].spare:             0 ; 0x048: 0x00000000
kfdusde[3].used[0].hi:                0 ; 0x04c: 0x00000000
kfdusde[3].used[0].lo:             1491 ; 0x050: 0x000005d3
kfdusde[3].used[1].spare:             0 ; 0x054: 0x00000000
kfdusde[3].used[1].hi:                0 ; 0x058: 0x00000000
kfdusde[3].used[1].lo:                0 ; 0x05c: 0x00000000
kfdusde[4].used[0].spare:             0 ; 0x060: 0x00000000
kfdusde[4].used[0].hi:                0 ; 0x064: 0x00000000
kfdusde[4].used[0].lo:                0 ; 0x068: 0x00000000
kfdusde[4].used[1].spare:             0 ; 0x06c: 0x00000000
kfdusde[4].used[1].hi:                0 ; 0x070: 0x00000000
kfdusde[4].used[1].lo:                0 ; 0x074: 0x00000000

上面kfed工具的输出显示了ASM磁盘组一中有四块磁盘,因此只有kfdusde结构的前四个条目被占用(kfdusde[0].used[0],kfdusde[1].used[0],kfdusde[2].used[0],kfdusde[3].used[0]),而且四个条目都显示所有的已分配空间都在到了冷区中。

我们来为5号磁盘组创建一个磁盘组模板,模板中指定基于此模板创建的文件都要位于磁盘的热区

SQL> select group_number "group#",disk_number "disk#",name "disk name",path,hot_used_mb "hot (mb)",cold_used_mb "cold (mb)"
  2  from v$asm_disk_stat
  3  order by 1,2;

    group#      disk# disk name                      PATH                             hot (mb)  cold (mb)
---------- ---------- ------------------------------ ------------------------------ ---------- ----------
         1          0 ARCHDG_0000                    /dev/raw/raw2                           0       3447
         1          1 ARCHDG_0001                    /dev/raw/raw9                           0       3447
         2          0 CRSDG_0000                     /dev/raw/raw1                           0        215
         2          1 CRSDG_0001                     /dev/raw/raw8                           0        183
         3          0 DATADG_0001                    /dev/raw/raw11                          0       1676
         3          1 DATADG_0003                    /dev/raw/raw4                           0       1672
         3          2 DATADG_0002                    /dev/raw/raw3                           0       1670
         3          3 DATADG_0000                    /dev/raw/raw10                          0       1677
         4          0 ACFS_0000                      /dev/raw/raw5                           0       4187
         4          1 ACFS_0001                      /dev/raw/raw6                           0       4187
         5          0 USD_0000                       /dev/raw/raw7                           0         53
         5          1 USD_0001                       /dev/raw/raw12                          0         53

12 rows selected.

上面的结果显示5号磁盘组的的磁盘使用空间都在磁盘的冷区,两个磁盘都为53MB。

SQL> alter diskgroup usd add template hotfile attributes (HOT);

Diskgroup altered.

这个特性需要磁盘组compatible.rdbms属性设置为11.2或以上。现在创建一个datafile,并放置于热区。

SQL> create tablespace t_hot datafile '+USD(HOTFILE)' size 50M;

Tablespace created.

再次查询磁盘组的空间使用情况

SQL> select group_number "group#",disk_number "disk#",name "disk name",path,hot_used_mb "hot (mb)",cold_used_mb "cold (mb)"
  2  from v$asm_disk_stat
  3  order by 1,2;

    group#      disk# disk name                      PATH                             hot (mb)  cold (mb)
---------- ---------- ------------------------------ ------------------------------ ---------- ----------
         1          0 ARCHDG_0000                    /dev/raw/raw2                           0       3447
         1          1 ARCHDG_0001                    /dev/raw/raw9                           0       3447
         2          0 CRSDG_0000                     /dev/raw/raw1                           0        215
         2          1 CRSDG_0001                     /dev/raw/raw8                           0        183
         3          0 DATADG_0001                    /dev/raw/raw11                          0       1676
         3          1 DATADG_0003                    /dev/raw/raw4                           0       1672
         3          2 DATADG_0002                    /dev/raw/raw3                           0       1670
         3          3 DATADG_0000                    /dev/raw/raw10                          0       1677
         4          0 ACFS_0000                      /dev/raw/raw5                           0       4187
         4          1 ACFS_0001                      /dev/raw/raw6                           0       4187
         5          0 USD_0000                       /dev/raw/raw7                          26         86
         5          1 USD_0001                       /dev/raw/raw12                         25         87

12 rows selected.

以上结果显示,51MB(5号磁盘组的0号磁盘的热区26M,1号磁盘的热区25M)的空间(文件本身占用50MB,1MB用于文件头)被分配在热区,并且分布在磁盘组的所有磁盘中。

我们还可以将一个已经存在的数据文件从磁盘的冷区移到热区,创建在磁盘组USD中创建一个数据文件让其空间分配在磁盘的冷区

SQL> create tablespace t_cold datafile '+USD' size 50M;  

Tablespace created.

再次查询磁盘组的空间使用情况

SQL> select group_number "group#",disk_number "disk#",name "disk name",path,hot_used_mb "hot (mb)",cold_used_mb "cold (mb)"
  2  from v$asm_disk_stat
  3  order by 1,2;

    group#      disk# disk name                      PATH                             hot (mb)  cold (mb)
---------- ---------- ------------------------------ ------------------------------ ---------- ----------
         1          0 ARCHDG_0000                    /dev/raw/raw2                           0       3447
         1          1 ARCHDG_0001                    /dev/raw/raw9                           0       3447
         2          0 CRSDG_0000                     /dev/raw/raw1                           0        215
         2          1 CRSDG_0001                     /dev/raw/raw8                           0        183
         3          0 DATADG_0001                    /dev/raw/raw11                          0       1676
         3          1 DATADG_0003                    /dev/raw/raw4                           0       1672
         3          2 DATADG_0002                    /dev/raw/raw3                           0       1670
         3          3 DATADG_0000                    /dev/raw/raw10                          0       1677
         4          0 ACFS_0000                      /dev/raw/raw5                           0       4187
         4          1 ACFS_0001                      /dev/raw/raw6                           0       4187
         5          0 USD_0000                       /dev/raw/raw7                          26        138
         5          1 USD_0001                       /dev/raw/raw12                         25        139

12 rows selected.

以上结果5号磁盘组的0号磁盘的热区仍然显示使用了26M,1号磁盘的热区显示仍然使用了25M,没有变化。而5号磁盘组的0号磁盘的准区显示使用了138M,1号磁盘的冷区显示使用了139M。

SQL> col "tablespace_name" for a30        
SQL> col "file_name" for a50
SQL> set long 200
SQL> set linesize 200
SQL> select a.name "tablespace_name",b.name "file_name" from v$tablespace a,v$datafile b where a.ts#=b.ts# and a.name='T_COLD';

tablespace_name                file_name
------------------------------ --------------------------------------------------
T_COLD                         +USD/jyrac/datafile/t_cold.257.931965173

现在我们把t_cold表空间的数据文件移入热区

SQL> alter diskgroup usd modify file '+USD/jyrac/datafile/t_cold.257.931965173' attributes (HOT); 

Diskgroup altered.

这个命令会触发一次磁盘组DATA的rebalance,因为文件的extent都需要移动到磁盘的热区。当rebalance结束时,查询发现热区的数据增多了。虽然说是磁盘组的rebalance,但是速度上会比较快,只取决于undo文件的大小,因为其他文件本身已经是rebalance状态,只需要做一次快速的检查即可,并没有真正的大量的extent需要做移动。

再次查询磁盘组的空间使用情况

SQL> select group_number "group#",disk_number "disk#",name "disk name",path,hot_used_mb "hot (mb)",cold_used_mb "cold (mb)"
  2  from v$asm_disk_stat
  3  order by 1,2;

    group#      disk# disk name                      PATH                             hot (mb)  cold (mb)
---------- ---------- ------------------------------ ------------------------------ ---------- ----------
         1          0 ARCHDG_0000                    /dev/raw/raw2                           0       3447
         1          1 ARCHDG_0001                    /dev/raw/raw9                           0       3447
         2          0 CRSDG_0000                     /dev/raw/raw1                           0        215
         2          1 CRSDG_0001                     /dev/raw/raw8                           0        183
         3          0 DATADG_0001                    /dev/raw/raw11                          0       1676
         3          1 DATADG_0003                    /dev/raw/raw4                           0       1672
         3          2 DATADG_0002                    /dev/raw/raw3                           0       1670
         3          3 DATADG_0000                    /dev/raw/raw10                          0       1677
         4          0 ACFS_0000                      /dev/raw/raw5                           0       4187
         4          1 ACFS_0001                      /dev/raw/raw6                           0       4187
         5          0 USD_0000                       /dev/raw/raw7                          52        112
         5          1 USD_0001                       /dev/raw/raw12                         50        114

12 rows selected.

以上结果5号磁盘组的0号磁盘的热区使用大小从26M变成了52M,增加了26M,1号磁盘的热区使用大小从25M变成了50M,增加了25M,而增加的26+25=51M刚好为数据文件本身大小50M加上1M的文件头,而5号磁盘组的0号磁盘的准区使用大小从138M变成了112M,减小了26M,1号磁盘的冷区使用大小从139M变成了114M,减小了25M,这与热区增加的大小相符。

小结:
磁盘空间使用目录记录了每个ASM磁盘组上每块盘每一个zone的AU使用数。它为11.2版本中智能数据存放特性提供支持。这个特性的一个可行的用途在于我们可以控制数据在冷区、热区的存放。对于做了RAID或是通过存储所创建出来的虚拟盘,磁盘的热区和冷区将会失去作用,同样,对于SSD盘,也是这样。

发表评论

电子邮件地址不会被公开。