Oracle ASM Disk Header

eric0435發表於2016-12-21

ASM Disk Header
每個ASM磁碟有一個disk header。disk header它標識了磁碟屬於ASM磁碟,disk header佔用了每個磁碟的第一個allocation unit(AU 0)中的第一個塊(block 0)。disk header條目包括以下內容:
1.disk name
2.disk number
3.diskgroup name
4.failure group name
5.disk size
6.allocation unit(AU) size
7.creation time
8.mount time
9.ASM compatibility
10.RDBMS compatibility
11.file directory pointer
12.ASMLIB reserved block

這些內容從它們的名字就可以知道其作用。如果在特定的磁碟組中有兩個磁碟都要使用相同的磁碟名稱與磁碟號,那麼在mount磁碟組時mount time與creation time被用來決定選擇正確的磁碟。這種情況可能出現在一個磁碟臨時出現故障而向磁碟組中新增另一塊磁碟。

ASM compatibility指示mount磁碟組的ASM例項的最小軟體版本。Oracle 10g軟體總是使用10.1。錄compatible.asm屬性被推進到11.1後,ASM將在PST中儲存版本號,但也會更新磁碟組中的disk headers來確保Oracle 10g軟體將不能訪問不相容的磁碟組。

RDBMS compatibility指示RDBMS例項訪問磁碟組相容性引數的最小設定。這個值在disk header中將總是10.1。Oracle 10g軟體從不更新這個值,並且如果compatible.asm設定為11.1或更高,Oracle 11g軟體將對於RDBMS compatibility詢問屬性目錄。

如果磁碟包含檔案目錄,那麼file directory pointer描述了檔案目錄的第一個區所在位置。對於引導虛擬ASM後設資料這個指標是需要的。

ASMLIB供應商可以在disk header中的ASMLIB保留塊中儲存達32 bytes的資訊。Oracle的ASMLIB在這裡儲存了磁碟的ASMLIB名稱。

因為disk header是磁碟特定的,在另一磁碟上對它進行映象沒有意義。磁碟目錄包含了與disk header相同的資訊。執行alter diskgroup ... check命令可以驗證磁碟目錄與disk header的一致性

ASM磁碟是以AU為單位進行格式化的,部分AU會存放ASM後設資料,其他AU存放資料庫中的相關資料(如資料檔案、備份檔案、歸檔檔案等等)。包含ASM後設資料的AU會以後設資料塊的方式進行格式化(一個後設資料塊的大小為4K)。AU0位於ASM磁碟的起始位置,它始終用於儲存ASM後設資料。AU0的第一個塊,即block 0,就是ASM的磁碟頭。ASM 磁碟頭的大部分內容僅與本磁碟相關,但也有部分資訊與整個磁碟組相關,有些甚至於與整個cluster相關。

在10g中查詢會得到如下結果

SQL> SELECT number_kffxp file#, disk_kffxp disk#,COUNT(disk_kffxp) extents FROM x$kffxp WHERE group_kffxp=1 AND disk_kffxp <>65534 GROUP BY number_kffxp, disk_kffxp;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         1          0          1
         1          1          1
         2          0          1
         2          1          1
         3          0          6
         3          1          6
         4          0          1
         4          1          1
         5          0          1
         5          1          1
         6          0          1
         6          1          1
       256          0         29
       256          1         29
       257          0         35
       257          1         35
       258          0          3
       258          1          3
       259          0          1
       259          1          1
       260          0          1
       260          1          1
       261          0          4
       261          1          4
       262          0          4
       262          1          4
       263          0          2
       263          1          2
       264          0          7
       264          1          7
       265          0          4
       265          1          4
       266          0          4
       266          1          4
       267          0          4
       267          1          4
       268          0          1
       268          1          1
       269          0          7
       269          1          7
       270          0          1
       270          1          1

42 rows selected.

上述查詢的file資訊,對於10g版本中asm所涉及的後設資料資訊,對應關係如下:

file#   1   ---ASM file 1,file directory
file#   2   ---ASM file 2,disk directory
file#   3   ---ASM file 3,active Change Directory(ACD)
file#   4   ---ASM file 4,continuing Operations Directory (COD)
file#   5   ---ASM file 5,template directory
file#   6   ---ASM file 6,alias directory

File Directory
檔案目錄包含與ASM檔案相關的所有後設資料。目錄對於每個ASM檔案都有一個條目並且透過檔案號來進行索引。檔案目錄在每個磁碟組中都是檔案號1(F1)。

檔案目錄包含以下內容:

.Incarnation number
.File size
.File block size
.File type
.Redundancy(none,normal,or high)
.Striping(coarse or fine-grained)
.File creation time
.File modification time(the time that the file was last opened for writing))
.File layout

如果一個檔案被刪除,對於新建立的檔案ASM會使用它的檔案號,那麼檔案號將是唯一的,有不同的incarnation號。incarnation號是當檔案建立時由時間來推算出來的,它保證對於相同檔案號來說incarnation號是唯一的。

ASM檔案的塊大小是獨立於ASM後設資料塊大小。所有的ASM後設資料目錄的塊大小為4K。RDBMS資料檔案在建立表空間時指定的塊大小可以是2K,4K,8K,16K或32K。RDBMS的redo log檔案通常的塊大小是512 byte。ASM跟蹤邏輯檔案大小,透過資料庫,與磁碟組中所佔用的物理空間,考慮檔案的冗餘可以很顯然的看出。RDBMS在檔案建立時也提供了檔案型別。對於不是由RDBMS例項顯式建立的檔案(比如由XML DB ftp命令或ASMCMD cp命令所建立的檔案),ASM為了在建立時判斷檔案型別會檢查檔案頭。

檔案建立時間有一個明顯的語義。檔案修改時間,然後不是每次更新時間檔案都會寫入。而是當檔案被開啟執地寫操作時檔案修改時間會被更新。這意味著即使檔案沒有被寫入,檔案的修改時間也可能發生改變,並且儲存的修改時間可能比修改檔案內容所處的時間早。為了減小在叢集ASM例項中的buffer cache中的檔案目錄塊的競爭,修改時間以小時為精度。因此,在RAC中多個例項以較短時間開啟檔案,那麼只有第一個訪問檔案的例項需要更新檔案修改時間。

檔案的佈局資訊由一系列的區指標組成。區指標指定了磁碟號與區所在的AU號。檔案目錄條目包含了一個檔案的前60個區指標,有時也叫direct extens。檔案目錄剩餘的部分包含了指向indirect extents的指標。indirect extents是其它虛擬後設資料區,包含ASM檔案的區指標。每個indirect extent是一個AU。每個檔案目錄條目可以包含最多300個indirect exten。indirect指標的概念存在於大多數傳統檔案系統中,比如Unix的BSD檔案系統。檔案佈局的解釋也叫extent map,檔案佈局受條帶與冗餘的影響。

Disk Directory
磁碟目錄包含磁於磁碟組中所有磁碟的資訊。磁碟目錄資訊比PST更詳細。磁碟組中的每塊磁碟透過磁碟號在磁碟目錄索引中有一個條目。這個磁碟目錄在每個磁碟組中的檔案號為2(F2)
Disk Directory條目包含以下內容:

.Disk name
.Failure group name
.Disk size
.Disk free space
.Disk creation time

在磁碟目錄中的許多資訊在磁碟頭中也可用。執行alter diskgroup ... check可以驗證關於磁碟這些結構的詳細資訊。
磁碟目錄當磁碟組被mount時總是可用狀態,因此對於正常或高階冗餘磁碟組中的離線磁碟也能提供資訊。

Active Change Directory(ACD)

ACD是一個日誌允許ASM對多個資料結構執行原子性改變。它類似於RDBMS的重做日誌。每個例項將得到一個大小為42MB的ACD大塊。每個大塊的第一個塊包含開啟/關閉的狀態與檢查點。檢查點每3秒更新一次。剩下的塊被作為ACD改變記錄的迴圈快取區。ACD為了適應親的ASM例項並根據需要動態增長。ASM使用ACD來執行崩潰恢復與例項恢復來確保ASM後設資料的一致性。ACD在每個磁碟組中的檔案號為3(F3)。

Continuing Operations Directory(COD)
COD用來跟蹤長時間執行的磁碟組操作,比如檔案建立與rebalance操作。長時間執行操作不適用於ACD。COD條目允許ASM在執行長時間操作期間從故障狀態恢復。對於例項,ASM可以回滾沒有完成的檔案建立操作。RDBMS故障或使用者操作可能導致這樣的情況。對於磁碟的rebalance操作,如果例項執行rebalance失敗,ASM可以在正常節點上重啟rebalance或者當磁碟組再次在單例項ASM中mount時重啟rebalance。COD在每個磁碟組中的檔案號為4(F4)。

Template Directory
Template Directory包含關於磁碟組所有檔案模板的資訊。建立磁碟組時對於每種支援的檔案型別將使用預設的系統模板進行填充。如果使用者建立自己的模板將會增加新的條目。模板目錄透過模板號進行索引。
每種模板條目包含以下內容:

.Template name
.File redundancy
.File striping policy
.System flag

Template Directory在每個磁碟組中的檔案號為5(F5)。預設模板的模板名與檔案型別相關。檔案冗餘預設為磁碟組冗餘。檔案條帶預設是檔案型別特定。system flag被設定為系統模板。使用者建立的模板不會設定system flag。

Alias Directory
Alias Directory包含所有別名後設資料以及每種系統別名,系統目錄,使用者目錄與使用者別名。透過別名號進行索引。
別名目錄條目包含以下資訊:

.Alias name(or directory name)
.Alias incarnation number
.File number
.File incarnation number
.Parent directory
.System flag

Alias Directory在每個磁碟組中的檔案號為6(F6)。Alias incarnation number,很像file incarnation number,被用來區分可能重複使用相同別名號的別名或目錄。system flag被設定給系統建立的別名與目錄,但不對使用者建立的別名或目錄進行設定。

在11gr2中執行以下查詢得到如下結果:

SQL> SELECT number_kffxp file#, disk_kffxp disk#,COUNT(disk_kffxp) extents FROM x$kffxp WHERE group_kffxp=3 AND disk_kffxp <>65534 GROUP BY number_kffxp, disk_kffxp;

     FILE#      DISK#    EXTENTS
---------- ---------- ----------
         1          0          1
         1          1          2
         1          2          2
         1          3          1
         2          0          1
         2          1          1
         2          2          1
         3          0         64
         3          1         63
         3          2         64
         3          3         64
         4          0          6
         4          1          5
         4          2          6
         4          3          7
         5          0          1
         5          1          1
         5          3          1
         6          1          1
         6          2          1
         6          3          1
         8          0          1
         8          1          1
         8          2          1
         9          1          1
         9          2          1
         9          3          1
       256          0          1
       256          1          1
       257          0         19
       257          1         19
       257          2         19
       257          3         18
       258          0        611
       258          1        612
       258          2        611
       258          3        611
       259          0        382
       259          1        381
       259          2        381
       259          3        381
       260          0        175
       260          1        174
       260          2        174
       260          3        174
       261          0         77
       261          1         75
       261          2         76
       261          3         77
       262          0         52
       262          1         51
       262          2         51
       262          3         51
       263          0          3
       263          1          2
       263          2          4
       263          3          3
       264          0         25
       264          1         26
       264          2         27
       264          3         27
       265          0         27
       265          1         25
       265          2         26
       265          3         27
       266          0         26
       266          1         26
       266          2         26
       266          3         27
       267          0         27
       267          1         26
       267          2         24
       267          3         28
       268          0         11
       268          1         10
       268          2         10
       268          3         11
       269          1          1
       269          2          1
       270          0         52
       270          1         51
       270          2         50
       270          3         52

83 rows selected.

可以看到,file 1到9都是後設資料資訊。前面的file 1到 6與10g中的對應一樣,後面的file 7,file 8,file 9為以下內容:

file# 7 —volume directory (使用ACFS才會有)
file# 8 —disk Used Space Directory (USD)
file# 9 —attributes directory

volume directory
ASM元資訊7號檔案,是ASM的邏輯卷目錄,用於跟蹤與ADVM有關的檔案。
ASM動態邏輯卷裝置是由ASM動態邏輯卷構建的。一個磁碟組中可以配置一個或多個ASM動態邏輯卷裝置。ASM叢集檔案系統透過ADVM介面構建在ASM磁碟組之上。ADVM像資料庫一樣,也是ASM的一個客戶端。當一個邏輯卷被訪問時,相應的ASM檔案會被開啟並且ASM extent的資訊會被髮送到ADVM驅動。

disk Used Space Directory (USD)
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以上時會存在。

attributes directory
Attributes Directory包含了關於磁碟組屬性的後設資料。只有當compatible.asm設定為11.1或更高版本時目錄才會在磁碟組中存在。Attribute Directory在磁碟組中的檔案號為9(F9)(檔案號7與8被保留給將來的功能使用,在11g中file 7為volume directory,file 8為disk Used Space Directory (USD))。AU_SIZE屬性為了引導實際儲存在disk header中。如果compatible.asm

設定為11.1或更高版本那麼compatible.asm將會儲存在PST中,否則compatible.asm將會被儲存在disk header中。在Oracle 11gr1中,compatible.rdbms與disk_repair_time以及compatible.asm被儲存在屬性目錄中。將來的版本將支援額外的屬性。

這裡將使用kfed工具來檢視asm disk header的內容,對於10g首先需要統計kfed工具,如下:

[root@jyrac3 ~]# su - oracle
[oracle@jyrac3 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@jyrac3 lib]$ make -f ins_rdbms.mk ikfed

Linking KFED utility (kfed)
rm -f /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed
gcc -o /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed -L/u01/app/oracle/product/10.2.0/db/rdbms/lib/ -L/u01/app/oracle/product/10.2.0/db/lib/ -

L/u01/app/oracle/product/10.2.0/db/lib/stubs/ -L/usr/lib -lirc  /u01/app/oracle/product/10.2.0/db/lib/s0main.o /u01/app/oracle/product/10.2.0/db/rdbms/lib/sskfeded.o 

/u01/app/oracle/product/10.2.0/db/rdbms/lib/skfedpt.o  /u01/app/oracle/product/10.2.0/db/rdbms/lib/defopt.o -ldbtools10 -lclntsh  `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10 -lmm 

-lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat 

/u01/app/oracle/product/10.2.0/db/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10   -

lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10  -lvsn10 -

lcommon10 -lgeneric10 -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10   `cat 

/u01/app/oracle/product/10.2.0/db/lib/sysliblist` -Wl,-rpath,/u01/app/oracle/product/10.2.0/db/lib -lm    `cat /u01/app/oracle/product/10.2.0/db/lib/sysliblist` -ldl 

-lm   -L/u01/app/oracle/product/10.2.0/db/lib
mv -f /u01/app/oracle/product/10.2.0/db/bin/kfed /u01/app/oracle/product/10.2.0/db/bin/kfedO
mv /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed /u01/app/oracle/product/10.2.0/db/bin/kfed
chmod 751 /u01/app/oracle/product/10.2.0/db/bin/kfed
[oracle@jyrac3 lib]$ which kfed
/u01/app/oracle/product/10.2.0/db/bin/kfed
[oracle@jyrac3 lib]$ cd /u01/app/oracle/product/10.2.0/db/bin/kfed
-bash: cd: /u01/app/oracle/product/10.2.0/db/bin/kfed: Not a directory
[oracle@jyrac3 lib]$ kfed -h
as/mlib         ASM Library [asmlib='lib']
aun/um          AU number to examine or update [AUNUM=number]
aus/z           Allocation Unit size in bytes [AUSZ=number]
blkn/um         Block number to examine or update [BLKNUM=number]
blks/z          Metadata block size in bytes [BLKSZ=number]
ch/ksum         Update checksum before each write [CHKSUM=YES/NO]
cn/t            Count of AUs to process [CNT=number]
d/ev            ASM device to examine or update [DEV=string]
o/p             KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT]
p/rovnm         Name for provisioning purposes [PROVNM=string]
s/eek           AU number to seek to [SEEK=number]
te/xt           File name for translated block text [TEXT=string]
ty/pe           ASM metadata block type number [TYPE=number]

11gR2版本中的kfed工具,你會發現其更為強大了,還具有修復功能,在11gR2中你可以直接使用kfed修復disk header block,如下(11gR2中是不需要編譯即可使用的)

[grid@jyrac1 ~]$ kfed -h
as/mlib         ASM Library [asmlib='lib']
aun/um          AU number to examine or update [AUNUM=number]
aus/z           Allocation Unit size in bytes [AUSZ=number]
blkn/um         Block number to examine or update [BLKNUM=number]
blks/z          Metadata block size in bytes [BLKSZ=number]
ch/ksum         Update checksum before each write [CHKSUM=YES/NO]
cn/t            Count of AUs to process [CNT=number]
de/v            ASM device to examine or update [DEV=string]
dm/pall         Don't suppress repeated lines when dumping corrupt blocks [DMPALL=YES/NO]
o/p             KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT]
p/rovnm         Name for provisioning purposes [PROVNM=string]
s/eek           AU number to seek to [SEEK=number]
te/xt           File name for translated block text [TEXT=string]
ty/pe           ASM metadata block type number [TYPE=number]

下面使用kfed來檢視ASM磁碟頭的內容:
10g操作如下:
查詢磁碟組相關磁碟資訊

SQL> select group_number,disk_number,name,path,redundancy from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           REDUNDANCY
------------ ----------- ------------------------------ ------------------------------ --------------
           0           1                                /dev/raw/raw1                  UNKNOWN
           0           5                                /dev/raw/raw2                  UNKNOWN
           1           1 DATADG_0001                    /dev/raw/raw4                  UNKNOWN
           2           0 YBDG_0000                      /dev/raw/raw5                  UNKNOWN
           2           1 YBDG_0001                      /dev/raw/raw6                  UNKNOWN
           1           0 DATADG_0000                    /dev/raw/raw3                  UNKNOWN

6 rows selected.

查詢磁碟組相關資訊,可以看到ASM磁碟組的塊大小為4096 byte,也就是4K,AU大小為16777216 byte,也就是16M

SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE
------------ ------------------------------ ---------- --------------------
           1 DATADG                               4096             16777216
           2 YBDG                                 4096             16777216

磁碟組1為DATADG用來儲存資料庫相關檔案,它包含兩塊磁碟/dev/raw/raw3與/dev/raw/raw4,磁碟頭儲存在AU0的第一個塊,即block 0

[oracle@jyrac3 lib]$ kfed read /dev/raw/raw3 aun=0 blkn=0
kfbh.endian:                          1 ; 0x000: 0x01   --01即使1 表示的是Little Endian 相反,0的話即使表示BIG endian
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD --表示塊型別為磁碟頭
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: T=0 NUMB=0x0    --表示ASM塊號,0表示ASM磁碟頭塊
kfbh.block.obj:              2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check:                  2110140068 ; 0x00c: 0x7dc62ea4
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    --ASMLIB磁碟是ORCLDISK+磁碟名,非ASMLIB磁碟是ORCLDISK
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:                168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000        --ASM磁碟編號
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL --磁碟組冗餘方式為正常冗餘
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER --磁碟header 狀態  3是可用狀態
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11     --ASM磁碟名
kfdhdb.grpname:                  DATADG ; 0x048: length=6      --ASM磁碟組名
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11     --ASM故障組名
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000      --ASM後設資料塊大小,單位是byte,大小為4K
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000  --au單位大小,單位是byte,大小為16M
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140  --該disk的大小,單位是au,由於au是16m,所以大小為5G
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001  --指標指向ASM的空閒空間表,1代表本AU中的ASM塊1
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002  --指標指向ASM的分配表,2代表本AU中的ASM塊2
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002  --指標指向ASM的檔案目錄,2代表本ASM磁碟的AU2
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 --最小的資料庫相容版本,0x0a100000=10.1
kfdhdb.grpstmp.hi:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
kfdhdb.ub4spare[0]:                   0 ; 0x0ec: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x0f0: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x0f4: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x114: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x118: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x120: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[54]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[55]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[56]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[57]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

上述kfed命令的輸出結果顯示這個asm塊有兩種型別的資料 以kfbh為字首的塊頭資訊和以kfdhdb為字首的ASM磁碟頭資訊。實際上,每個ASM後設資料塊都會有塊頭資訊和與塊型別相匹配的一些相關資料。

disk header中重要的ASM後設資料
kfbh.endian--系統字序,0表示大字序,1表示小字序
kfbh.type--ASM塊型別,kfbtyp_diskhead表示這是一個ASM磁碟頭型別塊
kfbh.block.blk--ASM塊號,0表示ASM磁碟頭塊的塊編號

disk header中重要的ASM磁碟頭資料
kfdhdb.driver.provstr--ASMLIB磁碟是ORCLDISK+磁碟名,非ASMLIB磁碟是ORCLDISK
kfdhdb.dsknum--ASM磁碟編號
kfdhdb.grptyp--磁碟冗餘級別,KFDGTP_EXTERNAL代表external級別,KFDGTP_NORMAL代表normal級別,KFDGTP_HIGH代表high級別
kfdhdb.hdrsts--ASM磁碟頭狀態。v$ASM_DISK.HEADER_STATUS檢視內包含的所有可能的狀態
kfdhdb.dskname--ASM磁碟名
kfdhdb.grpname--ASM磁碟組名
kfdhdb.fgname --ASM故障組名
kfdhdb.crestmp.hi--磁碟新增到磁碟組的時間指示年,月,日,小時
kfdhdb.crestmp.lo--磁碟新增到磁碟組的時間指示分,秒,毫秒,微秒
kfdhdb.mntstmp.hi--磁碟最近一次被mount的時間指示年,月,日,小時
kfdhdb.mntstmp.lo--磁碟最近一次被mount的時間指示分,秒,毫秒,微秒
kfdhdb.secsize--磁碟的扇區大小(bytes)
kfdhdb.blksize--ASM後設資料塊的大小(bytes)
kfdhdb.ausize--Allocation unit分配單元大小(byte),預設的AU大小為1MB,我這裡的AU為16MB
kfdhdb.dsksize--磁碟大小(以au為單位)。本例中的磁碟大小為AU*dsksize=16M*320=5GB
kfdhdb.fstlocn--指標指向ASM的空閒空間表,1代表本AU中的ASM塊1
kfdhdb.altlocn--指標指向ASM的分配表,2代表本AU中的ASM塊2
kfdhdb.f1b1locn--指標指向ASM的檔案目錄,2代表本ASM磁碟的AU2
kfdhdb.dbcompat--最小的資料庫相容版本,0x0a100000=10.1
kfdhdb.grpstmp.hi--指標指向ASM磁碟組建立的時間指示年,月,日,小時
kfdhdb.grpstmp.lo--指標指向ASM磁碟組建立的時間指示分,秒,毫秒,微秒

對於11G還增加了以下內容
kfdhdb.vfstart-- Clusterware voting磁碟AU分配單元的開始AU編號。如果為0,表示磁碟不包含 voting磁碟資料。本特性只限於11.2或更高版本
kfdhdb.vfend -- Clusterware voting磁碟AU分配單元的結束AU編號。如果為0,表示磁碟不包含 voting磁碟資料。本特性只限於11.2或更高版本
kfdhdb.spfile--ASM spfile引數檔案的AU號。本特性限於11.2或更高版本
kfdhdb.spfflg--ASM spfile引數檔案標識。如果這個值是1,ASM spfile引數檔案則位於本磁碟的kfdhdb.spfile引數的AU。本特性限於11.2或更高版本

[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=0
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:              2147483651 ; 0x008: disk=3
kfbh.check:                  3693686874 ; 0x00c: 0xdc29305a
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:                        3 ; 0x024: 0x0003
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0000 ; 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
kfdhdb.f1b1locn:                      0 ; 0x0d4: 0x00000000
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
kfdhdb.grpstmp.hi:             33042831 ; 0x0e4: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:           2456264704 ; 0x0e8: USEC=0x0 MSEC=0x1e8 SECS=0x26 MINS=0x24
kfdhdb.vfstart:                       0 ; 0x0ec: 0x00000000
kfdhdb.vfend:                         0 ; 0x0f0: 0x00000000
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[0]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x114: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x118: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x120: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

ASM disk header的備份
ASM從10.2.0.5版本開始,磁碟頭塊的資訊會自動備份到AU1的倒數第二個ASM後設資料塊中。知道AU的塊大小和ASM後設資料塊的大小後,就能找到倒數第二個塊的塊編號。透過kfed工具可以從塊頭中讀取到這些資訊,並計算出AU1的倒數第二個塊的塊編號。

可以執行以下方法來進行計算第二個AU的倒資料第二個塊的塊編號

ausize=`kfed read /dev/disk | grep ausize | tr -s ' ' | cut -d' ' -f2`
blksize=`kfed read /dev/disk| grep blksize | tr -s ' ' | cut -d' ' -f2`
let n=$ausize/$blksize-2
echo $n

(ausize/blsize)-2

可以執行以下方法來進行計算第二個AU的倒資料第二個塊所對應的整體塊編號

(ausize/blsize)*2-2

例如在10.2.0.5計算第二個AU的倒資料第二個塊的塊編號的操作如下:

[oracle@jyrac3 ~]$ ausize=`kfed read /dev/raw/raw3 | grep ausize | tr -s ' ' | cut -d' ' -f2`
[oracle@jyrac3 ~]$ blksize=`kfed read /dev/raw/raw3 | grep blksize | tr -s ' ' | cut -d' ' -f2`
[oracle@jyrac3 ~]$ let n=$ausize/$blksize-2
[oracle@jyrac3 ~]$ echo $n
4094

SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE
------------ ------------------------------ ---------- --------------------
           1 DATADG                               4096             16777216
           2 YBDG                                 4096             16777216

SQL> select 16777216/4096-2 from dual;

16777216/4096-2
---------------
           4094

例如在10.2.0.5進行計算第二個AU的倒資料第二個塊所對應的整體塊編號

SQL> select (16777216/4096)*2-2 from dual; 

(16777216/4096)*2-2
-------------------
               8190

其實計算第二個AU的倒資料第二個塊所對應的整體塊編號還可以跟蹤kfed repair命令來檢視它所讀取的塊號

[oracle@jyrac3 ~]$ strace -o trace_raw3 kfed repair /dev/raw/raw3 ausz=16777216
[oracle@jyrac3 ~]$ cat trace_raw3 
....省略....
open("/dev/raw/raw3", O_RDWR|O_LARGEFILE) = 5
_llseek(5, 33546240, [33546240], SEEK_SET) = 0
read(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
_llseek(5, 0, [0], SEEK_SET)            = 0
read(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
_llseek(5, 0, [0], SEEK_SET)            = 0
write(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096
close(5)                                = 0
munmap(0x476000, 143360)                = 0
munmap(0x2bd000, 143360)                = 0
exit_group(0)                           = ?

從上面的4096可知每次讀取4096 byte也就是4K,而從_llseek(5, 33546240, [33546240], SEEK_SET) = 0可以計算出來所在的塊號=33546240/4096=8190,8190也就是磁碟頭備份資訊所對應的整體塊號
下面檢視10.2.0.5的磁碟頭備份資訊

[oracle@jyrac3 ~]$ kfed read /dev/raw/raw3  aun=1 blkn=4094 aus=16777216
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: T=0 NUMB=0x0
kfbh.block.obj:              2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check:                  2110140068 ; 0x00c: 0x7dc62ea4
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:                168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002
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
kfdhdb.grpstmp.hi:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
kfdhdb.ub4spare[0]:                   0 ; 0x0ec: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x0f0: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x0f4: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x114: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x118: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x120: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[54]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[55]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[56]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[57]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

能夠看到與AU0的後設資料塊0相同的內容。當磁碟頭被破壞或者丟失時,這個備份將是非常有用的。只需要執行kfed repair [磁碟名]命令即可修復,如果AU大小不是預設的1MB,還需要指定AU大小的具體值。 所上面的命令指定了aus引數

使用第二個AU的倒資料第二個塊所對應的整體塊編號來檢視備份的磁碟頭資訊

[oracle@jyrac3 ~]$ kfed read /dev/raw/raw3  blkn=8190
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: T=0 NUMB=0x0
kfbh.block.obj:              2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check:                  2110140068 ; 0x00c: 0x7dc62ea4
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:                168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:             DATADG_0000 ; 0x028: length=11
kfdhdb.grpname:                  DATADG ; 0x048: length=6
kfdhdb.fgname:              DATADG_0000 ; 0x068: length=11
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000
kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002
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
kfdhdb.grpstmp.hi:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0
kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
kfdhdb.ub4spare[0]:                   0 ; 0x0ec: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x0f0: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x0f4: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x114: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x118: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x120: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[54]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[55]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[56]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[57]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

能夠看到與AU0的後設資料塊0相同的內容。

例如在11g計算第二個AU的倒資料第二個塊的塊編號的操作如下:

[grid@jyrac1 ~]$ ausize=`kfed read /dev/raw/raw10 | grep ausize | tr -s ' ' | cut -d' ' -f2`
[grid@jyrac1 ~]$ blksize=`kfed read /dev/raw/raw10 | grep blksize | tr -s ' ' | cut -d' ' -f2`
[grid@jyrac1 ~]$ let n=$ausize/$blksize-2
[grid@jyrac1 ~]$ echo $n
254

SQL> set long 400
SQL> set linesize 400
SQL> col name for a30
SQL> col path for a30
SQL> select group_number,disk_number,name,path,redundancy from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAME                           PATH                           REDUNDANCY
------------ ----------- ------------------------------ ------------------------------ --------------
           3           0 DATADG_0001                    /dev/raw/raw11                 UNKNOWN
           4           0 DATA_NRML_0000                 /dev/raw/raw5                  UNKNOWN
           3           3 DATADG_0000                    /dev/raw/raw10                 UNKNOWN
           1           1 ARCHDG_0001                    /dev/raw/raw9                  UNKNOWN
           4           3 DATA_NRML_0003                 /dev/raw/raw12                 UNKNOWN
           4           2 DATA_NRML_0002                 /dev/raw/raw7                  UNKNOWN
           2           1 CRSDG_0001                     /dev/raw/raw8                  UNKNOWN
           4           1 DATA_NRML_0001                 /dev/raw/raw6                  UNKNOWN
           1           0 ARCHDG_0000                    /dev/raw/raw2                  UNKNOWN
           3           1 DATADG_0003                    /dev/raw/raw4                  UNKNOWN
           4           4 DATA_NRML_0004                 /dev/raw/raw13                 UNKNOWN
           3           2 DATADG_0002                    /dev/raw/raw3                  UNKNOWN
           2           0 CRSDG_0000                     /dev/raw/raw1                  UNKNOWN
           4           5 DATA_NRML_0005                 /dev/raw/raw14                 UNKNOWN

14 rows selected.

SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup;

GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE
------------ ------------------------------ ---------- --------------------
           1 ARCHDG                               4096              1048576
           2 CRSDG                                4096              1048576
           3 DATADG                               4096              1048576
           4 DATA_NRML                            4096              1048576

SQL> select 1048576/4096-2 from dual;

1048576/4096-2
--------------
           254

例如在11g進行計算第二個AU的倒資料第二個塊所對應的整體塊編號

SQL> select (1048576/4096)*2-2 from dual;

(1048576/4096)*2-2
------------------
               510

對於預設的磁碟組,AU Size=1M ,每個AU中可以儲存256個塊,塊號為0-255 。第1個AU儲存256個塊,第2個AU最後1個塊號為255,倒數第2個塊號是254,也就是整體的第510個塊(從第1個AU的第1個塊往後算起)。

使用bbed檢視asm disk header
首先使用dd命令將disk header匯出

[oracle@jyrac3 lib]$ dd if=/dev/raw/raw3 bs=4096 count=1 of=/u01/app/oracle/raw3_asm_header
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.0181451 seconds, 226 kB/s

使用bbed進行檢視

[oracle@jyrac3 bin]$ ./bbed
Password: 

BBED: Release 2.0.0.0.0 - Limited Production on Tue Dec 20 20:50:58 2016

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> set filename '/u01/app/oracle/raw3_asm_header'
        FILENAME        /u01/app/oracle/raw3_asm_header
BBED> show all
        FILE#           0
        BLOCK#          1  --這裡顯示的是file:0,block 1
        OFFSET          0
        DBA             0x00000000 (0 0,1)
        FILENAME        /u01/app/oracle/raw3_asm_header
        BIFILE          bifile.bbd
        LISTFILE       
        BLOCKSIZE       512
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No
BBED> map /v   --檢視block1裡的詳細資訊
 File: /u01/app/oracle/raw3_asm_header (0)
 Block: 1                                     Dba:0x00000000
------------------------------------------------------------
 Undo Segment Header

 struct kcbh, 20 bytes                      @0  --kcbh 的結構佔用了20個bytes,@表示該資訊在block裡的偏移量,即offset值     
    ub1 type_kcbh                           @0       
    ub1 frmt_kcbh                           @1       
    ub1 spare1_kcbh                         @2       
    ub1 spare2_kcbh                         @3       
    ub4 rdba_kcbh                           @4       
    ub4 bas_kcbh                            @8       
    ub2 wrp_kcbh                            @12      
    ub1 seq_kcbh                            @14      
    ub1 flg_kcbh                            @15      
    ub2 chkval_kcbh                         @16      
    ub2 spare3_kcbh                         @18      

 struct ktect, 44 bytes                     @20      
    ub4 ktectspare                          @20      
    word ktecttsn                           @24      
    ub4 ktectobj                            @28      
    ub4 ktectnex                            @32      
    ub2 ktecttbe                            @36      
    ub4 ktectcex                            @40      
    ub4 ktectces                            @44      
    ub4 ktectcbk                            @48      
    struct ktectxid, 8 bytes                @52      
    ub1 ktectlck                            @60      

 struct ktetb[1], 8 bytes                   @64      
    ub4 ktetbdba                            @64      
    ub4 ktetbnbk                            @68      

 struct ktuxc, 104 bytes                    @18776   
    struct ktuxcscn, 8 bytes                @18776   
    struct ktuxcuba, 8 bytes                @18784   
    sb2 ktuxcflg                            @18792   
    ub2 ktuxcseq                            @18794   
    sb2 ktuxcnfb                            @18796   
    ub4 ktuxcinc                            @18800   
    sb2 ktuxcchd                            @18804   
    sb2 ktuxcctl                            @18806   
    ub2 ktuxcmgc                            @18808   
    ub4 ktuxcopt                            @18816   
    struct ktuxcfbp[5], 60 bytes            @18820   

 struct ktuxe[255], 10200 bytes             @18880   
    ub4 ktuxexid                            @18880   
    ub4 ktuxebrb                            @18884   
    struct ktuxescn, 8 bytes                @18888   
    sb4 ktuxesta                            @18896   
    ub1 ktuxecfl                            @18897   
    sb2 ktuxeuel                            @18898   

 ub4 tailchk                                @508     
BBED> p kcbh                 --檢視kcbh 結構裡的具體值
struct kcbh, 20 bytes                       @0       
   ub1 type_kcbh                            @0        0x01
   ub1 frmt_kcbh                            @1        0x82
   ub1 spare1_kcbh                          @2        0x01
   ub1 spare2_kcbh                          @3        0x01
   ub4 rdba_kcbh                            @4        0x00000000
   ub4 bas_kcbh                             @8        0x80000000
   ub2 wrp_kcbh                             @12       0x2ea4
   ub1 seq_kcbh                             @14       0xc6
   ub1 flg_kcbh                             @15       0x7d (KCBHFNEW, KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x0000
   ub2 spare3_kcbh                          @18       0x0000
BBED> d /v count 4096              --dump 這個block,檢視具體內容
 File: /u01/app/oracle/raw3_asm_header (0)
 Block: 1       Offsets:    0 to  511  Dba:0x00000000
-------------------------------------------------------
 01820101 00000000 00000080 a42ec67d l ...............}
 00000000 00000000 00000000 00000000 l ................
 4f52434c 4449534b 00000000 00000000 l ORCLDISK........
 00000000 00000000 00000000 00000000 l ................
 0000100a 00000203 44415441 44475f30 l ........DATADG_0
 30303000 00000000 00000000 00000000 l 000.............
 00000000 00000000 44415441 44470000 l ........DATADG..
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 44415441 44475f30 l ........DATADG_0
 30303000 00000000 00000000 00000000 l 000.............
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 5130f801 00d0b319 l ........Q0......
 6d30f801 00e85ca9 00020010 00000001 l m0....\.........
 80ee0600 40010000 02000000 01000000 l ....@...........
 02000000 02000000 00000000 00000000 l ................
 0000100a 5130f801 00549019 00000000 l ....Q0...T......
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................
 00000000 00000000 00000000 00000000 l ................

 <16 bytes per line>

BBED> 

這裡每行16個位元組,即每塊4個位元組,如:01820101,這塊就由01,82,01和01這4個位元組組成。
1)第1個byte 01--這裡是對應的kfbh.endian 01即使1 表示的是Little Endian 相反,0的話即使表示BIGendian
2)第2個byte 82--這裡對應kfbh.hard
3)第3個byte 01--這裡對應kfbh.type
4)第4個byte 01--這裡對應的是kfbh_datfmt
5)第5~8個byte 00 00 0000---這裡對應的是kfbh.block.blk
6)第9~12個byte00 08 0008---這裡對應的是kfbh.block.obj
7)第13~16個byte a42ec67d---這裡對應的是kfbh.check(0x7dc62ea4) 因為作業系統是Little Endian的原因顯示的內容與kfed讀取到的是相反的
8)第17~20個byte00000000 ---這裡對應的是kfbh.fcn.base
9)第21~23個byte 00000000---這裡對應的是kfbh.fcn.wrap
10)第24~27個byte 00000000 ---這裡對應的是kfbh.spare1
11)第28~32個byte 00000000 ---這裡對應的是kfbh.spare2
12)第33~40個byte 4f52434c 4449534b---這裡對應的是kfdhdb.driver.provstr --從上面的dump資訊可以看出具體的值
13)第41~64個byte 00 00 00 00 ---這裡對應的是kfdhdb.driver.reserved[0] ~~kfdhdb.driver.reserved[5]
14)第65~68個byte 0000100a ---這裡對應的是kfdhdb.compat即使我們的oracle版本號
15)第69~70個byte 0000 ---這裡對應的是kfdhdb.dsknum 即使disk numer 取值範圍 0~65335
16)第71個byte 02 ---這裡對應的是kfdhdb.grptyp 即磁碟組的冗餘方式 02 表示normal冗餘
下面對該值的屬性做一下補充:
KFDGTP_INVALID((kfdgtp)0)-- Illegal value
KFDGTP_EXTERNAL ((kfdgtp)1)-- External redundancy
KFDGTP_NORMAL ((kfdgtp)2)-- Normal redundancy
KFDGTP_HIGH ((kfdgtp)3)-- High redundancy

17)第72個byte 03 ---這裡對應是kfdhdb.hdrsts即disk group的狀態 03表示正常(這裡非常重要)
下面對改值的熟悉做一下補充:
KFDHDR_INVALID((kfdhdr)0)--Illegal value
KFDHDR_UNKNOWN((kfdhdr)1) --Disk header block unreadable
KFDHDR_CANDIDATE((kfdhdr)2) --No OSM or OS disk header found
KFDHDR_MEMBER ((kfdhdr)3) --Normal member of the group ---03 正常狀態
KFDHDR_FORMER ((kfdhdr)4) --Disk dropped cleanly from group
KFDHDR_CONFLICT ((kfdhdr)5) --Header conflicts
KFDHDR_INCOMPAT ((kfdhdr)6) --Written by incompatible software
KFDHDR_PROVISIONED ((kfdhdr)7) --Disk was preparedbeforehand
18)第73~104個byte44415441 44475f30 到00000000 32個byte ---這裡對應的是kfdhdb.dskname 即磁碟名稱 我們這裡的DATADG_0000
19) 第105~~136個byte 44415441 44470000 到00000000 32個byte ---這裡對應的是kfdhdb.grpname 即是磁碟組名稱 DATADG
20)第137~ 168個byte 也是44415441 44475f301開始 32個byte ---這裡對應的是kfdhdb.fgname即failgroup name DATADG_0000
21)第169~200 個byte一共32個byte ---這裡對應的是kfdhdb.capname 即是Capacitygroup name當然我這裡沒有使用
22)第201~204個byte 5130f801 一共4個byte ---這裡對應的是kfdhdb.crestmp.hi 即Creation timestamp high

SQL> select to_number('01f83051','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01F83051','XXXXXXXX
------------------------------
                      33042513

kfdhdb.crestmp.hi:             33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0


SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('2','xxxxxxxxxxxxxx') day,to_number('11','xxxxxxxxxxxxxx') hour from 

dual;
      YEAR      MONTH        DAY       HOUR
---------- ---------- ---------- ----------
      2016         12          2         17

23)第205~208個byte 00d0b319 一共4個byte ---這裡對應的是kfdhdb.crestmp.lo 即Creation timestamp low

SQL> select to_number('19b3d000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('19B3D000','XXXXXXXX
------------------------------
                     431214592

kfdhdb.crestmp.lo:            431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6
SQL> select to_number('6','xxxxxxxxxxxxxx') min,to_number('1b','xxxxxxxxxxxxxx') sec,to_number('f4','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual;
       MIN        SEC         MS         US
---------- ---------- ---------- ----------
         6         27        244          0

與alert_+ASM1.log中的磁碟組建立時間相符

SQL> CREATE DISKGROUP datadg Normal REDUNDANCY  DISK '/dev/raw/raw3' SIZE 5120M ,
'/dev/raw/raw4' SIZE 5120M   

Fri Dec 02 17:06:27 CST 2016

24)第209~212個byte 6d30f801 一共4個byte ---這裡對應的是kfdhdb.mntstmp.hi

SQL> select to_number('01f8306d','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01F8306D','XXXXXXXX
------------------------------
                      33042541
kfdhdb.mntstmp.hi:             33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0
SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('3','xxxxxxxxxxxxxx') day,to_number('d','xxxxxxxxxxxxxx') hour from 

dual;
      YEAR      MONTH        DAY       HOUR
---------- ---------- ---------- ----------
      2016         12          3         13

25)第213~216個byte 00e85ca9 一共4個byte ---這裡對應的是kfdhdb.mntstmp.lo

SQL> select to_number('a95ce800','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('A95CE800','XXXXXXXX
------------------------------
                    2841438208

kfdhdb.mntstmp.lo:           2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a
SQL> select to_number('2a','xxxxxxxxxxxxxx') min,to_number('15','xxxxxxxxxxxxxx') sec,to_number('33a','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from 

dual;
       MIN        SEC         MS         US
---------- ---------- ---------- ----------
        42         21        826          0

與alert_+ASM1.log中的磁碟組mount時間相符

Sat Dec 03 13:42:21 CST 2016
NOTE: 
cache mounting group 1/0xB7D9694E (DATADG) succeeded

SUCCESS: diskgroup DATADG was mounted

26)第217~218一共2個byte 0002 ---這裡對應的是kfdhdb.secsize 即physical sector size of the disk

SQL> select to_number('0200','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('0200','XXXXXXXXXXXX
------------------------------
                           512
 kfdhdb.secsize:                     512 ; 0x0b8: 0x0200

27)第219~220一共2個byte 0010 ---這裡對應的是fdhdb.blksize即metadata blocksize asm block大小

SQL> select to_number('1000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('1000','XXXXXXXXXXXX
------------------------------
                          4096
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000

28)第221~224一共4個byte 00000001 ---這裡對應的是kfdhdb.ausize即AU 的大小16777216 即是16m

SQL> select to_number('01000000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01000000','XXXXXXXX
------------------------------
                      16777216
kfdhdb.ausize:                 16777216 ; 0x0bc: 0x01000000


29)第225~228一共4個byte 80ee0600---這裡對應的是kfdhdb.mfact 即Stride between physical addresses of allocation units

SQL> select to_number('0006ee80','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('0006EE80','XXXXXXXX
------------------------------
                        454272

kfdhdb.mfact:                    454272 ; 0x0c0: 0x0006ee80

30)第229~232一共4個byte 40010000 ---這裡對應的是kfdhdb.dsksize 即0x00000140 轉換為10進位制後為320,即320個分配units =磁碟大小=320*16=5120M=5G

SQL> select to_number('00000140','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000140','XXXXXXXX
------------------------------
                           320
kfdhdb.dsksize:                     320 ; 0x0c4: 0x00000140

31)第233~236一共4個byte 02000000---這裡對應的是kfdhdb.pmcnt 這裡該值是2即 Number of physically addressed allocation units

SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000002','XXXXXXXX
------------------------------
                             2
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002

32)第237~240一共4個byte 01000000 ---這裡對應的是kfdhdb.fstlocn即First FreeSpace table block number used to find freespace。

SQL> select to_number('00000001','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000001','XXXXXXXX
------------------------------
                             1

kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001

33)第241~244一共4個byte 02000000 ---這裡對應的是kfdhdb.altlocn即First Alocation table block numer used to find allocated space

SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000002','XXXXXXXX
------------------------------
                             2
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002

34)第245~248 一共4個byte 02000000 ---這裡對應的是kfdhdb.f1b1locn 即File Directory block 1 Allocation Unit number. Beginging for filedirectory

SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('00000002','XXXXXXXX
------------------------------
                             2
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002

即是第一個file directory 通常這裡是2

35)第249~250一共2個byte 0000 ---這裡對應的是kfdhdb.redomirrors[0]
36)第251~252一共2個byte 0000 ---這裡對應的是kfdhdb.redomirrors[1]
37)第253~254一共2個byte 0000 ---這裡對應的是kfdhdb.redomirrors[2]
38)第255~256一共2個byte 0000 ---這裡對應的是kfdhdb.redomirrors[3]

39)第257~260一共4個byte 0000100a---這裡對應的是kfdhdb.dbcompat 轉換以為即為我們的資料庫版本

SQL> select to_number('0a100000','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('0A100000','XXXXXXXX
------------------------------
                     168820736
kfdhdb.dbcompat:              168820736 ; 0x0e0: 0x0a100000


40)第260~264一共4個byte 5130f801 ---這裡對應的是kfdhdb.grpstmp.hi

SQL> select to_number('01f83051','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('01F83051','XXXXXXXX
------------------------------
                      33042513

kfdhdb.grpstmp.hi:             33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0

SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('2','xxxxxxxxxxxxxx') day,to_number('11','xxxxxxxxxxxxxx') hour from 

dual;
      YEAR      MONTH        DAY       HOUR
---------- ---------- ---------- ----------
      2016         12          2         17

41)第265~268 一共4個byte 00549019 ---這裡對應的是kfdhdb.grpstmp.lo

SQL> select to_number('19905400','xxxxxxxxxxxxxx') from dual;
TO_NUMBER('19905400','XXXXXXXX
------------------------------
                     428889088

kfdhdb.grpstmp.lo:            428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6
SQL> select to_number('6','xxxxxxxxxxxxxx') min,to_number('19','xxxxxxxxxxxxxx') sec,to_number('15','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual;
       MIN        SEC         MS         US
---------- ---------- ---------- ----------
         6         25         21          0



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

相關文章