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

ASM虚拟元数据-Active Change Directory asm file 3

【作者简介

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

【正文

1、介绍

    asm其实也是一个小型的数据库,它也有自己的实例;
    既然有实例,那么就有实例的前滚和实例的回滚机制;
    当发生异常断电、实例异常关闭的情况下,asm是如何进行前滚的呢?
    实际上就是通过检查点机制;


    说了半天acdc到底存放的什么内容?
    ACD包含如下组件:
    ● ACDC - ACD checkpoint ACD检查点 --最重要的是这个检查点
    ● ABA - ACD block address ACD块地址
    ● LGE - ACD redo log record ACD 重做日志记录
    ● BCD - ACD block change descriptor ACD块变更描述

    2、acdc和磁盘组、线程的关系

      存放位置:acdc存放在虚拟元数据 file 3上;
      每一个asm实例都会为acd分配42M的空间来存放redo,其中第一个blkn=0就是用来存放检查点信息;
      如果有多个实例,也就是rac有多个节点的情况下,对应的42M的空间就要乘以总的线程数。
      比如有3个节点,每个节点是42m,那么就是126m的空间来存放ACDC,其中就有三个blkn=0用来存放各自检查点额信息。
      如果磁盘组冗余不同,那么又将翻倍。
      接下来我们来定位下acdc的具体位置;


      3、定位acdc

        1)通过视图查询


        set line 220
        col name for a10
        col state for a10
        col COMPATIBILITY for a15
        col database_compatibility for a15
        SQL> select group_number,name,state,type,total_mb/1024 totol_gb,free_mb/1024 as free_gb,usable_file_mb/1024 usable_file_gb,allocation_unit_size/1024/1024 unit_mb,offline_disks,compatibility,database_compatibility,voting_files from v$asm_diskgroup order by 1;
        GROUP_NUMBER NAME STATE TYPE TOTOL_GB FREE_GB USABLE_FILE_GB UNIT_MB OFFLINE_DISKS COMPATIBILITY DATABASE_COMPAT VO
        ------------ ---------- ---------- ------------ ---------- ---------- -------------- ---------- ------------- --------------- --------------- --
        1 DATA MOUNTED EXTERN 58.59375 56.5605469 56.5605469 1 0 11.2.0.0.0 10.1.0.0.0 N
        2 FRA MOUNTED EXTERN 9.765625 8.68847656 8.68847656 1 0 11.2.0.0.0 10.1.0.0.0 N
             3 SYSTEMDG  MOUNTED    NORMAL   2.9296875 2.02539063    .524414063        1       0 11.2.0.0.0      10.1.0.0.0      Y
             
        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
        1 1 1
        2 1 1
        3 0 42 --由于是rac,多个实例,并且au大小是1M,所以有2个acdc,但是下面怎么是43?
        3 1 43
        4 0 4
        4 1 4
        5 0 1
        6 1 1
        8 0 1
        9 0 1




        set line 200 pages 1000
        col "disk name" for a20
        col path for a25
        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=3
        ORDER BY 1, 2;
        FILE# Extent AU Disk # Disk name PATH GROUP_NUMBER DISK_NUMBER
        ---------- ---------- ---------- ---------- -------------------- ------------------------------ ------------ -----------
        3 0 3 0 DATA_0000 dev/asmdisk4 1 0
        3 1 3 1 DATA_0001 dev/asmdisk5 1 1
        3 2 4 0 DATA_0000 dev/asmdisk4 1 0
        3 3 4 1 DATA_0001 dev/asmdisk5 1 1
        3 4 5 0 DATA_0000 dev/asmdisk4 1 0
        3 5 5 1 DATA_0001 dev/asmdisk5 1 1
        3 6 6 0 DATA_0000 dev/asmdisk4 1 0
        ...
        3 80 47 0 DATA_0000 dev/asmdisk4 1 0
        3 81 46 1 DATA_0001 dev/asmdisk5 1 1
        3 82 48 0 DATA_0000 dev/asmdisk4 1 0
        3 83 47 1 DATA_0001 dev/asmdisk5 1 1
        3 2147483648 35 1 DATA_0001 dev/asmdisk5 1 1 --原来是多了这一行


        85 rows selected.
        --这里需要说明的是,每一个asm实例,都用有其自己的ACD目录,换句话讲,如果你是双节点的rac,那么就有84m的ACD 目录信息。


          2) kfed查询
          --从3号au开始,找哪些au的块包含了ACDC的,只找blk=0
          for ((i=3;i<=100;i++));do
          for ((j=0;j<1;j++));do
          DIR=`kfed read dev/asmdisk4 aunum=$i blknum=$j aus=1048576|grep -i KFBTYP_ACDC`
          if [ "$DIR" != "" ];then
          echo "aun="$i "blknum="$j "dir="$DIR
          fi
          done;
          done;
          --aun=3 blknum=0 dir=kfbh.type: 7 ; 0x002: KFBTYP_ACDC
          --aun=28 blknum=0 dir=kfbh.type: 7 ; 0x002: KFBTYP_ACDC


          for ((i=3;i<=100;i++));do
          for ((j=0;j<1;j++));do
          DIR=`kfed read dev/asmdisk5 aunum=$i blknum=$j aus=1048576|grep -i KFBTYP_ACDC`
          if [ "$DIR" != "" ];then
          echo "aun="$i "blknum="$j "dir="$DIR
          fi
          done;
          done;
          --没有记录


          ##通过查找块类型,外部冗余,发现只有0号磁盘才有KFBTYP_ACDC 元数据块,而normal冗余每个磁盘上都有镜像;也就是检查点的记录块blkn=0;
          ##通常来讲,一个block是元数据,而后面的block就是实际数据了。继续读取Active change directory data:KFBTYP_CHNGDIR
          for ((i=3;i<=100;i++));do
          for ((j=0;j<256;j++));do
          DIR=`kfed read /dev/asmdisk4 aunum=$i blknum=$j aus=1048576|grep -i KFBTYP_CHNGDIR`
          if [ "$DIR" != "" ];then
          echo "aun="$i "blknum="$j "dir="$DIR
          fi
          done;
          done;


            3)kfed 定位au分配信息
            --找3号文件ACDC的分布信息
            [grid@hisdb01 ~]$ kfed read /dev/asmdisk4 aun=2 blkn=3 aus=1048576|egrep "block|disk|au"|egrep -v "65535|4294967295"
            kfbh.block.blk: 3 ; 0x004: blk=3
            kfbh.block.obj: 1 ; 0x008: file=1
            kfffde[0].xptr.au: 3 ; 0x4a0: 0x00000003
            kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
            kfffde[1].xptr.au: 3 ; 0x4a8: 0x00000003
            kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001
            kfffde[2].xptr.au: 4 ; 0x4b0: 0x00000004
            kfffde[2].xptr.disk: 0 ; 0x4b4: 0x0000
            kfffde[3].xptr.au: 4 ; 0x4b8: 0x00000004
            kfffde[3].xptr.disk: 1 ; 0x4bc: 0x0001
            kfffde[4].xptr.au: 5 ; 0x4c0: 0x00000005
            kfffde[4].xptr.disk: 0 ; 0x4c4: 0x0000
            kfffde[5].xptr.au: 5 ; 0x4c8: 0x00000005
            kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001
            kfffde[6].xptr.au: 6 ; 0x4d0: 0x00000006
            kfffde[6].xptr.disk: 0 ; 0x4d4: 0x0000
            kfffde[7].xptr.au: 6 ; 0x4d8: 0x00000006
            kfffde[7].xptr.disk: 1 ; 0x4dc: 0x0001
            kfffde[8].xptr.au: 7 ; 0x4e0: 0x00000007
            kfffde[8].xptr.disk: 0 ; 0x4e4: 0x0000
            kfffde[9].xptr.au: 7 ; 0x4e8: 0x00000007
            kfffde[9].xptr.disk: 1 ; 0x4ec: 0x0001
            kfffde[10].xptr.au: 8 ; 0x4f0: 0x00000008
            kfffde[10].xptr.disk: 0 ; 0x4f4: 0x0000
            kfffde[11].xptr.au: 8 ; 0x4f8: 0x00000008
            kfffde[11].xptr.disk: 1 ; 0x4fc: 0x0001
            kfffde[12].xptr.au: 9 ; 0x500: 0x00000009
            kfffde[12].xptr.disk: 0 ; 0x504: 0x0000
            kfffde[13].xptr.au: 9 ; 0x508: 0x00000009
            kfffde[13].xptr.disk: 1 ; 0x50c: 0x0001
            kfffde[14].xptr.au: 10 ; 0x510: 0x0000000a
            kfffde[14].xptr.disk: 0 ; 0x514: 0x0000
            kfffde[15].xptr.au: 10 ; 0x518: 0x0000000a
            kfffde[15].xptr.disk: 1 ; 0x51c: 0x0001
            kfffde[16].xptr.au: 11 ; 0x520: 0x0000000b
            kfffde[16].xptr.disk: 0 ; 0x524: 0x0000
            kfffde[17].xptr.au: 11 ; 0x528: 0x0000000b
            kfffde[17].xptr.disk: 1 ; 0x52c: 0x0001
            kfffde[18].xptr.au: 12 ; 0x530: 0x0000000c
            kfffde[18].xptr.disk: 0 ; 0x534: 0x0000
            kfffde[19].xptr.au: 12 ; 0x538: 0x0000000c
            kfffde[19].xptr.disk: 1 ; 0x53c: 0x0001
            kfffde[20].xptr.au: 13 ; 0x540: 0x0000000d
            kfffde[20].xptr.disk: 0 ; 0x544: 0x0000
            kfffde[21].xptr.au: 13 ; 0x548: 0x0000000d
            kfffde[21].xptr.disk: 1 ; 0x54c: 0x0001
            kfffde[22].xptr.au: 14 ; 0x550: 0x0000000e
            kfffde[22].xptr.disk: 0 ; 0x554: 0x0000
            kfffde[23].xptr.au: 14 ; 0x558: 0x0000000e
            kfffde[23].xptr.disk: 1 ; 0x55c: 0x0001
            kfffde[24].xptr.au: 15 ; 0x560: 0x0000000f
            kfffde[24].xptr.disk: 0 ; 0x564: 0x0000
            kfffde[25].xptr.au: 15 ; 0x568: 0x0000000f
            kfffde[25].xptr.disk: 1 ; 0x56c: 0x0001
            kfffde[26].xptr.au: 16 ; 0x570: 0x00000010
            kfffde[26].xptr.disk: 0 ; 0x574: 0x0000
            kfffde[27].xptr.au: 16 ; 0x578: 0x00000010
            kfffde[27].xptr.disk: 1 ; 0x57c: 0x0001
            kfffde[28].xptr.au: 17 ; 0x580: 0x00000011
            kfffde[28].xptr.disk: 0 ; 0x584: 0x0000
            kfffde[29].xptr.au: 17 ; 0x588: 0x00000011
            kfffde[29].xptr.disk: 1 ; 0x58c: 0x0001
            kfffde[30].xptr.au: 18 ; 0x590: 0x00000012
            kfffde[30].xptr.disk: 0 ; 0x594: 0x0000
            kfffde[31].xptr.au: 18 ; 0x598: 0x00000012
            kfffde[31].xptr.disk: 1 ; 0x59c: 0x0001
            kfffde[32].xptr.au: 19 ; 0x5a0: 0x00000013
            kfffde[32].xptr.disk: 0 ; 0x5a4: 0x0000
            kfffde[33].xptr.au: 19 ; 0x5a8: 0x00000013
            kfffde[33].xptr.disk: 1 ; 0x5ac: 0x0001
            kfffde[34].xptr.au: 20 ; 0x5b0: 0x00000014
            kfffde[34].xptr.disk: 0 ; 0x5b4: 0x0000
            kfffde[35].xptr.au: 20 ; 0x5b8: 0x00000014
            kfffde[35].xptr.disk: 1 ; 0x5bc: 0x0001
            kfffde[36].xptr.au: 21 ; 0x5c0: 0x00000015
            kfffde[36].xptr.disk: 0 ; 0x5c4: 0x0000
            kfffde[37].xptr.au: 21 ; 0x5c8: 0x00000015
            kfffde[37].xptr.disk: 1 ; 0x5cc: 0x0001
            kfffde[38].xptr.au: 22 ; 0x5d0: 0x00000016
            kfffde[38].xptr.disk: 0 ; 0x5d4: 0x0000
            kfffde[39].xptr.au: 22 ; 0x5d8: 0x00000016
            kfffde[39].xptr.disk: 1 ; 0x5dc: 0x0001
            kfffde[40].xptr.au: 23 ; 0x5e0: 0x00000017
            kfffde[40].xptr.disk: 0 ; 0x5e4: 0x0000
            kfffde[41].xptr.au: 23 ; 0x5e8: 0x00000017
            kfffde[41].xptr.disk: 1 ; 0x5ec: 0x0001
            kfffde[42].xptr.au: 28 ; 0x5f0: 0x0000001c
            kfffde[42].xptr.disk: 0 ; 0x5f4: 0x0000
            kfffde[43].xptr.au: 26 ; 0x5f8: 0x0000001a
            kfffde[43].xptr.disk: 1 ; 0x5fc: 0x0001
            kfffde[44].xptr.au: 29 ; 0x600: 0x0000001d
            kfffde[44].xptr.disk: 0 ; 0x604: 0x0000
            kfffde[45].xptr.au: 27 ; 0x608: 0x0000001b
            kfffde[45].xptr.disk: 1 ; 0x60c: 0x0001
            kfffde[46].xptr.au: 30 ; 0x610: 0x0000001e
            kfffde[46].xptr.disk: 0 ; 0x614: 0x0000
            kfffde[47].xptr.au: 28 ; 0x618: 0x0000001c
            kfffde[47].xptr.disk: 1 ; 0x61c: 0x0001
            kfffde[48].xptr.au: 31 ; 0x620: 0x0000001f
            kfffde[48].xptr.disk: 0 ; 0x624: 0x0000
            kfffde[49].xptr.au: 29 ; 0x628: 0x0000001d
            kfffde[49].xptr.disk: 1 ; 0x62c: 0x0001
            kfffde[50].xptr.au: 32 ; 0x630: 0x00000020
            kfffde[50].xptr.disk: 0 ; 0x634: 0x0000
            kfffde[51].xptr.au: 30 ; 0x638: 0x0000001e
            kfffde[51].xptr.disk: 1 ; 0x63c: 0x0001
            kfffde[52].xptr.au: 33 ; 0x640: 0x00000021
            kfffde[52].xptr.disk: 0 ; 0x644: 0x0000
            kfffde[53].xptr.au: 31 ; 0x648: 0x0000001f
            kfffde[53].xptr.disk: 1 ; 0x64c: 0x0001
            kfffde[54].xptr.au: 34 ; 0x650: 0x00000022
            kfffde[54].xptr.disk: 0 ; 0x654: 0x0000
            kfffde[55].xptr.au: 32 ; 0x658: 0x00000020
            kfffde[55].xptr.disk: 1 ; 0x65c: 0x0001
            kfffde[56].xptr.au: 35 ; 0x660: 0x00000023
            kfffde[56].xptr.disk: 0 ; 0x664: 0x0000
            kfffde[57].xptr.au: 33 ; 0x668: 0x00000021
            kfffde[57].xptr.disk: 1 ; 0x66c: 0x0001
            kfffde[58].xptr.au: 36 ; 0x670: 0x00000024
            kfffde[58].xptr.disk: 0 ; 0x674: 0x0000
            kfffde[59].xptr.au: 34 ; 0x678: 0x00000022
            kfffde[59].xptr.disk: 1 ; 0x67c: 0x0001
            kfffde[60].xptr.au: 35 ; 0x680: 0x00000023
            kfffde[60].xptr.disk: 1 ; 0x684: 0x0001
            0-59,60个au分布,每个1m,就是60m
            60这个是间接au,从上面可以看到0号磁盘是/dev/asmdisk4,1号磁盘是asmdisk5


            [root@hisdb01 ~]# kfed read /dev/asmdisk5 aun=35 blkn=0 aus=1048576|egrep type --KFBTYP_INDIRECT
            [grid@hisdb01 ~]$ kfed read /dev/asmdisk5 aun=35 blkn=0 aus=1048576|egrep "block|disk|au"|egrep -v "65535|4294967295"
            kfbh.block.blk: 2147483648 ; 0x004: blk=0 (indirect)
            kfbh.block.obj: 3 ; 0x008: file=3
            kffixe[0].xptr.au: 37 ; 0x00c: 0x00000025
            kffixe[0].xptr.disk: 0 ; 0x010: 0x0000
            kffixe[1].xptr.au: 36 ; 0x014: 0x00000024
            kffixe[1].xptr.disk: 1 ; 0x018: 0x0001
            kffixe[2].xptr.au: 38 ; 0x01c: 0x00000026
            kffixe[2].xptr.disk: 0 ; 0x020: 0x0000
            kffixe[3].xptr.au: 37 ; 0x024: 0x00000025
            kffixe[3].xptr.disk: 1 ; 0x028: 0x0001
            kffixe[4].xptr.au: 39 ; 0x02c: 0x00000027
            kffixe[4].xptr.disk: 0 ; 0x030: 0x0000
            kffixe[5].xptr.au: 38 ; 0x034: 0x00000026
            kffixe[5].xptr.disk: 1 ; 0x038: 0x0001
            kffixe[6].xptr.au: 40 ; 0x03c: 0x00000028
            kffixe[6].xptr.disk: 0 ; 0x040: 0x0000
            kffixe[7].xptr.au: 39 ; 0x044: 0x00000027
            kffixe[7].xptr.disk: 1 ; 0x048: 0x0001
            kffixe[8].xptr.au: 41 ; 0x04c: 0x00000029
            kffixe[8].xptr.disk: 0 ; 0x050: 0x0000
            kffixe[9].xptr.au: 40 ; 0x054: 0x00000028
            kffixe[9].xptr.disk: 1 ; 0x058: 0x0001
            kffixe[10].xptr.au: 42 ; 0x05c: 0x0000002a
            kffixe[10].xptr.disk: 0 ; 0x060: 0x0000
            kffixe[11].xptr.au: 41 ; 0x064: 0x00000029
            kffixe[11].xptr.disk: 1 ; 0x068: 0x0001
            kffixe[12].xptr.au: 43 ; 0x06c: 0x0000002b
            kffixe[12].xptr.disk: 0 ; 0x070: 0x0000
            kffixe[13].xptr.au: 42 ; 0x074: 0x0000002a
            kffixe[13].xptr.disk: 1 ; 0x078: 0x0001
            kffixe[14].xptr.au: 44 ; 0x07c: 0x0000002c
            kffixe[14].xptr.disk: 0 ; 0x080: 0x0000
            kffixe[15].xptr.au: 43 ; 0x084: 0x0000002b
            kffixe[15].xptr.disk: 1 ; 0x088: 0x0001
            kffixe[16].xptr.au: 45 ; 0x08c: 0x0000002d
            kffixe[16].xptr.disk: 0 ; 0x090: 0x0000
            kffixe[17].xptr.au: 44 ; 0x094: 0x0000002c
            kffixe[17].xptr.disk: 1 ; 0x098: 0x0001
            kffixe[18].xptr.au: 46 ; 0x09c: 0x0000002e
            kffixe[18].xptr.disk: 0 ; 0x0a0: 0x0000
            kffixe[19].xptr.au: 45 ; 0x0a4: 0x0000002d
            kffixe[19].xptr.disk: 1 ; 0x0a8: 0x0001
            kffixe[20].xptr.au: 47 ; 0x0ac: 0x0000002f
            kffixe[20].xptr.disk: 0 ; 0x0b0: 0x0000
            kffixe[21].xptr.au: 46 ; 0x0b4: 0x0000002e
            kffixe[21].xptr.disk: 1 ; 0x0b8: 0x0001
            kffixe[22].xptr.au: 48 ; 0x0bc: 0x00000030
            kffixe[22].xptr.disk: 0 ; 0x0c0: 0x0000
            kffixe[23].xptr.au: 47 ; 0x0c4: 0x0000002f
            kffixe[23].xptr.disk: 1 ; 0x0c8: 0x0001
            0-23,24个au分布,每个1m,就是24m,加上前面的60个直接AU,就是84M ,由于是2个实例,就要除以2,所以一个实例是42M!!!和x$kffxp查询到的一样


            4、kfed解析

              4.1 KFBTYP_ACDC元数据块解析
              [grid@hisdb01 ~]$ kfed read /dev/asmdisk4 aun=3 blkn=0 aus=1M
              kfbh.endian: 1 ; 0x000: 0x01
              kfbh.hard: 130 ; 0x001: 0x82
              kfbh.type: 7 ; 0x002: KFBTYP_ACDC
              kfbh.datfmt: 1 ; 0x003: 0x01
              kfbh.block.blk: 0 ; 0x004: blk=0
              kfbh.block.obj: 3 ; 0x008: file=3
              kfbh.check: 1111746090 ; 0x00c: 0x4243e62a
              kfbh.fcn.base: 0 ; 0x010: 0x00000000
              kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
              kfbh.spare1: 0 ; 0x018: 0x00000000
              kfbh.spare2: 0 ; 0x01c: 0x00000000
              kfracdc.eyec[0]: 65 ; 0x000: 0x41
              kfracdc.eyec[1]: 67 ; 0x001: 0x43
              kfracdc.eyec[2]: 68 ; 0x002: 0x44
              kfracdc.eyec[3]: 67 ; 0x003: 0x43
              kfracdc.thread: 1 ; 0x004: 0x00000001 --表示对应第一个asm实例
              kfracdc.lastAba.seq: 4294967295 ; 0x008: 0xffffffff --last ACD block address sequences
              kfracdc.lastAba.blk: 4294967295 ; 0x00c: 0xffffffff --last ACD block address block number
              kfracdc.blk0: 1 ; 0x010: 0x00000001
              kfracdc.blks: 10751 ; 0x014: 0x000029ff --ACD数据(元数据和数据)所占用block总数,换算一下即为42M,10751*4096/1024/1024=42M
              kfracdc.ckpt.seq: 32 ; 0x018: 0x00000020 --checkpoint 当前的sequenc号
              kfracdc.ckpt.blk: 657 ; 0x01c: 0x00000291 --checkpoint 信息所占的block数
              kfracdc.fcn.base: 3365 ; 0x020: 0x00000d25
              kfracdc.fcn.wrap: 0 ; 0x024: 0x00000000
              kfracdc.bufBlks: 256 ; 0x028: 0x00000100 --block总数
              kfracdc.strt112.seq: 2 ; 0x02c: 0x00000002
              kfracdc.strt112.blk: 0 ; 0x030: 0x00000000


              [grid@hisdb01 ~]$ kfed read /dev/asmdisk4 aun=28 blkn=0 aus=1048576
              kfbh.endian: 1 ; 0x000: 0x01
              kfbh.hard: 130 ; 0x001: 0x82
              kfbh.type: 7 ; 0x002: KFBTYP_ACDC --ACDC,即active change directory checkpoint
              kfbh.datfmt: 1 ; 0x003: 0x01
              kfbh.block.blk: 10752 ; 0x004: blk=10752
              kfbh.block.obj: 3 ; 0x008: file=3 --此块属于asm file 3
              kfbh.check: 1111745905 ; 0x00c: 0x4243e571
              kfbh.fcn.base: 3 ; 0x010: 0x00000003
              kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
              kfbh.spare1: 0 ; 0x018: 0x00000000
              kfbh.spare2: 0 ; 0x01c: 0x00000000
              kfracdc.eyec[0]: 65 ; 0x000: 0x41 --kfracdc这部分表示active change directory checkpoint信息
              kfracdc.eyec[1]: 67 ; 0x001: 0x43
              kfracdc.eyec[2]: 68 ; 0x002: 0x44
              kfracdc.eyec[3]: 67 ; 0x003: 0x43
              kfracdc.thread: 2 ; 0x004: 0x00000002 --表示对应第二个asm实例
              kfracdc.lastAba.seq: 4294967295 ; 0x008: 0xffffffff --last ACD block address sequences
              kfracdc.lastAba.blk: 4294967295 ; 0x00c: 0xffffffff --last ACD block address block number
              kfracdc.blk0: 10753 ; 0x010: 0x00002a01
              kfracdc.blks: 10751 ; 0x014: 0x000029ff --ACD数据(元数据和数据)所占用block总数,换算一下即为42M,10751*4096/1024/1024=42M
              kfracdc.ckpt.seq: 23 ; 0x018: 0x00000017 --checkpoint 当前的sequenc号
              kfracdc.ckpt.blk: 166 ; 0x01c: 0x000000a6 --checkpoint 信息所占的block数
              kfracdc.fcn.base: 3198 ; 0x020: 0x00000c7e
              kfracdc.fcn.wrap: 0 ; 0x024: 0x00000000
              kfracdc.bufBlks: 256 ; 0x028: 0x00000100 --block总数
              kfracdc.strt112.seq: 2 ; 0x02c: 0x00000002
              kfracdc.strt112.blk: 0 ; 0x030: 0x00000000


              4.2 KFBTYP_CHNGDIR ACD实际数据块解析
              以上是ACD的开始,也就是block 0。我们来看一下block 1,也就是ACD的实际数据。
              [grid@hisdb01 ~]$ kfed read /dev/asmdisk4 aun=3 blkn=1 aus=1M|more
              kfbh.endian: 1 ; 0x000: 0x01
              kfbh.hard: 130 ; 0x001: 0x82
              kfbh.type: 8 ; 0x002: KFBTYP_CHNGDIR
              kfbh.datfmt: 1 ; 0x003: 0x01
              kfbh.block.blk: 1 ; 0x004: blk=1
              kfbh.block.obj: 3 ; 0x008: file=3
              kfbh.check: 17400326 ; 0x00c: 0x01098206
              kfbh.fcn.base: 0 ; 0x010: 0x00000000
              kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
              kfbh.spare1: 0 ; 0x018: 0x00000000
              kfbh.spare2: 0 ; 0x01c: 0x00000000
              kfracdb.aba.seq: 2 ; 0x000: 0x00000002 --ACD block address sequence
              kfracdb.aba.blk: 0 ; 0x004: 0x00000000 --ACD block address block number
              kfracdb.ents: 2 ; 0x008: 0x0002 --这里应该是指的包含的extent数,即2M。
              kfracdb.ub2spare: 0 ; 0x00a: 0x0000
              下面的lge即为ACD redo log records记录:
              kfracdb.lge[0].valid: 1 ; 0x00c: V=1 B=0 M=0
              kfracdb.lge[0].chgCount: 1 ; 0x00d: 0x01
              kfracdb.lge[0].len: 52 ; 0x00e: 0x0034
              kfracdb.lge[0].kfcn.base: 1 ; 0x010: 0x00000001
              kfracdb.lge[0].kfcn.wrap: 0 ; 0x014: 0x00000000
              下面的bcd信息是表示ACD block change description信息:
              kfracdb.lge[0].bcd[0].kfbl.blk: 0 ; 0x018: blk=0
              kfracdb.lge[0].bcd[0].kfbl.obj: 4 ; 0x01c: file=4
              kfracdb.lge[0].bcd[0].kfcn.base: 0 ; 0x020: 0x00000000
              kfracdb.lge[0].bcd[0].kfcn.wrap: 0 ; 0x024: 0x00000000
              kfracdb.lge[0].bcd[0].oplen: 4 ; 0x028: 0x0004 --表示长度,类似logfile dump的LEN
              kfracdb.lge[0].bcd[0].blkIndex: 0 ; 0x02a: 0x0000
              kfracdb.lge[0].bcd[0].flags: 28 ; 0x02c: F=0 N=0 F=1 L=1 V=1 A=0 C=0
              kfracdb.lge[0].bcd[0].opcode: 212 ; 0x02e: 0x00d4 --opcode,类似数据库实例中的update/delete/insert操作的opcode
              kfracdb.lge[0].bcd[0].kfbtyp: 9 ; 0x030: KFBTYP_COD_BGO --操作类型,类似数据库实例中的update/delete/insert等类型
              kfracdb.lge[0].bcd[0].redund: 17 ; 0x031: SCHE=0x1 NUMB=0x1 --冗余级别,17是unport,18是mirror,19表示high
              kfracdb.lge[0].bcd[0].pad: 63903 ; 0x032: 0xf99f
              kfracdb.lge[0].bcd[0].KFRCOD_CRASH: 1 ; 0x034: 0x00000001
              kfracdb.lge[0].bcd[0].au[0]: 24 ; 0x038: 0x00000018
              kfracdb.lge[0].bcd[0].disks[0]: 1 ; 0x03c: 0x0001
              kfracdb.lge[1].valid: 1 ; 0x040: V=1 B=0 M=0 --由于我DATA对应2个磁盘,下面这个lge1代表另外一个磁盘信息,总共两个lge条目;
              kfracdb.lge[1].chgCount: 1 ; 0x041: 0x01
              kfracdb.lge[1].len: 52 ; 0x042: 0x0034
              kfracdb.lge[1].kfcn.base: 2 ; 0x044: 0x00000002
              kfracdb.lge[1].kfcn.wrap: 0 ; 0x048: 0x00000000
              kfracdb.lge[1].bcd[0].kfbl.blk: 1 ; 0x04c: blk=1
              kfracdb.lge[1].bcd[0].kfbl.obj: 4 ; 0x050: file=4
              kfracdb.lge[1].bcd[0].kfcn.base: 0 ; 0x054: 0x00000000
              kfracdb.lge[1].bcd[0].kfcn.wrap: 0 ; 0x058: 0x00000000
              kfracdb.lge[1].bcd[0].oplen: 4 ; 0x05c: 0x0004
              kfracdb.lge[1].bcd[0].blkIndex: 1 ; 0x05e: 0x0001
              kfracdb.lge[1].bcd[0].flags: 28 ; 0x060: F=0 N=0 F=1 L=1 V=1 A=0 C=0
              kfracdb.lge[1].bcd[0].opcode: 212 ; 0x062: 0x00d4
              kfracdb.lge[1].bcd[0].kfbtyp: 15 ; 0x064: KFBTYP_COD_RBO
              kfracdb.lge[1].bcd[0].redund: 17 ; 0x065: SCHE=0x1 NUMB=0x1
              kfracdb.lge[1].bcd[0].pad: 63903 ; 0x066: 0xf99f
              kfracdb.lge[1].bcd[0].KFRCOD_CRASH: 0 ; 0x068: 0x00000000
              kfracdb.lge[1].bcd[0].au[0]: 24 ; 0x06c: 0x00000018
              kfracdb.lge[1].bcd[0].disks[0]: 1 ; 0x070: 0x0001
              我们看到ACD 1号block的类型是KFBTYP_CHNGDIR,包含了kfracdb.lge[i]数据结构,也就是ASM的redo日志记录。以上信息中我们需要关注2个地方,一个是正在进行中的操作(opcode,即操作码),另一个是操作类型(kfbtyp)。


              上面有部分信息,我目前也不清楚具体的含义,只能猜测个大概。从上面我们所了解的信息来看,当asm实例在对元数据进行变更以后,会将更改前的信息写入到ACD 数据中,而ACD data中记录了哪些数据呢?


              主要是记录了这样一些数据:线程号,block号,opcode,sequences,记录长度等信息。
              这样,当你处于运行的asm实例,突然crash后,那么重启asm实例以后,asm可以根据ACD信息去进行”instance recover”,从而保证能够正常启动asm实例。


              5、总结

                最后简单总结一下:


                1. Active change dictectory,也就是asm元数据file 3,一共占据42个AU 大小,简称ACD. 每个asm实例对应一份ACD信息,换句话讲,你是双节点asm rac,那么就有84M的ACD数据,以此类推.(事实上不管你AU是多大ACD的信息都是固定的大小)
                2. asm中ACDC就类似数据库实例中的redo,记录asm元数据操作记录,以便于asm crash后进行instance recover.
                3. ACDC信息所在AU,第一个block是其元数据,后面的blockdata信息.
                4. ACDC data的数据,跟redo的结构有点类似,里面记录的也是threadsequence,len,opcode等信息.
                5. ACDC平时恢复最多的就是检查点信息,也就是最重要的结构blkn=0;

                当磁盘检查点信息不对无法前滚时候,就需要修改这部分内容,将磁盘组mount起来。




                文章转载自数据库技术加油站,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论