從版本12.1開始,asm會對某些實體中繼資料做一份複制,具體的說是每個磁盤的第一個au(0号au)上中繼資料。這意味着,asm同時維護着兩份磁盤頭、fst(free space table)表、at(allocation table)表的資料。需要注意的是asm對這些資料采用的是複制(replicate),而不是鏡像(mirror)。asm鏡像(mirror)意味着把一份資料,拷貝到不同磁盤上;而實體中繼資料的副本位于相同的磁盤,是以使用的術語複制(replicate)。這意味着在external備援的磁盤組中,實體中繼資料也會被複制。
pst也是實體中繼資料,但是asm是通過鏡像,而不是複制來提供資料保護。是以隻有在normal和high備援的磁盤組中,pst表存在資料的備援。
實體中繼資料位于每塊asm磁盤的0号au。中繼資料複制的特性打開後,asm會把0号au的内容拷貝到11号au,然後同時維護這兩份副本。建立磁盤組時如果指定或修改了一個已經存在的磁盤組的compatibility屬性為12.1及以上,該特性會自動被打開。
當提升asm compatibility屬性值為12.1及以上時,如果11号au有資料,asm将把這些資料移動到别處,然後将實體中繼資料複制到11号au。
從版本11.1.0.7開始,asm在1号au的倒數第二個塊維護了一份磁盤頭的副本。在版本12.1中,asm仍然維護着這個副本資料。也就是說,現在每個asm磁盤,有磁盤頭的三個副本。
通過查詢磁盤組的屬性phys_meta_replicated可以确認實體中繼資料複制的狀态。比如下面這個例子:
$ asmcmd lsattr -g data -l phys_meta_replicated
name value
phys_meta_replicated true
phys_meta_replicated值為true意味着磁盤組data的實體中繼資料已經做了複制。
asm磁盤頭的fdhdb.flags條目指代了實體中繼資料的複制狀态:
· kfdhdb.flags = 0 -- 中繼資料沒有複制
· kfdhdb.flags = 1 -- 中繼資料已經複制完畢
· kfdhdb.flags = 2 -- 中繼資料在複制過程中
一旦kfdhdb.flags被設定為1,就再也不會回到0.
如前面所述,在asm相容性設定為12.1或更高的磁盤組中,實體中繼資料會做複制。 下面通過兩個例子來驗證前面的結論:
1. 磁盤組的asm相容性設定為12.1:
$ asmcmd lsattr -g data -l compatible.asm
compatible.asm 12.1.0.0.0
這裡顯示實體中繼資料已經被複制。下面确認該磁盤組裡的所有磁盤kfdhdb.flags被設為1:
$ for disk in `asmcmd lsdsk -g data --suppressheader`; do kfed read $disk | egrep
"dskname|flags"; done
kfdhdb.dskname: data_0000 ; 0x028: length=9
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
kfdhdb.dskname: data_0001 ; 0x028: length=9
kfdhdb.dskname: data_0002 ; 0x028: length=9
kfdhdb.dskname: data_0003 ; 0x028: length=9
可以看到所有磁盤的kfdhdb.flags都被設為1,也就是該磁盤組裡所有的磁盤都做了實體中繼資料複制。
1. 我們來看下磁盤組的asm compatibility為11.2,然後提升至12.1會是什麼情況:
sql> create diskgroup dg1 external redundancy
2 disk '/dev/sdi1'
3 attribute 'compatible.asm'='11.2';
diskgroup created.
看一下複制的狀态:
$ asmcmd lsattr -g dg1 -l phys_meta_replicated
可以看到,由于asm相容性低于12.1,沒有physmetareplicated特性。下面通過kfed檢視kfdhdb.flags參數,按照之前的結論,值應該為0:
$ kfed read /dev/sdi1 | egrep "type|dskname|grpname|flags"
kfbh.type: 1 ; 0x002: kfbtyp_diskhead
kfdhdb.dskname: dg1_0000 ; 0x028: length=8
kfdhdb.grpname: dg1 ; 0x048: length=3
kfdhdb.flags: 0 ; 0x0fc: 0x00000000
現在把asm相容性修改到12.1:
$ asmcmd setattr -g dg1 compatible.asm 12.1.0.0.0
确認下複制的狀态:
實體中繼資料做了複制,是以kfdhdb.flags應該設定為1:
$ kfed read /dev/sdi1 | egrep "dskname|flags"
實體中繼資料應該被複制到11号au:
$ kfed read /dev/sdi1 aun=11 | egrep "type|dskname|flags"
$ kfed read /dev/sdi1 aun=11 blkn=1 | grep type
kfbh.type: 2 ; 0x002: kfbtyp_freespc
$ kfed read /dev/sdi1 aun=11 blkn=2 | grep type
kfbh.type: 3 ; 0x002: kfbtyp_alloctbl
這裡顯示11号au中有了一份0号au的資料副本。
最後确認下1号au中的磁盤頭副本:
$ kfed read /dev/sdi1 aun=1 blkn=254 | grep type
結果顯示在1号au的倒數第二個塊中存在一份磁盤頭副本。
12版本的asm會把0号au的資料在相同磁盤的11号au做一份複制。這種特性可以讓asm在磁盤的0号au發生資料損壞時,自動恢複資料。需要注意的是,在external備援的磁盤組中,如果是實體中繼資料以外的資料發生丢失,asm都不能做恢複。在normal備援的磁盤組中,一個failgroup中的一塊或多塊磁盤有任何的資料丢失,asm都可以做恢複。在high備援的磁盤組中,任意兩個failgroup中的一塊或多塊磁盤有任何資料丢失,asm都可以做恢複。
<b>本文來自雲栖社群合作夥伴“dbgeek”</b>