天天看點

Oracle ASM 翻譯系列第七彈:進階知識 How many partners?How many partners?

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>