love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

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

在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条目:

可以看到,上面显示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 信息所在的具体位置:

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

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

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

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

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

–kfrcrb rb即为rollback

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。

这部分是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实例无法正常运行。

上文内容是个人理解,如有问题,请大家指正,谢谢!

Leave a Reply

You must be logged in to post a comment.