天天看点

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>