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

ASM虚拟元数据-Continuing Operations Directory asm file 4

【作者简介

本人医疗行业DBA,精通oracle底层;会文件、触发器加密的勒索恢复、asm磁盘组不能mount及各种灾难恢复,后面将利用空闲时间将自己工作中遇到的问题及整理的资料分享给更多愿意学习和提升自己的dba。作者微信号:Oray_123

【正文

1、介绍

    前面一篇文章说到asm其实也是一个小型的数据库,它也有自己的实例;
    在前面一篇文章中介绍了实例中的一个redo功能,这篇文章主要是介绍实例的另外一个功能,undo,回滚;


    ASM中一些运行时间较长的操作,例如rebalance, drop disk, create/delete/resize file,这时的asm的一些元数据信息信息就无法通过仅仅通过ACD来记录,还需要COD来进行记录。
    如果进程在执行长时间操作未正常完成前异常终止,将会有恢复进程查看COD区域的记录尝试完成或回退这个操作,有两种类型的持续性操作:background 和 rollback。


    COD是ASM的4号文件,每一个磁盘组都会有一个COD。其关系是1:1。


    复制

    2、定位COD

    1)通过视图查询

      set line 200
      col diskgroup_name for a15
      col disk_name for a10
      col path for a40
      select a.name diskgroup_name,a.type,a.allocation_unit_size/1024/1024 unit_mb,a.voting_files,b.name disk_name,b.path,
      b.os_mb/1024 as os_gb,b.total_mb/1024 as total_gb,b.free_mb/1024 as free_gb
      3 from v$asm_diskgroup a,v$asm_disk b where a.group_number=b.group_number;


      DISKGROUP_NAME TYPE UNIT_MB VO DISK_NAME PATH OS_GB TOTAL_GB FREE_GB
      --------------- ------------ ---------- -- ---------- ---------------------------------------- ---------- ---------- ----------
      EDATA EXTERN 4 N EDATA_0000 dev/oracleasm/disks/ASMDATA3 29.2958984 29.2929688 25.203125
      NDATA NORMAL 4 N NDATA_0001 dev/oracleasm/disks/ASMDATA2 9.76464844 9.76171875 8.75
      NDATA NORMAL 4 N NDATA_0000 dev/oracleasm/disks/ASMDATA1 9.76464844 9.76171875 8.75
      OCR NORMAL 4 Y OCR_0001 dev/oracleasm/disks/ASMOCR2 1.95214844 1.94921875 1.61328125
      OCR NORMAL 4 Y OCR_0000 dev/oracleasm/disks/ASMOCR1 1.95214844 1.94921875 1.60546875
      OCR NORMAL 4 Y OCR_0002 dev/oracleasm/disks/ASMOCR3 1.95214844 1.94921875 1.6171875




      有一点大家需要记住的是,你的asm实例中,有多个COD,那么你的asm实例中就有多少个ASM disk group,其关系是1:1的。


      大家可以看到,我这里的asm实例中,其中diskgroup 1中包含1个disk,所以通过如下sql查询的结果显示有1个COD条目:
      select number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extents
      from x$kffxp
      where group_kffxp=1
      and disk_kffxp <> 65534
      group by number_kffxp, disk_kffxp
      order by 1;


      FILE# DISK# EXTENTS
      ---------- ---------- ----------
      1 0 1
      2 0 2
      3 0 22
      4 0 2 --file 4就是cod
      5 0 1


      可以看到,上面显示file #的信息有1条,每个COD大小是4 au size。
      如果asm的这些操作失败了,那么asm 实例的recover processes会去读取COD中的信息的,就好比数据库实例中的smon进程在进行实例恢复时,当进入到rollback的过程时,会去读取undo一样。针对asm实例,完成这个操作的进程也是asm_gmon来实现的。


      补充一点:如果你的diskgroupnormal冗余,那么COD信息对应会生产2份,如果是high模式,那么将是3份。
      set line 200 pages 1000
      col "disk name" for a20
      col path for a30
      col type for a20
      col au for 99999
      SELECT x.number_kffxp file#,x.xnum_kffxp "Extent",case lxn_kffxp
      when 0 then 'Primary Copy'
      when 1 then 'Mirrored Copy'
      when 2 then '2nd Mirrored Copy or metadata'
      else 'Unknown' end type,
      x.au_kffxp "AU",
      x.disk_kffxp "Disk #",
      d.name "Disk name",
      d.path,
      d.GROUP_NUMBER,
      d.DISK_NUMBER
      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.group_kffxp=1
      and x.number_kffxp=4
      ORDER BY 1, 2;
      FILE# Extent TYPE AU Disk # Disk name PATH GROUP_NUMBER DISK_NUMBER
      ---------- ---------- -------------------- ------ ---------- -------------------- ------------------------------ ------------ -----------
      4 0 Primary Copy 17 0 EDATA_0000 dev/oracleasm/disks/ASMDATA3 1 0
      4 1 Primary Copy 18 0 EDATA_0000 dev/oracleasm/disks/ASMDATA3 1 0
      复制

      2)kfed 定位au分配信息

      --找4号文件COD的分布信息

        [grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=0 blkn=0|egrep -i "aus|f1b1locn"
        kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000
        kfdhdb.f1b1locn: 10 ; 0x0d4: 0x0000000a


        [grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=10 blkn=4 aus=4M|egrep "block|disk|au"|egrep -v "65535|4294967295"
        kfbh.block.blk: 4 ; 0x004: blk=4
        kfbh.block.obj: 1 ; 0x008: file=1
        kfffde[0].xptr.au: 17 ; 0x4a0: 0x00000011
        kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
        kfffde[1].xptr.au: 18 ; 0x4a8: 0x00000012
        kfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000
        从上面信息可以看到COD分配信息在disk 0的第17 au中,disk 0 的18 au中;和x$kffxp查询的结果完全一致;
        复制

        3、kfed解析

        3.1 KFBTYP_COD_BGO元数据块解析(backgroup operation)

        后台操作是由ASM实例的后台进程去执行的,它作为磁盘组的维护任务的一部分,而非特殊要求,直到完成或者ASM实例挂掉,如果ASM实例挂掉,执行恢复的实例需要重新执行后台操作,磁盘组的rebalance就是一个很好的后台操作的例子。

          [grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=17 blkn=0 aus=4M
          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: blk=0
          kfbh.block.obj: 4 ; 0x008: file=4
          kfbh.check: 17405867 ; 0x00c: 0x010997ab
          kfbh.fcn.base: 5550 ; 0x010: 0x000015ae
          kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
          kfbh.spare1: 0 ; 0x018: 0x00000000
          kfbh.spare2: 0 ; 0x01c: 0x00000000
          kfrcbg.size: 0 ; 0x000: 0x0000
          kfrcbg.op: 0 ; 0x002: 0x0000 --为0表示没有后台操作,为1表示后台进程正在进行reblance operation
          kfrcbg.inum: 0 ; 0x004: 0x00000000 --表示后台进程在那个asm 实例上
          kfrcbg.iser: 0 ; 0x008: 0x00000000


          3.2 KFBTYP_COD_RBO (Rollback operation)
          Rollback操作类型类似于数据库的事务。ASM的前台进程发起请求,为了能够记录这个rollback操作,必须在ASM的COD目录中申请一个槽位,COD目录的block 1展示了所有的槽位和使用状态,如果所有的槽位当时都是忙的,那么这个操作会休息一段时间,直到发现其中一个可以使用。rollback类型操作过程中,磁盘组是一个不一致的状态,这个操作需要完成或者回退所有它对磁盘组的更改。数据库实例大多时候会去执行这个操作(例如添加数据文件)。如果数据库实例挂掉或者ASM前台进程挂掉,一个不可恢复的错误会发生,然后这个操作会被终止。


          创建文件是一个rollback操作非常好的例子,如果在文件空间分配过程中发生错误,那么已经分配过的空间需要被删除,如果数据库实例没有提交文件的创建操作,这个文件必须被自动删除,如果ASM实例挂掉,这个删除操作会由恢复实例来执行。


          我们来看一下COD的block 1:
          [grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=17 blkn=1 aus=4M|more
          kfbh.endian: 1 ; 0x000: 0x01
          kfbh.hard: 130 ; 0x001: 0x82
          kfbh.type: 15 ; 0x002: KFBTYP_COD_RBO
          kfbh.datfmt: 2 ; 0x003: 0x02
          kfbh.block.blk: 1 ; 0x004: blk=1
          kfbh.block.obj: 4 ; 0x008: file=4
          kfbh.check: 34576345 ; 0x00c: 0x020f97d9
          kfbh.fcn.base: 5597 ; 0x010: 0x000015dd
          kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
          kfbh.spare1: 0 ; 0x018: 0x00000000
          kfbh.spare2: 0 ; 0x01c: 0x00000000
          kfrcrb[0].opcode: 0 ; 0x000: 0x0000
          kfrcrb[1].opcode: 0 ; 0x002: 0x0000
          kfrcrb[2].opcode: 0 ; 0x004: 0x0000
          kfrcrb[3].opcode: 0 ; 0x006: 0x0000
          kfrcrb[4].opcode: 0 ; 0x008: 0x0000
          kfrcrb[5].opcode: 0 ; 0x00a: 0x0000
          kfrcrb[6].opcode: 0 ; 0x00c: 0x0000
          ..
          kfrcrb[2030].opcode: 0 ; 0xfdc: 0x0000
          kfrcrb[2031].opcode: 0 ; 0xfde: 0x0000


          --看kfrcrb[i].opcode只要是非0值,就说明有个操作在回滚,如果都为空,说明当前没有rollback operation进行。
          rollback操作类型的代码参照表如下:


          1 - Create a file 2 - Delete a file
          3 - Resize a file 4 - Drop alias entry
          5 - Rename alias entry 6 - Rebalance space COD
          7 - Drop disks force 8 - Attribute drop
          9 - Disk Resync 10 - Disk Repair Time
          11 - Volume create 12 - Volume delete
          13 - Attribute directory creation·14 - Set zone attributes
          15 - User drop
          --这里的RBO信息,其实就好比是COD信息的directory,在读取COD时,首先就需要读取这部分内容,接下来才是COD DATA。


          [grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=17 blkn=2 aus=4M|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: blk=2
          kfbh.block.obj: 4 ; 0x008: file=4
          kfbh.check: 1118734342 ; 0x00c: 0x42ae8806
          kfbh.fcn.base: 5595 ; 0x010: 0x000015db
          kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
          kfbh.spare1: 0 ; 0x018: 0x00000000
          kfbh.spare2: 0 ; 0x01c: 0x00000000
          [grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=17 blkn=3 aus=4M|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: 3 ; 0x004: blk=3
          kfbh.block.obj: 4 ; 0x008: file=4
          kfbh.check: 1118743918 ; 0x00c: 0x42aead6e
          kfbh.fcn.base: 5019 ; 0x010: 0x0000139b
          kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
          kfbh.spare1: 0 ; 0x018: 0x00000000
          kfbh.spare2: 0 ; 0x01c: 0x00000000
          --这部分是COD DATA内容,从上面可以看到,基本上就是只要头部信息。这部分内容也没什么可描述的,唯一更新的也就是check值和bash。没有太大的意义。
          复制

          4、总结

          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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论