Oracle ASM Free Space Table

eric0435發表於2016-12-21

在進行建立檔案或者檔案resize過程中,需要有一個快捷入口,可以迅速的知道當前磁碟有哪些可用的(free狀態的)AU,ASM Free Space Table 簡稱FST表就是提供一個這樣的功能,透過它可以快速的知道哪些allocation table(AT表)後設資料塊中有空閒的AU,它儲存的是一個個的AT表後設資料塊的號碼,FST指示了那個AT表可能包含可用的AUs。當一個磁碟被選擇用來分配AU時,ASM會諮詢磁碟的FST。這允許ASM跳過那些被佔用殆盡的AT塊。FST對於分配是一種最佳方法。FST儲存在每個AT中的第二個塊中。FST表和AT表都被稱為物理後設資料,它們經常位於ASM磁碟的固定的位置。

FST儲存位置
FST儲存在ASM磁碟頭,透過kfed工具可以檢視磁碟頭資訊,其中kfdhdb.fstlocn的值代表了FST位於磁碟頭的第幾個塊(AU)。例如下面的輸出代表了,FST塊位於磁碟頭的塊1,也就是AU 0的第二個塊。(塊從0開始編號)。不管是10g還是11g,FST儲存在每個AT中的第二個塊中。
10g ASM中的PST所在位置

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

11g ASM中的PST所在位置

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

對於這個FST塊,第一個AT表後設資料塊位於AU0:

kfdfsb.aunum:                         0 ; 0x000: 0x00000000

這個FST塊最大數量的FST條目可以達到254個,雖然上面kfed的輸出中kfdfse[i]的編號到了4039,也就是有4039+1=4040個條目,但是有效條目只有254個。

kfdfsb.max:                         254 ; 0x004: 0x00fe

大的ASM磁碟可能會有超過一個stride,ASM磁碟頭的kfdhdb.mfact顯示了stride的大小(單位為AU),每一個stride有它自己的物理後設資料,這意味著會有它自己的FST表。第二個stride的物理後設資料位於這個stride的第一個AU,我們透過kfed工具看一下:

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

以上顯示了stride的大小為113792個AU,由於AU是從0開始編號,因此第一個stride最後的AU號是AU 113791,我們可以推算出第二個stride的FST位置是,AU 113792的第一個塊:

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

如預期,我們在AU 113792上有另一個FTS表,如果我們還有其他的stride,同樣會在stride的開始AU處有FST表。如下面所示,一個大的ASM磁碟,會有數個stride,這裡展示了在第3到5個stride的開始處的FST表:

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

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2131148/,如需轉載,請註明出處,否則將追究法律責任。

相關文章