天天看點

Oracle ASM 翻譯系列第二十八彈:ASM INTERNAL Partnership and Status TablePartnership and Status Table

partnership and status table簡稱pst表包含了一個磁盤組中所有磁盤的相關資訊-磁盤号,磁盤狀态,partner的磁盤号,心跳資訊和failgroup的資訊(11g及以上版本)。

每個磁盤的au 1是為pst表預留的,但是并不是每一個磁盤都有pst表的資訊。

在external備援的磁盤組中隻有一份pst表。

在normal備援的磁盤組中,至少有兩份pst表。如果磁盤組中有三個或更多的failgroups,pst表将會有3份。

在high備援的磁盤組中,至少有三份pst表的資訊。如果有四個failgroups,将會有4份pst表,如果有五個或者更多failgroups,将會有五份pst表。

請看下面的例子,注意這個被建立的磁盤組是由5個磁盤組成:

建立外部備援的磁盤組

sql> create diskgroup dg1 external redundancy

disk '/dev/sdc5', '/dev/sdc6', '/dev/sdc7', '/dev/sdc8', '/dev/sdc9';

diskgroup created.

檢視asm的alert日志

sat aug 31 20:44:59 2013

disk '/dev/sdc5', '/dev/sdc6', '/dev/sdc7', '/dev/sdc8', '/dev/sdc9'

note: assigning number (2,0) to disk (/dev/sdc5)

note: assigning number (2,1) to disk (/dev/sdc6)

note: assigning number (2,2) to disk (/dev/sdc7)

note: assigning number (2,3) to disk (/dev/sdc8)

note: assigning number (2,4) to disk (/dev/sdc9)

...

note: initiating pst update: grp = 2

sat aug 31 20:45:00 2013

gmon updating group 2 at 50 for pid 22, osid 9873

note: group dg1: initial pst location: disk 0000 (pst copy 0)

note: pst update grp = 2 completed successfully

alert日志的輸出非常相信,可以看到asm隻建立了一份pst表,位于disk 0000即/dev/sdc5。

建立normal備援的磁盤組

sql> drop diskgroup dg1;

diskgroup dropped.

sql> create diskgroup dg1 normal redundancy

檢視asm的alert日志:

sat aug 31 20:49:28 2013

note: group 2 pst updated.

gmon updating group 2 at 68 for pid 22, osid 9873

note: group dg1: initial pst location: disk 0001 (pst copy 1)

note: group dg1: initial pst location: disk 0002 (pst copy 2)

we see that asm creates three copies of the pst.

這次我們看到建立了3份pst表,分别位于disk 0000,disk 0001,disk 0002,即/dev/sdc5,/dev/sdc6,/dev/sdc7。

high redundancy disk group

sql> create diskgroup dg1 high redundancy

sat aug 31 20:51:52 2013

sat aug 31 20:51:53 2013

gmon updating group 2 at 77 for pid 22, osid 9873

note: group dg1: initial pst location: disk 0003 (pst copy 3)

note: group dg1: initial pst location: disk 0004 (pst copy 4)

這一次我們看到了asm建立了五份pst表。

pst在下列情況下會再配置設定:

· pst所在磁盤不可用(asm執行個體啟動時)

· 磁盤offline

· pst的讀寫發生io錯誤

· 磁盤被正常的删除掉(手工或背景)

這些情況下,如果相同失敗組中有其他可用的磁盤,pst将會被重配置設定到其他磁盤;否則會重配置設定到其他沒有pst副本的失敗組。

我們通過一個例子看下:

disk '/dev/sdc5', '/dev/sdc6', '/dev/sdc7', '/dev/sdc8';

asm的alert日志顯示了磁盤剛建立後,pst表的拷貝資訊分别位于磁盤0,1,2。

我們删除磁盤0:

sql> select disk_number, name, path from v$asm_disk_stat

where group_number = (select group_number from v$asm_diskgroup_stat where name='dg1');

disk_number name                           path

----------- ------------------------------ ----------------

          3 dg1_0003                       /dev/sdc8

          2 dg1_0002                       /dev/sdc7

          1 dg1_0001                       /dev/sdc6

          0 dg1_0000                       /dev/sdc5

sql> alter diskgroup dg1 drop disk dg1_0000;

diskgroup altered.

再次檢視asm的alert日志:

sat aug 31 21:04:29 2013

sql> alter diskgroup dg1 drop disk dg1_0000

note: initiating pst update: grp 2 (dg1), dsk = 0/0xe9687ff6, mask = 0x6a, op = clear

sat aug 31 21:04:37 2013

gmon updating disk modes for group 2 at 96 for pid 24, osid 16502

note: group dg1: updated pst location: disk 0001 (pst copy 0)

note: group dg1: updated pst location: disk 0002 (pst copy 1)

note: group dg1: updated pst location: disk 0003 (pst copy 2)

我們看到pst的拷貝資訊從磁盤0轉移到了磁盤3.

磁盤的partnership是在normal或者high備援的磁盤組上,在兩個磁盤之間有一個“對稱”的關系。在external備援中,不存在disk partnership。關于這個話題的讨論,請看部落格how many partners(第6篇)。

pst表的資料要先于其他asm中繼資料之前可用。當發起磁盤組的mount請求,gmon程序讀取磁盤組中的所有磁盤,找到并确認可用的pst副本。一旦确認有足夠的pst副本,就把磁盤組mount上來。從這個時刻開始,pst表的資訊儲存在asm執行個體的cache裡;位于gmon 程序的pga中,由pt.n.0 enqueue排他鎖進行保護。

對于同一叢集的其他asm執行個體,在啟動之後會把pst表緩存在自己的gmon pga中,加上共享的pt.n.0 enqueue。

隻有擁有排他pt enqueue鎖的gmon程序(10gr1中為ckpt),可以更新磁盤中的pst表資訊。

每次嘗試mount磁盤組時,gmon trace檔案就會記錄pst資訊。注意我說的是嘗試,不是已經mount上。換句話說,gmon不管mount動作成功與否,都會記錄資訊。這些資訊對于oracle support診斷磁盤組mount失敗故障可能會有價值。

下面是典型的gmon trace檔案記錄的一個磁盤組mount的資訊:

=============== pst ====================

grpnum:    2

grptyp:    2

state:     1

callcnt:   103

bforce:    0x0

(lockvalue) valid=1 ver=0.0 ndisks=3 flags=0x3 from inst=0 (i am 1) last=0

--------------- hdr --------------------

next:    7

last:    7

pst count:       3

pst locations:   1  2  3

incarn:          4

dta size:        4

version:         0

asm version:     168820736 = 10.1.0.0.0

contenttype:     0

--------------- loc map ----------------

0: dirty 0       cur_loc: 0      stable_loc: 0

1: dirty 0       cur_loc: 0      stable_loc: 0

--------------- dta --------------------

1: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addts = 0 parts: 2 (amp) 3 (amp)

2: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addts = 0 parts: 1 (amp) 3 (amp)

3: sts v v(rw) p(rw) a(x) d(x) fg# = 0 addts = 0 parts: 1 (amp) 2 (amp)

=== pst ===标記的部分顯示了磁盤組号(grpnum),類型(grptyp),和狀态。--- hdr ---标記的部分顯示了pst的副本數(pst count)和所在的磁盤号。--- dta ---顯示了pst所在磁盤的狀态。

pst(partnership and status table)包含一個磁盤組裡所有磁盤的相關資訊 -- 磁盤号,磁盤狀态,partner磁盤号,心跳資訊和failgroup資訊(11g之後)。

每個asm磁盤的1号au為pst表預留,但是隻有部分磁盤有pst資料。由于pst是重要的asm中繼資料,隻要失敗組個數足夠,在normal備援中将會有三副本,在high備援中将會有五副本。

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>