暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

oracle asm剖析系列(8)--Continuing Operations Directory

原创 Roger 2013-02-02
999
在asm系列的上一篇文章中,我们描述了ACD,将其比喻成oracle database中的redo,如果说起作用类似redo,那么本篇即将
描述的Continuing Operations Directory (COD),就其作用而来可能就类似undo了。当然,这是个打个比方.

在oracle asm实例中,有一些长时间运行的操作,比如当你add/drop disk时,add/delete/resize datafile时,可能运行时间
相对较长,这时asm的一些元数据信息就无法仅仅通过active change directory来记录,还需要COD来进行记录。

有一点大家需要记住的是,你的asm实例中,有多个COD,那么你的asm实例中就有多少个ASM disk group,其关系是1:1的。
大家可以看到,我这里的asm实例中,其中diskgroup 1中包含2个disk,所以通过如下sql查询的结果显示有2个COD条目:

SQL> select number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extents
2 from x$kffxp
3 where group_kffxp=1
4 and disk_kffxp <> 65534
5 group by number_kffxp, disk_kffxp
6 order by 1;

FILE# DISK# EXTENTS
---------- ---------- ----------
1 0 1
1 1 1
2 1 1
3 0 21
3 1 21
4 0 1 ---file# 4是COD.
4 1 1
5 0 1
6 0 1
256 0 240
256 1 242
..........
265 1 1
266 0 11
266 1 10

30 rows selected.
复制

可以看到,上面显示file #的信息有2条,每个COD大小是1个 au size。

如果asm的这些操作失败了,那么asm 实例的recover processes会去读取COD中的信息的,就好比数据库实例中的smon进程在
进行实例恢复时,当进入到rollback的过程时,会去读取undo一样。 针对asm实例,完成这个操作的进程也是asm_gmon来实现的。

补充一点:如果你的diskgroup是normal冗余,那么COD信息对应会生产2份,如果是high模式,那么将是3份。

下面我们使用kfed工具来看下cod的结构是怎么样的。

首先我们找到COD 信息所在的具体位置:

[oracle@10gasm ~]$ kfed read /dev/sdd |grep f1b1
kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002

[oracle@10gasm ~]$ kfed read /dev/sdd aun=2 blkn=4 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 4 ; 0x004: T=0 NUMB=0x4
kfbh.block.obj: 1 ; 0x008: TYPE=0x0 NUMB=0x1
kfbh.check: 2898472186 ; 0x00c: 0xacc32cfa
kfbh.fcn.base: 3841 ; 0x010: 0x00000f01
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
..........
kfffdb.spare[15]: 0 ; 0x09c: 0x00000000
kfffdb.usm: ; 0x0a0: length=0
kfffde[0].xptr.au: 347 ; 0x4a0: 0x0000015b
kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
kfffde[0].xptr.flags: 0 ; 0x4a6: L=0 E=0 D=0 C=0 S=0
kfffde[0].xptr.chk: 112 ; 0x4a7: 0x70
kfffde[1].xptr.au: 24 ; 0x4a8: 0x00000018
kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001
kfffde[1].xptr.flags: 0 ; 0x4ae: L=0 E=0 D=0 C=0 S=0
kfffde[1].xptr.chk: 51 ; 0x4af: 0x33
kfffde[2].xptr.au: 4294967295 ; 0x4b0: 0xffffffff
..........
复制

从上面信息,我们可以知道COD信息在disk 0的第347 au中,在disk 1中的第24 au中。

[oracle@10gasm ~]$ kfed read /dev/sdd aun=347 blkn=0 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 9 ; 0x002: KFBTYP_COD_BGO
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0
kfbh.block.obj: 4 ; 0x008: TYPE=0x0 NUMB=0x4
kfbh.check: 17337593 ; 0x00c: 0x01088cf9
kfbh.fcn.base: 3837 ; 0x010: 0x00000efd
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfrcbg.size: 0 ; 0x000: 0x0000
kfrcbg.op: 1 ; 0x002: 0x0001
kfrcbg.inum: 1 ; 0x004: 0x00000001
kfrcbg.iser: 1 ; 0x008: 0x00000001
kfrcbg.data: 1 ; 0x00c: 0x00000001
复制

这部分数据表示asm COD的后台进程操作信息,这里只描述重点信息;

--kfbh 头部信息没啥可描述的

--kfrcbg
BGO 即为background operations 的简写。
kfrcbg.op 表示后台进程操作,有2种属性值,0 表示当前没有后台进程操作,1表示当前后台进程正在进行reblance operation.
kfrcbg.inum 表示后台进程所运作的asm instance number
kfrcbg.iser 未知
kfrcbg.data 未知

[oracle@10gasm ~]$ kfed read /dev/sdd aun=347 blkn=1 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 15 ; 0x002: KFBTYP_COD_RBO
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 1 ; 0x004: T=0 NUMB=0x1
kfbh.block.obj: 4 ; 0x008: TYPE=0x0 NUMB=0x4
kfbh.check: 17796420 ; 0x00c: 0x010f8d44
kfbh.fcn.base: 3904 ; 0x010: 0x00000f40
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfrcrb[0].opcode: 0 ; 0x000: 0x0000
kfrcrb[0].inum: 0 ; 0x002: 0x0000
kfrcrb[0].iser: 0 ; 0x004: 0x00000000
kfrcrb[0].pnum: 0 ; 0x008: 0x00000000
kfrcrb[1].opcode: 0 ; 0x00c: 0x0000
kfrcrb[1].inum: 0 ; 0x00e: 0x0000
kfrcrb[1].iser: 0 ; 0x010: 0x00000000
kfrcrb[1].pnum: 0 ; 0x014: 0x00000000
kfrcrb[2].opcode: 0 ; 0x018: 0x0000
.........
复制

这部分内容是asm smon进程的rollback操作信息:
--kfbh 头部信息
kfbh.type 表示操作类型,15即为 KFBTYP_COD_RBO,RBO 即为rollback operation的简写
kfbh.block.blk 表示当前元数据所在的block号

--kfrcrb rb即为rollback
kfrcrb[0].opcode      表示具体的操作类型,该opcode有很多种属性值,如下:
1 - Create a file
2 - Delete a file 9 - Disk Resync
3 - Resize a file 10 - Disk Repair Time
4 - Drop alias entry 11 - Volume create
5 - Rename alias entry 12 - Volume delete
6 - Rebalance space COD 13 - Attribute directory creation
7 - Drop disks force 14 - Set zone attributes
8 - Attribute drop 15 - User drop
复制


kfrcrb[0].inum 表示asm instance number
kfrcrb[0].iser 未知
kfrcrb[0].pnum 未知

这里的kfrcrb信息都为空,那说明当前没有rollback operation进行。
这里需要解释一下的是,rollback操作就类似数据库实例中的事务回滚一样,如果是一个大事务,那么很可能你看到的信息就是不一致,例如
可能有些脏block已经被写到disk中,类似这样。在asm实例中,在disk group正在运行rollback operation操作的时刻,只要操作未完成,那么
COD信息其实都是一个不一致的状态。

这里的RBO信息,其实就好比是COD信息的directory,在读取COD时,首先就需要读取这部分内容,接下来才是COD DATA。

[oracle@10gasm ~]$
[oracle@10gasm ~]$ kfed read /dev/sdd aun=347 blkn=2 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 16 ; 0x002: KFBTYP_COD_DATA
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 2 ; 0x004: T=0 NUMB=0x2
kfbh.block.obj: 4 ; 0x008: TYPE=0x0 NUMB=0x4
kfbh.check: 784812715 ; 0x00c: 0x2ec74aab
kfbh.fcn.base: 3903 ; 0x010: 0x00000f3f
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
复制


这部分是COD DATA内容,从上面可以看到,基本上就是只要头部信息。这部分内容也没什么可描述的,
唯一更新的也就是check值和bash。没有太大的意义。

最后简单小节一下:

1. COD信息,就类似数据库实例中的undo机制,不过维持cod信息的进程是gmon而不是smon,我开始也想当然的以为是smon,
然而通过strace 进程发现并不是。

2. Continuing Operations Directory,之所以是continue,是因为它允许你操作未完成而可以继续进行,以防止crash时可以进行rollback操作。
如果实例crash,那么重启后asm 进程回去还原COD中的相关信息。

3. 通常来讲,asm在进行实例恢复时,ACD和COD都是需要进行操作的,就类似oracle实例恢复时,先前滚redo然后是操作undo一样.
由此,你可以想象,假如是在rollback时出现问题,那么必然也导致asm实例无法正常运行。


上文内容是个人理解,如有问题,请大家指正,谢谢!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论