天天看點

Oracle ASM 翻譯系列第十七彈:ASM Internal ASM Disk DirectoryASM Disk Directory

本篇文章講述asm元資訊的2号檔案,asm的2号檔案是asm的磁盤目錄,它跟蹤磁盤組中的所有磁盤。由于在asm中磁盤組是一個獨立的存儲機關,是以每一個磁盤組都會有自己的磁盤目錄。

譯者注:asm中每一個磁盤組都是自解釋的,磁盤組之間沒有任何的資訊上依賴

對asm來說,磁盤目錄隻是一個普通的asm檔案,在asm的檔案目錄中也會有它的條目,如果磁盤組做了備援政策,它也會相應做鏡像,也會像其他檔案一樣根據實際需要做空間的伸長。

每個磁盤目錄的條目都維護了如下的一些資訊:

· 磁盤号

· 磁盤的狀态

· 磁盤的名稱

· 所在的failgroup名稱

· 建立的時間戳

· 失敗的時間戳

· 自失敗時間戳截止目前的時間

· resize目标值

· 磁盤修複時間

· zone的資訊

磁盤目錄的大部分資訊都可以通過視圖v$asm_disk獲得,每一個磁盤都在這個視圖中有一行記錄,這些磁盤包括哪些還不是任何磁盤組的磁盤。每次查詢這個視圖都會導緻asm執行磁盤的發現操作,是以查詢這個視圖的代價是非常大的。

下面的例子顯示了在asm執行個體中查詢v$asm_disk視圖的輸出:

sql> select group_number, disk_number, state, name, mount_status

from v$asm_disk;

group_number disk_number state    name         mount_s

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

          0           0 normal                closed

          0           1 normal                closed

          0           2 normal                closed

          0           6 normal                closed

          1           0 normal   asmdisk1     cached

          1           1 normal   asmdisk2     cached

          1           2 normal   asmdisk3     cached

          1           3 normal   asmdisk4     cached

          2           0 normal   asmdisk5     cached

          2           1 normal   asmdisk6     cached

10 rows selected.

sql>

我們獲得了所有asm識别到的磁盤,包括了哪些不是目前正mount磁盤組(group_number=0)的磁盤。

視圖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視圖的輸出:

from v$asm_disk_stat;

6 rows selected.

this time, we only see disks for the mounted disk groups.

這次,我們隻看到了mount的磁盤組上的磁盤。

我們可以在asm執行個體中查詢固态表x$kffxp來檢視哪些au屬于asm的2号檔案,同時通過join視圖v$asm_disk_stat來擷取asm的磁盤名稱,讓我們來對一個磁盤組進行查詢:

sql> select x.xnum_kffxp "extent",

x.au_kffxp "au",

x.disk_kffxp "disk #",

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.group_kffxp=1

and x.number_kffxp=2

order by 1, 2;

   extent         au     disk # disk name

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

        0          2          3 asmdisk4

        0          3          0 asmdisk1

        0          3          1 asmdisk2

上面的結果展示了2個内容:asm的磁盤目錄被做了3重鏡像,目前磁盤目錄的大小是3個實體extent(本例中也就是3個au),再次強調,即使在一個normal備援的磁盤組中,asm的磁盤目錄也被做了3重鏡像。

讓我們使用kfed工具檢視下磁盤目錄的具體内容,由于資料在3個au中是一樣的,我們隻需要檢視第一個au的内容就可以了,這裡是asmdisk4的au 2:

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

kfbh.endian:                          1 ; 0x000: 0x01

kfbh.hard:                          130 ; 0x001: 0x82

kfbh.type:                            6 ; 0x002: kfbtyp_diskdir

...

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

kfddde[0].state:                      2 ; 0x036: kfdsta_normal

kfddde[0].ddchgfl:                  132 ; 0x037: 0x84

kfddde[0].dskname:             asmdisk1 ; 0x038: length=8

kfddde[0].fgname:              asmdisk1 ; 0x058: length=8

kfddde[0].crestmp.hi:          32960657 ; 0x078: hour=0x11 days=0x4 mnth=0xc year=0x7db

kfddde[0].crestmp.lo:        2843202560 ; 0x07c: usec=0x0 msec=0x1f5 secs=0x17 mins=0x2a

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:                    4094 ; 0x08c: 0x00000ffe

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].zones[0].start:             0 ; 0x0a4: 0x00000000

kfddde[0].zones[0].size:           4094 ; 0x0a8: 0x00000ffe

kfddde[0].zones[0].used:             47 ; 0x0ac: 0x0000002f

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:             asmdisk2 ; 0x1f8: length=8

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:             asmdisk3 ; 0x3b8: length=8

$

輸出資訊中的kfbh.type為kfbtyp_diskdir代表了這是一個磁盤目錄。asm中的磁盤的資訊存儲在上面輸出内容的kfddde的區域,kfddde[0] 是關于磁盤0,kfddde[1]是關于磁盤1,以此類推。以這種方式我們可以知道磁盤組中所有磁盤的資訊,就像你看到的,大部分的資訊都可以通過視圖v$asm_disk去擷取,而不需要通過kfed這種工具去檢視。

asm磁盤目錄維護了關于asm磁盤組中的所有的磁盤的資訊,這些資訊基本上可以通過視圖v$asm_disk去擷取,也可以通過kfed工具去通路到這些資訊。

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