天天看點

Oracle ASM 翻譯系列第二十三彈:ASM Internal ASM files number 12 and 254ASM files number 12 and 254

staleness directory是asm元資訊的12号檔案,包含了可以把staleness registry中的槽位映射給特定磁盤和用戶端的元資訊。staleness registry是asm元資訊254号檔案,當磁盤offline時,用于跟蹤au的狀态。這兩個特性适用于compatible.rdbms設定為11.1或以上且normal或high備援模式的磁盤組。隻有在需要時staleness元資訊才會被建立,本身的内容大小會随着offline磁盤的增多而增長。

譯者注:這裡的用戶端可以了解成資料庫執行個體

當一個磁盤offline時,每個rdbms執行個體都會從staleness registry中得到一個映射到該磁盤的槽位。這個槽位中的每一個比特位映射這個offline磁盤上的一個au。當rdbms執行個體對offline的磁盤發起寫io操作時,該執行個體會在staleness registry中修改對應的比特位。

當一個磁盤被online時,asm會從備援的extent中拷貝staleness registry比特位中記錄的au。因為隻有offline時被改變過的au會被更新,是以磁盤online操作的效率會高于該盤被drop并添加一塊新盤的效率。

staleness元資訊的結構在需要時會被建立,這意味着staleness directory和staleness registry在磁盤正常online時是不存在的。

sql> select g.name "disk group",

 g.group_number "group#",

 d.disk_number "disk#",

 d.name "disk",

 d.mode_status "disk status"

from v$asm_disk d, v$asm_diskgroup g

where g.group_number=d.group_number and g.group_number<>0

order by 1, 2, 3;

disk group       group#      disk# disk         disk status

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

data                  1          0 asmdisk1     online

                                 1 asmdisk2     online

                                 2 asmdisk3     online

reco                  2          0 asmdisk4     online

                                 1 asmdisk5     online

                                 2 asmdisk6     online

sql> select x.number_kffxp "file#",

 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 in (12, 254)

order by 1, 2;

no rows selected

staleness資訊在磁盤offline并且在針對該offline盤有寫io時會才被建立。

在下面的例子中,我會通過alter diskgroup offline disk指令手動把一個磁盤offline。但是需要指出,staleness元資訊的建立跟磁盤以何種方式何種原因offline無關。

sql> alter diskgroup reco offline disk asmdisk6;

diskgroup altered.

where g.group_number=d.group_number and g.group_number=2

                                 2 asmdisk6     offline

資料庫針對該磁盤組進行不斷的寫入,一會就可以觀察到該磁盤組中已經建立了staleness directory 和 staleness registry。

 and d.group_number=2

     file#      disk#     extent         au disk name

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

        12          0          0         86 asmdisk4

                    1          0        101 asmdisk5

                    2          0 4294967294 asmdisk6

       254          0          0         85 asmdisk4

                    1          0        100 asmdisk5

元資訊中并沒有很多有價值的資訊,連kfed都無法分辨出這種類型元資訊block。

$ kfed read /dev/oracleasm/disks/asmdisk4 aun=86 | more

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                           21 ; 0x002: *** unknown enum ***

...

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

kfdsde.entry.incarn:                  1 ; 0x024: a=1 numm=0x0

kfdsde.entry.hash:                    0 ; 0x028: 0x00000000

kfdsde.entry.refer.number:   4294967295 ; 0x02c: 0xffffffff

kfdsde.entry.refer.incarn:            0 ; 0x030: a=0 numm=0x0

kfdsde.cid:                       +asmr ; 0x034: length=5

kfdsde.indlen:                        1 ; 0x074: 0x0001

kfdsde.flags:                         0 ; 0x076: 0x0000

kfdsde.spare1:                        0 ; 0x078: 0x00000000

kfdsde.spare2:                        0 ; 0x07c: 0x00000000

kfdsde.indices[0]:                    0 ; 0x080: 0x00000000

kfdsde.indices[1]:                    0 ; 0x084: 0x00000000

kfdsde.indices[2]:                    0 ; 0x088: 0x00000000

$ kfed read /dev/oracleasm/disks/asmdisk4 aun=85 | more

kfbh.type:                           20 ; 0x002: *** unknown enum ***

kfdshdrb.clientid:           1297301881 ; 0x000: 0x4d534179

kfdshdrb.incarn:                      0 ; 0x004: 0x00000000

kfdshdrb.dsknum:                      2 ; 0x008: 0x0002

kfdshdrb.ub2spare:                    0 ; 0x00a: 0x0000

ub1[0]:                               0 ; 0x00c: 0x00

ub1[1]:                               0 ; 0x00d: 0x00

ub1[2]:                               0 ; 0x00e: 0x00

ub1[3]:                               0 ; 0x00f: 0x00

ub1[4]:                               0 ; 0x010: 0x00

ub1[5]:                               0 ; 0x011: 0x00

ub1[6]:                               0 ; 0x012: 0x00

ub1[7]:                              16 ; 0x013: 0x10

ub1[8]:                               0 ; 0x014: 0x00

除了一些比特位,沒有太多有價值資訊。

staleness directory 和 staleness registry提供的元資訊結構用來為asm 11中引入的fast mirror resync新特性提供支援。staleness directory是asm元資訊12号檔案,包含了可以把staleness registry中的槽位映射給特定磁盤和用戶端的元資訊。當磁盤offline時,staleness registry用于跟蹤au的狀态。這個特性隻在normal或high備援模式的磁盤組中生效。

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>