天天看点

Oracle ASM 翻译系列第二十二弹:ASM Internal ASM file number 8ASM file number 8

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> break on group#

sql> select d.group_number "group#",

 x.disk_kffxp "disk#",

 x.xnum_kffxp "extent",

 x.au_kffxp "au",

 d.name "disk name"

from x$kffxp x, v$asm_disk_stat d

where x.group_kffxp=d.group_number

 and x.disk_kffxp=d.disk_number

 and x.number_kffxp=8

order by 1, 2;

 group#  disk#  extent     au disk name

------- ------ ------- ------ ------------

      1      0       0     51 asmdisk5

             1       0     51 asmdisk6

      2      0       0     41 asmdisk1

             2       0     39 asmdisk3

             3       0     38 asmdisk4

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

sql> select group_number "group#",

 name "disk name",

 hot_used_mb "hot (mb)",

 cold_used_mb "cold (mb)"

from v$asm_disk_stat

order by 1;

 group# disk name      hot (mb)  cold (mb)

------- ------------ ---------- ----------

      1 asmdisk5              0       4187

        asmdisk6              0       4187

      2 asmdisk4              0       1138

        asmdisk2              0       1135

        asmdisk1              0       1139

        asmdisk3              0       1144

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

$ kfed read /dev/oracleasm/disks/asmdisk5 aun=51 | more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                           26 ; 0x002: kfbtyp_usedspc

...

kfdusde[0].used[0].spare:             0 ; 0x000: 0x00000000

kfdusde[0].used[0].hi:                0 ; 0x004: 0x00000000

kfdusde[0].used[0].lo:             4134 ; 0x008: 0x00001026

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:             4134 ; 0x020: 0x00001026

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:                0 ; 0x038: 0x00000000

kfdusde[2].used[1].spare:             0 ; 0x03c: 0x00000000

kfdusde[2].used[1].hi:                0 ; 0x040: 0x00000000

kfdusde[2].used[1].lo:                0 ; 0x044: 0x00000000

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

查看磁盘组2的空间使用记录

$ kfed read /dev/oracleasm/disks/asmdisk1 aun=41 | more

kfdusde[0].used[0].lo:             1092 ; 0x008: 0x00000444

kfdusde[1].used[0].lo:             1093 ; 0x020: 0x00000445

kfdusde[2].used[0].lo:             1098 ; 0x038: 0x0000044a

kfdusde[3].used[0].spare:             0 ; 0x048: 0x00000000

kfdusde[3].used[0].hi:                0 ; 0x04c: 0x00000000

kfdusde[3].used[0].lo:             1094 ; 0x050: 0x00000446

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

磁盘组二有四个磁盘,有四个条目被占用,并且每个磁盘的已分配的所有空间确实都被分配在了冷区。

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

sql> alter diskgroup data add template hotfile attributes (hot);

diskgroup altered.

这个特性需要磁盘组compatible.rdbms属性设置为11.2或以上。

现在创建一个datafile,并放置于热区。

sql> create tablespace t1_hot datafile '+data(hotfile)' size 50m;

tablespace created.

再次运行上面的查询,检查空间使用。

    group# disk name                        hot (mb)  cold (mb)

---------- ------------------------------ ---------- ----------

         1 asmdisk5                                0       4187

           asmdisk6                                0       4187

         2 asmdisk4                               13       1152

           asmdisk2                               12       1153

           asmdisk1                               13       1152

           asmdisk3                               13       1153

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

我们还可以将一个已经存在的数据文件移到热区,我们来通过asmcmd里的find命令找到磁盘组data里的所有数据文件:

$ asmcmd find --type datafile +data "*"

+data/br/datafile/example.269.769030517

+data/br/datafile/not_important.273.771795255

+data/br/datafile/sysaux.257.769030245

+data/br/datafile/system.256.769030243

+data/br/datafile/t1_hot.274.772054033

+data/br/datafile/triple_c.272.771794469

+data/br/datafile/triple_m.271.771793293

+data/br/datafile/undotbs1.258.769030245

+data/br/datafile/users.259.769030245

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

sql> alter diskgroup data modify file '+data/br/datafile/undotbs1.258.769030245' attributes (hot);

这个命令会触发一次磁盘组data的rebalance,因为文件的extent都需要移动到磁盘的热区。当rebalance结束时,查询发现热区的数据增多了。

译者注:虽然说是磁盘组的rebalance,但是速度上会比较快,只取决于undo文件的大小,因为其他文件本身已经是rebalance状态,只需要做一次快速的检查即可,并没有真正的大量的extent需要做移动。

         2 asmdisk4                               40       1125

           asmdisk2                               39       1126

           asmdisk1                               39       1126

           asmdisk3                               39       1127

asm元信息8号文件即磁盘空间使用目录,记录了每个asm磁盘组上每块盘每一个zone的au使用数。它为11.2版本中智能数据存放特性提供支持。这个特性的一个可行的用途在于我们可以控制数据在冷区、热区的存放。

译者注:对于做了raid或是通过存储输出来的虚拟盘,磁盘的热区和冷区将会失去作用,同样,对于ssd盘,也是这样。

<b></b>

<b>本文来自云栖社区合作伙伴“dbgeek”</b>