sitemap

RSS地图

收藏本站

设为首页

Oracle研究中心

当前位置:Oracle研究中心 > 产品DBA > Oracle ASM >

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

时间:2016-12-21 21:11   来源:Oracle研究中心   作者:网络   点击:

天萃荷净 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

本文由大师惜分飞原创分享,网址:http://www.oracleplus.net/arch/1425.html

Oracle研究中心

关键词:

Oracle ASM

oracle Continuing Operations Directory