oracle的KFF,【学习笔记】Oracle asm剖析系列(8)–Continuing Operations Directory

天萃荷净

Oracle研究中心学习笔记:分享一篇关于Oracle ASM的研究笔记,详细介绍了oracle asm Continuing Operations Directory。

本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger 的Oracle技术博客

本文链接地址: 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条目:

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.datfOracle???????oracleplus.netmt:                          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实例无法正常运行。

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle asm剖析系列(8)–Continuing Operations Directory

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值