Oracle ASM Disk Directory

eric0435發表於2016-12-28

ASM的2號檔案就是ASM磁碟目錄,它用來跟蹤磁碟組中的所有磁碟。當磁碟組是一個獨立的儲存單元時,每個磁碟組有屬於它自己的ASM磁碟目錄。ASM中每一個磁碟組都是自解釋的,磁碟組之間沒有任何的資訊上依賴。

對ASM來說,磁碟目錄只是一個普通的ASM檔案。在ASM的檔案目錄中也會有它的條目,當磁碟組應用冗餘策略時,磁碟目錄也會生成映象副本,並且也會像其他檔案一樣根據實際需要而增長。

每個磁碟目錄條目維護以下內容:
.磁碟號
.磁碟的狀態
.磁碟的名稱(可能與作業系統所顯示的磁碟名不一樣)
.所在的Failgroup名稱
.建立的時間戳
.故障的時間戳
.故障時間(自失敗時間戳截止目前的時間)
.resize目標值
.磁碟修復時間
.Zone的資訊

V$ASM_DISK檢視
磁碟目錄中所維護的大部分資訊都可以透過查詢v$asm_disk檢視來獲得。對於被發現的每個磁碟在檢視中都有一條記錄來表示,包括那些不屬於任何磁碟組的磁碟。當每次查詢v$asm_disk檢視時,ASM就會執行磁碟發現操作,因此對這個檢視執行查詢的是有代價的。

下面的例子顯示了在ASM例項中查詢V$ASM_DISK檢視的輸出

SQL> select group_number, disk_number, state, name, mount_status from v$asm_disk order by 1,2;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           MOUNT_STATUS
------------ ----------- ------------------------------ ------------------------------ --------------
           0           0 NORMAL                                                        CLOSED
           0           1 NORMAL                                                        CLOSED
           0           2 NORMAL                                                        CLOSED
           0           3 NORMAL                                                        CLOSED
           0           4 NORMAL                                                        CLOSED
           0           5 NORMAL                                                        CLOSED
           1           0 NORMAL                         ARCHDG_0000                    CACHED
           1           1 NORMAL                         ARCHDG_0001                    CACHED
           2           0 NORMAL                         CRSDG_0000                     CACHED
           2           1 NORMAL                         CRSDG_0001                     CACHED
           3           0 NORMAL                         DATADG_0001                    CACHED
           3           1 NORMAL                         DATADG_0003                    CACHED
           3           2 NORMAL                         DATADG_0002                    CACHED
           3           3 NORMAL                         DATADG_0000                    CACHED

14 rows selected.

獲得了所有ASM識別到的磁碟,包括了哪些不是當前正mount磁碟組(GROUP_NUMBER=0)的磁碟。

V$ASM_DISK_STAT檢視
檢視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檢視的輸出

SQL> select group_number, disk_number, state, name, mount_status from v$asm_disk_stat order by 1,2;

GROUP_NUMBER DISK_NUMBER STATE                          NAME                           MOUNT_STATUS
------------ ----------- ------------------------------ ------------------------------ --------------
           1           0 NORMAL                         ARCHDG_0000                    CACHED
           1           1 NORMAL                         ARCHDG_0001                    CACHED
           2           0 NORMAL                         CRSDG_0000                     CACHED
           2           1 NORMAL                         CRSDG_0001                     CACHED
           3           0 NORMAL                         DATADG_0001                    CACHED
           3           1 NORMAL                         DATADG_0003                    CACHED
           3           2 NORMAL                         DATADG_0002                    CACHED
           3           3 NORMAL                         DATADG_0000                    CACHED

8 rows selected.

只看到了mount的磁碟組上的磁碟

磁碟目錄儲存位置
可透過在ASM例項中查詢固定表X$KFFXP來找到屬於ASM 2號檔案磁碟目錄的AU分佈情況。並且透過關聯v$asm_disk_stat檢視可以獲得磁碟名,下面來查詢磁碟組3(datadg)的磁碟目錄AU分佈情況。

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3 order by 1,2;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL



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

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0          3          2 DATADG_0002
             0               1          3          0 DATADG_0001
             0               2          3          1 DATADG_0003

上面的結果可以看出ASM的磁碟目錄有三份映象,當前磁碟目錄的大小是3個物理extent(本例中也就是3個AU),再次強調,即使在一個normal冗餘的磁碟組中,ASM的磁碟目錄也有三份映象。讓我們使用kfed工具檢視下磁碟目錄的具體內容,由於資料在3個AU中是一樣的,我們只需要檢視第一個AU的內容就可以了,這裡是DATADG_0001(/dev/raw/raw11)的AU 3:

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=3 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            6 ; 0x002: KFBTYP_DISKDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       2 ; 0x008: file=2
kfbh.check:                    17204021 ; 0x00c: 0x01068335
kfbh.fcn.base:                      311 ; 0x010: 0x00000137
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
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
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  --diskgroup中,該disk的disk編號,從0開始排序,該值為0,說明該disk是這個磁碟組中的第一個disk
kfddde[0].state:                      2 ; 0x036: KFDSTA_NORMAL--disk狀態。其中2表示normal。在asm中,該值對應v$asm_disk.state,主要有如下幾種值: 
UNKNOWN ---disk不被diskgroup所識別,通常是diskgroup沒有mount。
NORMAL  ---disk目前處於online狀態,操作正常。
ADDING  ---表示disk正在被加入到diskgroup當中,其中add disk過程涉及到一系列的操作,包括更新pst,fst,disk dir以及reblance等各項操作。
DROPPING ---表示disk正在被從某個diskgroup中刪除,該操作可以認為是adding的相反過程
HUNG   ---該狀態表示在drop disk的過程中,由於diskgroup 空間不足而不能完成reblance操作而導致disk處於hung狀態。
FORCING ---該狀態表示disk已經從diskgroup中移除,但是其disk上的資料尚未被解除安裝,很可能是強制drop。
DROPPED ---表示disk已經從diskgroup中刪除且完成了一系列的相關操作。
#define KFDSTA_INVALID  ((kfdsta)0)  /* Illegal value */
#define KFDSTA_UNKNOWN  ((kfdsta)1)  /* ASM disk state not known */
#define KFDSTA_NORMAL   ((kfdsta)2)  /* Happy disk */
#define KFDSTA_UNUSED   ((kfdsta)3)  /* Unused State - Open */
#define KFDSTA_DROPPING ((kfdsta)4)  /* Disk being dropped from group */
#define KFDSTA_HUNG     ((kfdsta)5)  /* Disk drop operation hung */
#define KFDSTA_FORCING  ((kfdsta)6)  /* Disk beinng drop forced */
#define KFDSTA_DROPPED  ((kfdsta)7)  /* Disk no longer part of group */
#define KFDSTA_ADDING   ((kfdsta)8)  /* Disk being globally validated */

kfddde[0].ddchgfl:                  132 ; 0x037: 0x84
kfddde[0].dskname:          DATADG_0001 ; 0x038: length=11 --磁碟名稱,這是asm中定義的diskname.
kfddde[0].fgname:           DATADG_0001 ; 0x058: length=11 --這表示failgroup diskname
kfddde[0].crestmp.hi:          33042831 ; 0x078: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[0].crestmp.lo:        2456905728 ; 0x07c: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
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:                    5120 ; 0x08c: 0x00001400 --disk大小,由於au預設是1m,所以這裡是5120m
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].start0:                     0 ; 0x0a4: 0x00000000
kfddde[0].size0:                   5120 ; 0x0a8: 0x00001400
kfddde[0].used0:                     76 ; 0x0ac: 0x0000004c
kfddde[0].slot:                       0 ; 0x0b0: 0x00000000
.....
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:          DATADG_0003 ; 0x1f8: length=11
kfddde[1].fgname:           DATADG_0003 ; 0x218: length=11
kfddde[1].crestmp.hi:          33042831 ; 0x238: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[1].crestmp.lo:        2456905728 ; 0x23c: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[1].failstmp.hi:                0 ; 0x240: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[1].failstmp.lo:                0 ; 0x244: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[1].timer:                      0 ; 0x248: 0x00000000
kfddde[1].size:                    5120 ; 0x24c: 0x00001400
kfddde[1].srRloc.super.hiStart:       0 ; 0x250: 0x00000000
kfddde[1].srRloc.super.loStart:       0 ; 0x254: 0x00000000
kfddde[1].srRloc.super.length:        0 ; 0x258: 0x00000000
kfddde[1].srRloc.incarn:              0 ; 0x25c: 0x00000000
kfddde[1].dskrprtm:                   0 ; 0x260: 0x00000000
kfddde[1].start0:                     0 ; 0x264: 0x00000000
kfddde[1].size0:                   5120 ; 0x268: 0x00001400
kfddde[1].used0:                     76 ; 0x26c: 0x0000004c
kfddde[1].slot:                       0 ; 0x270: 0x00000000
....
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:          DATADG_0002 ; 0x3b8: length=11
kfddde[2].fgname:           DATADG_0002 ; 0x3d8: length=11
kfddde[2].crestmp.hi:          33042831 ; 0x3f8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[2].crestmp.lo:        2456905728 ; 0x3fc: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[2].failstmp.hi:                0 ; 0x400: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[2].failstmp.lo:                0 ; 0x404: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[2].timer:                      0 ; 0x408: 0x00000000
kfddde[2].size:                    5120 ; 0x40c: 0x00001400
kfddde[2].srRloc.super.hiStart:       0 ; 0x410: 0x00000000
kfddde[2].srRloc.super.loStart:       0 ; 0x414: 0x00000000
kfddde[2].srRloc.super.length:        0 ; 0x418: 0x00000000
kfddde[2].srRloc.incarn:              0 ; 0x41c: 0x00000000
kfddde[2].dskrprtm:                   0 ; 0x420: 0x00000000
kfddde[2].start0:                     0 ; 0x424: 0x00000000
kfddde[2].size0:                   5120 ; 0x428: 0x00001400
kfddde[2].used0:                     77 ; 0x42c: 0x0000004d
kfddde[2].slot:                       0 ; 0x430: 0x00000000
...
kfddde[3].entry.incarn:               1 ; 0x564: A=1 NUMM=0x0
kfddde[3].entry.hash:                 3 ; 0x568: 0x00000003
kfddde[3].entry.refer.number:4294967295 ; 0x56c: 0xffffffff
kfddde[3].entry.refer.incarn:         0 ; 0x570: A=0 NUMM=0x0
kfddde[3].dsknum:                     3 ; 0x574: 0x0003
kfddde[3].state:                      2 ; 0x576: KFDSTA_NORMAL
kfddde[3].ddchgfl:                  132 ; 0x577: 0x84
kfddde[3].dskname:          DATADG_0000 ; 0x578: length=11
kfddde[3].fgname:           DATADG_0000 ; 0x598: length=11
kfddde[3].crestmp.hi:          33042831 ; 0x5b8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfddde[3].crestmp.lo:        2456905728 ; 0x5bc: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfddde[3].failstmp.hi:                0 ; 0x5c0: HOUR=0x0 DAYS=0x0 MNTH=0x0 YEAR=0x0
kfddde[3].failstmp.lo:                0 ; 0x5c4: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfddde[3].timer:                      0 ; 0x5c8: 0x00000000
kfddde[3].size:                    5120 ; 0x5cc: 0x00001400
kfddde[3].srRloc.super.hiStart:       0 ; 0x5d0: 0x00000000
kfddde[3].srRloc.super.loStart:       0 ; 0x5d4: 0x00000000
kfddde[3].srRloc.super.length:        0 ; 0x5d8: 0x00000000
kfddde[3].srRloc.incarn:              0 ; 0x5dc: 0x00000000
kfddde[3].dskrprtm:                   0 ; 0x5e0: 0x00000000
kfddde[3].start0:                     0 ; 0x5e4: 0x00000000
kfddde[3].size0:                   5120 ; 0x5e8: 0x00001400
kfddde[3].used0:                     76 ; 0x5ec: 0x0000004c
kfddde[3].slot:                       0 ; 0x5f0: 0x00000000
....

輸出資訊中的kfbh.type為KFBTYP_DISKDIR代表了這是一個磁碟目錄。ASM中的磁碟的資訊儲存在上面輸出內容的kfddde的區域,kfddde[0] 是關於磁碟0,kfddde[1]是關於磁碟1,以此類推。

以這種方式我們可以知道磁碟組中所有磁碟的資訊,就像你看到的,大部分的資訊都可以透過檢視V$ASM_DISK去獲取,而不需要透過kfed這種工具去檢視。

使用kfed工具來判斷磁碟目錄位置
使用查詢得到的磁碟目錄AU分佈如下:

SQL> select group_number,disk_number,name,path,state from v$asm_disk where group_number=3 order by 1,2;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           STATE
------------ ----------- ------------------------------ ------------------------------ ------------------------------
           3           0 DATADG_0001                    /dev/raw/raw11                 NORMAL
           3           1 DATADG_0003                    /dev/raw/raw4                  NORMAL
           3           2 DATADG_0002                    /dev/raw/raw3                  NORMAL
           3           3 DATADG_0000                    /dev/raw/raw10                 NORMAL



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

virtual extent physical extent         au     disk # disk name
-------------- --------------- ---------- ---------- ------------------------------------------------------------
             0               0          3          2 DATADG_0002
             0               1          3          0 DATADG_0001
             0               2          3          1 DATADG_0003

上面的結果可以看出ASM的磁碟目錄有三份映象,當前磁碟目錄的大小是3個物理extent(本例中也就是3個AU),再次強調,即使在一個normal冗餘的磁碟組中,ASM的磁碟目錄也有三份映象。

讀取磁碟頭

[grid@jyrac1 ~]$ kfed read /dev/raw/raw3  | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:              2147483650 ; 0x008: disk=2
kfbh.check:                  3693686872 ; 0x00c: 0xdc293058
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr:         ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]:            0 ; 0x008: 0x00000000
kfdhdb.driver.reserved[1]:            0 ; 0x00c: 0x00000000
kfdhdb.driver.reserved[2]:            0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]:            0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]:            0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]:            0 ; 0x01c: 0x00000000
kfdhdb.compat:                186646528 ; 0x020: 0x0b200000
kfdhdb.dsknum:                        2 ; 0x024: 0x0002
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0002 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0002 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042831 ; 0x0a8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:           2456905728 ; 0x0ac: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24
kfdhdb.mntstmp.hi:             33042897 ; 0x0b0: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:            144833536 ; 0x0b4: USEC=0x0 MSEC=0x7f SECS=0xa MINS=0x2
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize:                    5120 ; 0x0c4: 0x00001400
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002 --allocate table
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002 --file directory
kfdhdb.redomirrors[0]:                0 ; 0x0d8: 0x0000
kfdhdb.redomirrors[1]:                0 ; 0x0da: 0x0000
kfdhdb.redomirrors[2]:                0 ; 0x0dc: 0x0000
kfdhdb.redomirrors[3]:                0 ; 0x0de: 0x0000
kfdhdb.dbcompat:              168820736 ; 0x0e0: 0x0a100000

allocate table後設資料在第2個AU裡面,而那麼必然disk directory資訊也在該AU裡面,因為進行在讀取alocate table資訊時,必然要先讀取disk directory。file directoryb也在第2個AU中

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11  | grep kfdhdb.f1b1locn
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002

由於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號檔案,從中找出要讀的目標檔案在磁碟上的分佈位置,然後再去讀取相應的檔案的資料。

由於磁碟目錄的檔案號為2,所以讀取2號AU的2號塊

[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=2 blkn=2 | 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:                       2 ; 0x004: blk=2
kfbh.block.obj:                       1 ; 0x008: file=1
kfbh.check:                   305881854 ; 0x00c: 0x123b62fe
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:             2457465856 ; 0x054: USEC=0x0 MSEC=0x27d SECS=0x27 MINS=0x24
kfffdb.modts.hi:               33042831 ; 0x058: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfffdb.modts.lo:             2457465856 ; 0x05c: USEC=0x0 MSEC=0x27d SECS=0x27 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:                    3 ; 0x4a0: 0x00000003
kfffde[0].xptr.disk:                  2 ; 0x4a4: 0x0002
kfffde[0].xptr.flags:                 0 ; 0x4a6: L=0 E=0 D=0 S=0
kfffde[0].xptr.chk:                  43 ; 0x4a7: 0x2b
kfffde[1].xptr.au:                    3 ; 0x4a8: 0x00000003
kfffde[1].xptr.disk:                  0 ; 0x4ac: 0x0000
kfffde[1].xptr.flags:                 0 ; 0x4ae: L=0 E=0 D=0 S=0
kfffde[1].xptr.chk:                  41 ; 0x4af: 0x29
kfffde[2].xptr.au:                    3 ; 0x4b0: 0x00000003
kfffde[2].xptr.disk:                  1 ; 0x4b4: 0x0001
kfffde[2].xptr.flags:                 0 ; 0x4b6: L=0 E=0 D=0 S=0
kfffde[2].xptr.chk:                  40 ; 0x4b7: 0x28
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[4].xptr.au:           4294967295 ; 0x4c0: 0xffffffff
kfffde[4].xptr.disk:              65535 ; 0x4c4: 0xffff
kfffde[4].xptr.flags:                 0 ; 0x4c6: L=0 E=0 D=0 S=0
kfffde[4].xptr.chk:                  42 ; 0x4c7: 0x2a
kfffde[5].xptr.au:           4294967295 ; 0x4c8: 0xffffffff

kfffde,是結構陣列。由於我這裡磁碟目錄有三份映象,kfffde[0]的資料元素,
存放了2號檔案第一個AU的位置。kfffde[1]存放了2號檔案第二個AU位置,kfffde[2]存放了2號檔案第三個AU位置等等,依次類推。我們來看一下上面的資訊:
kfffde[0].xptr.au=3 --3號AU
kfffde[0].xptr.disk=2 --2號磁碟
上兩個資訊合起來,2號盤3號AU,這就是2號檔案(磁碟目錄)第一個AU的位置
kfffde[1].xptr.au=3 --3號AU
kfffde[1].xptr.disk=0 --0號磁碟
kfffde[2].xptr.au=3 --3號AU
kfffde[2].xptr.disk=1 --1號磁碟
上面的資訊顯示了2號檔案的映象副本儲存在0號盤3號AU與1號盤的3號AU中。這與用查詢x$kffxp檢視所得到的後設資料分佈情況一致。

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

相關文章