asm的資料備援機制是通過将extent的鏡像副本複制到同一磁盤組不同failgroup的磁盤上來實作的,這個磁盤被稱為partner磁盤。在11gr2版本,一個備援(normal,high)的磁盤組,每一個asm磁盤最多可以擁有8個partner磁盤,而在11gr2版本之前每一個磁盤最多擁有10個partner。在external備援方式的磁盤組内既沒有failgroup,磁盤之間也沒有partner關系。
譯者注:1)其實外部備援的磁盤組每一個磁盤也會配置設定一個獨立failgroup的名字,可以通過查詢視圖v$asm_disk檢視到,但是它并不具有真實的意義。2)可以通過隐含參數_asm_partner_target_disk_part來調整partner的數量,但是譯者還實在沒想到理由去這麼做。
如果一個normal備援的磁盤組擁有兩個磁盤,它們之間就是partner關系。所有在磁盤0上的extent都在磁盤1上有鏡像副本,反之亦然,這種情況下,每個磁盤有一個partner(互為partner)。
如果一個normal備援的磁盤組擁有三個磁盤,同時沒有手工指定failgroup的情況下,每個磁盤将擁有兩個partner。磁盤0與磁盤1、2有partner關系,磁盤1與磁盤0、2有partner關系,磁盤2與磁盤0、1有partner關系。當有一個extent配置設定到磁盤0時,它的鏡像副本将被配置設定到磁盤1或者2,但是不是兩者都有,注意,一個normal備援的磁盤組内每個extent隻有兩份鏡像副本,而不是三個。同理,磁盤1上的一個extent,它的鏡像副本會在磁盤0或磁盤2上,磁盤2上的一個extent會有一個鏡像副本在磁盤0或磁盤1,整個配置設定方式還是比較簡單清晰的。
譯者注:如果是中繼資料的extent,會在normal備援的磁盤組上有三份副本,當然假如failgroup的數量大于等于三。
由3個磁盤組成high備援磁盤組的情況與此類似。磁盤間的parnter關系與上一段所述的3個磁盤組成normal備援磁盤組完全一緻。不同點在于鏡像級别,磁盤0上的每個extent會在parnter磁盤即磁盤1和磁盤2上都有鏡像副本。磁盤1上的每個extent也是一樣的,在磁盤0和磁盤2上都有鏡像副本。磁盤2上的extent在磁盤0和磁盤2上都有鏡像副本。
如果一個normal備援的磁盤組有很多磁盤,那麼每個磁盤最多會有8個partner。也就是說在任一磁盤上的一個extent會在它的8個partner的磁盤上有一個副本。讓我們牢記這一點,(normal備援情況下)一個extent永遠隻會在某個partner磁盤上有一份鏡像副本。
通過查詢x$kfdpartner視圖可以找出關于磁盤partner關系的更多細節。讓我們來看一個多磁盤的磁盤組的例子:
sql> select count(disk_number)
from v$asm_disk
where group_number = 1;
count(disk_number)
------------------
168
查詢結果顯示磁盤組内包含的磁盤數量着實不少,接下來看單個磁盤擁有多少個partner:
sql> select disk "disk", count(number_kfdpartner) "number of partners"
from x$kfdpartner
where grp=1
group by disk
order by 1;
disk number of partners
---------- ------------------
0 8
1 8
2 8
...
165 8
166 8
167 8
168 rows selected.
查詢結果顯示單個磁盤都準确的擁有8個partner磁盤。(可以看出這裡的環境是一個11gr2或以上版本的資料庫)
接下來查詢每個磁盤組裡每個磁盤的partner關系資訊:
sql> set pages 1000
sql> break on group# on disk#
sql> select d.group_number "group#", d.disk_number "disk#", p.number_kfdpartner "partner disk#"
from x$kfdpartner p, v$asm_disk d
where p.disk=d.disk_number and p.grp=d.group_number
order by 1, 2, 3;
group# disk# partner disk#
---------- ---------- -------------
1 0 12
13
18
20
24
27
31
34
1 13
17
21
22
29
35
29 4
5
7
8
10
12
16
19
816 rows selected..
partner關系是在建立磁盤組時由asm自動配置設定的,在每次添加和删除磁盤操作時會自動更新。
磁盤之間的partner關系資訊是記錄在磁盤的partner關系狀态表即pst表(參考前面的章節)和磁盤目錄中,這兩項都是重要的asm中繼資料結構。
sql> create diskgroup wxh normal redundancy
failgroup ocr1 disk
'/dev/qdata/vdc' ,
'/dev/qdata/vdd'
failgroup ocr2 disk
'/dev/qdata/vde' ,
'/dev/qdata/vdg'
attribute
'au_size'='1m',
'compatible.asm' = '11.2.0.4',
'compatible.rdbms' = '11.2.0.4';
diskgroup created.
kfed read /dev/qdata/vdc aun=1 blkn=0| more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 17 ; 0x002: kfbtyp_pst_meta
kfbh.datfmt: 2 ; 0x003: 0x02
kfbh.block.blk: 256 ; 0x004: blk=256
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 2503555118 ; 0x00c: 0x9539382e
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdphdrpairbv1.first.super.time.hi:33036846 ; 0x000: hour=0xe days=0x11 mnth=0x6 year=0x7e0
kfdphdrpairbv1.first.super.time.lo:485925888 ; 0x004: usec=0x0 msec=0x1a9 secs=0xf mins=0x7
kfdphdrpairbv1.first.super.last: 2 ; 0x008: 0x00000002
kfdphdrpairbv1.first.super.next: 2 ; 0x00c: 0x00000002
kfdphdrpairbv1.first.super.copycnt: 2 ; 0x010: 0x02
kfdphdrpairbv1.first.super.version: 1 ; 0x011: 0x01
kfdphdrpairbv1.first.super.ub2spare: 0 ; 0x012: 0x0000
kfdphdrpairbv1.first.super.incarn: 1 ; 0x014: 0x00000001
kfdphdrpairbv1.first.super.copy[0]: 0 ; 0x018: 0x0000
kfdphdrpairbv1.first.super.copy[1]: 2 ; 0x01a: 0x0002
kfdphdrpairbv1.first.super.copy[2]: 0 ; 0x01c: 0x0000
kfdphdrpairbv1.first.super.copy[3]: 0 ; 0x01e: 0x0000
kfdphdrpairbv1.first.super.copy[4]: 0 ; 0x020: 0x0000
kfdphdrpairbv1.first.super.dtasz: 4 ; 0x022: 0x0004
以上輸出說明在磁盤0和2上有pst的拷貝(kfdphdrpairbv1.first.super.copy[0]和kfdphdrpairbv1.first.super.copy[1]處有值)
kfed read /dev/qdata/vdc aun=1 blkn=3| more
kfbh.type: 18 ; 0x002: kfbtyp_pst_dta
kfbh.block.blk: 259 ; 0x004: blk=259
kfbh.check: 2182251266 ; 0x00c: 0x82128302
kfdpdtaev1[0].status: 127 ; 0x000: i=1 v=1 v=1 p=1 p=1 a=1 d=1
kfdpdtaev1[0].fgnum: 1 ; 0x002: 0x0001
kfdpdtaev1[0].addts: 2174935503 ; 0x004: 0x81a2e1cf
kfdpdtaev1[0].partner[0]: 49155 ; 0x008: p=1 p=1 part=0x3
kfdpdtaev1[0].partner[1]: 49154 ; 0x00a: p=1 p=1 part=0x2
kfdpdtaev1[0].partner[2]: 10000 ; 0x00c: p=0 p=0 part=0x2710
kfdpdtaev1[0].partner[3]: 0 ; 0x00e: p=0 p=0 part=0x0
以上輸出代表磁盤0(kfdpdtaev1[0])所在failgroup号為1,它有2個partner磁盤,分為為part=0x3,part=0x2
<b>本文來自雲栖社群合作夥伴“dbgeek”</b>