staleness directory是asm元信息的12号文件,包含了可以把staleness registry中的槽位映射给特定磁盘和客户端的元信息。staleness registry是asm元信息254号文件,当磁盘offline时,用于跟踪au的状态。这两个特性适用于compatible.rdbms设置为11.1或以上且normal或high冗余模式的磁盘组。只有在需要时staleness元信息才会被创建,本身的内容大小会随着offline磁盘的增多而增长。
译者注:这里的客户端可以理解成数据库实例
当一个磁盘offline时,每个rdbms实例都会从staleness registry中得到一个映射到该磁盘的槽位。这个槽位中的每一个比特位映射这个offline磁盘上的一个au。当rdbms实例对offline的磁盘发起写io操作时,该实例会在staleness registry中修改对应的比特位。
当一个磁盘被online时,asm会从冗余的extent中拷贝staleness registry比特位中记录的au。因为只有offline时被改变过的au会被更新,所以磁盘online操作的效率会高于该盘被drop并添加一块新盘的效率。
staleness元信息的结构在需要时会被创建,这意味着staleness directory和staleness registry在磁盘正常online时是不存在的。
sql> select g.name "disk group",
g.group_number "group#",
d.disk_number "disk#",
d.name "disk",
d.mode_status "disk status"
from v$asm_disk d, v$asm_diskgroup g
where g.group_number=d.group_number and g.group_number<>0
order by 1, 2, 3;
disk group group# disk# disk disk status
------------ ---------- ---------- ------------ ------------
data 1 0 asmdisk1 online
1 asmdisk2 online
2 asmdisk3 online
reco 2 0 asmdisk4 online
1 asmdisk5 online
2 asmdisk6 online
sql> select x.number_kffxp "file#",
x.disk_kffxp "disk#",
x.xnum_kffxp "extent",
x.au_kffxp "au",
d.name "disk name"
from x$kffxp x, v$asm_disk_stat d
where x.group_kffxp=d.group_number
and x.disk_kffxp=d.disk_number
and x.number_kffxp in (12, 254)
order by 1, 2;
no rows selected
staleness信息在磁盘offline并且在针对该offline盘有写io时会才被创建。
在下面的例子中,我会通过alter diskgroup offline disk命令手动把一个磁盘offline。但是需要指出,staleness元信息的创建跟磁盘以何种方式何种原因offline无关。
sql> alter diskgroup reco offline disk asmdisk6;
diskgroup altered.
where g.group_number=d.group_number and g.group_number=2
2 asmdisk6 offline
数据库针对该磁盘组进行不断的写入,一会就可以观察到该磁盘组中已经创建了staleness directory 和 staleness registry。
and d.group_number=2
file# disk# extent au disk name
---------- ---------- ---------- ---------- ------------------------------
12 0 0 86 asmdisk4
1 0 101 asmdisk5
2 0 4294967294 asmdisk6
254 0 0 85 asmdisk4
1 0 100 asmdisk5
元信息中并没有很多有价值的信息,连kfed都无法分辨出这种类型元信息block。
$ kfed read /dev/oracleasm/disks/asmdisk4 aun=86 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 21 ; 0x002: *** unknown enum ***
...
kffdnd.bnode.incarn: 1 ; 0x000: a=1 numm=0x0
kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff
kffdnd.bnode.frlist.incarn: 0 ; 0x008: a=0 numm=0x0
kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff
kffdnd.overfl.incarn: 0 ; 0x010: a=0 numm=0x0
kffdnd.parent.number: 0 ; 0x014: 0x00000000
kffdnd.parent.incarn: 1 ; 0x018: a=1 numm=0x0
kffdnd.fstblk.number: 0 ; 0x01c: 0x00000000
kffdnd.fstblk.incarn: 1 ; 0x020: a=1 numm=0x0
kfdsde.entry.incarn: 1 ; 0x024: a=1 numm=0x0
kfdsde.entry.hash: 0 ; 0x028: 0x00000000
kfdsde.entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfdsde.entry.refer.incarn: 0 ; 0x030: a=0 numm=0x0
kfdsde.cid: +asmr ; 0x034: length=5
kfdsde.indlen: 1 ; 0x074: 0x0001
kfdsde.flags: 0 ; 0x076: 0x0000
kfdsde.spare1: 0 ; 0x078: 0x00000000
kfdsde.spare2: 0 ; 0x07c: 0x00000000
kfdsde.indices[0]: 0 ; 0x080: 0x00000000
kfdsde.indices[1]: 0 ; 0x084: 0x00000000
kfdsde.indices[2]: 0 ; 0x088: 0x00000000
$ kfed read /dev/oracleasm/disks/asmdisk4 aun=85 | more
kfbh.type: 20 ; 0x002: *** unknown enum ***
kfdshdrb.clientid: 1297301881 ; 0x000: 0x4d534179
kfdshdrb.incarn: 0 ; 0x004: 0x00000000
kfdshdrb.dsknum: 2 ; 0x008: 0x0002
kfdshdrb.ub2spare: 0 ; 0x00a: 0x0000
ub1[0]: 0 ; 0x00c: 0x00
ub1[1]: 0 ; 0x00d: 0x00
ub1[2]: 0 ; 0x00e: 0x00
ub1[3]: 0 ; 0x00f: 0x00
ub1[4]: 0 ; 0x010: 0x00
ub1[5]: 0 ; 0x011: 0x00
ub1[6]: 0 ; 0x012: 0x00
ub1[7]: 16 ; 0x013: 0x10
ub1[8]: 0 ; 0x014: 0x00
除了一些比特位,没有太多有价值信息。
staleness directory 和 staleness registry提供的元信息结构用来为asm 11中引入的fast mirror resync新特性提供支持。staleness directory是asm元信息12号文件,包含了可以把staleness registry中的槽位映射给特定磁盘和客户端的元信息。当磁盘offline时,staleness registry用于跟踪au的状态。这个特性只在normal或high冗余模式的磁盘组中生效。
<b>本文来自云栖社区合作伙伴“dbgeek”</b>