【作者简介】
本人医疗行业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 220col name for a10col state for a10col COMPATIBILITY for a15col database_compatibility for a15SQL> 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 N2 FRA MOUNTED EXTERN 9.765625 8.68847656 8.68847656 1 0 11.2.0.0.0 10.1.0.0.0 N3 SYSTEMDG MOUNTED NORMAL 2.9296875 2.02539063 .524414063 1 0 11.2.0.0.0 10.1.0.0.0 Yselect number_kffxp file#, disk_kffxp disk#, count(disk_kffxp) extentsfrom x$kffxpwhere group_kffxp=1and disk_kffxp <> 65534group by number_kffxp, disk_kffxporder by 1;FILE# DISK# EXTENTS---------- ---------- ----------1 0 11 1 12 1 13 0 42 --由于是rac,多个实例,并且au大小是1M,所以有2个acdc,但是下面怎么是43?3 1 434 0 44 1 45 0 16 1 18 0 19 0 1set line 200 pages 1000col "disk name" for a20col path for a25col type for a20col au for 99999SELECT x.number_kffxp file#,x.xnum_kffxp "Extent",case lxn_kffxpwhen 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_NUMBERFROM x$kffxp x, v$asm_disk_stat dWHERE x.group_kffxp=d.group_numberand x.disk_kffxp=d.disk_numberand x.group_kffxp=1and x.number_kffxp=3ORDER BY 1, 2;FILE# Extent AU Disk # Disk name PATH GROUP_NUMBER DISK_NUMBER---------- ---------- ---------- ---------- -------------------- ------------------------------ ------------ -----------3 0 3 0 DATA_0000 dev/asmdisk4 1 03 1 3 1 DATA_0001 dev/asmdisk5 1 13 2 4 0 DATA_0000 dev/asmdisk4 1 03 3 4 1 DATA_0001 dev/asmdisk5 1 13 4 5 0 DATA_0000 dev/asmdisk4 1 03 5 5 1 DATA_0001 dev/asmdisk5 1 13 6 6 0 DATA_0000 dev/asmdisk4 1 0...3 80 47 0 DATA_0000 dev/asmdisk4 1 03 81 46 1 DATA_0001 dev/asmdisk5 1 13 82 48 0 DATA_0000 dev/asmdisk4 1 03 83 47 1 DATA_0001 dev/asmdisk5 1 13 2147483648 35 1 DATA_0001 dev/asmdisk5 1 1 --原来是多了这一行85 rows selected.--这里需要说明的是,每一个asm实例,都用有其自己的ACD目录,换句话讲,如果你是双节点的rac,那么就有84m的ACD 目录信息。
2) kfed查询--从3号au开始,找哪些au的块包含了ACDC的,只找blk=0for ((i=3;i<=100;i++));dofor ((j=0;j<1;j++));doDIR=`kfed read dev/asmdisk4 aunum=$i blknum=$j aus=1048576|grep -i KFBTYP_ACDC`if [ "$DIR" != "" ];thenecho "aun="$i "blknum="$j "dir="$DIRfidone;done;--aun=3 blknum=0 dir=kfbh.type: 7 ; 0x002: KFBTYP_ACDC--aun=28 blknum=0 dir=kfbh.type: 7 ; 0x002: KFBTYP_ACDCfor ((i=3;i<=100;i++));dofor ((j=0;j<1;j++));doDIR=`kfed read dev/asmdisk5 aunum=$i blknum=$j aus=1048576|grep -i KFBTYP_ACDC`if [ "$DIR" != "" ];thenecho "aun="$i "blknum="$j "dir="$DIRfidone;done;--没有记录##通过查找块类型,外部冗余,发现只有0号磁盘才有KFBTYP_ACDC 元数据块,而normal冗余每个磁盘上都有镜像;也就是检查点的记录块blkn=0;##通常来讲,一个block是元数据,而后面的block就是实际数据了。继续读取Active change directory data:KFBTYP_CHNGDIRfor ((i=3;i<=100;i++));dofor ((j=0;j<256;j++));doDIR=`kfed read /dev/asmdisk4 aunum=$i blknum=$j aus=1048576|grep -i KFBTYP_CHNGDIR`if [ "$DIR" != "" ];thenecho "aun="$i "blknum="$j "dir="$DIRfidone;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=3kfbh.block.obj: 1 ; 0x008: file=1kfffde[0].xptr.au: 3 ; 0x4a0: 0x00000003kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000kfffde[1].xptr.au: 3 ; 0x4a8: 0x00000003kfffde[1].xptr.disk: 1 ; 0x4ac: 0x0001kfffde[2].xptr.au: 4 ; 0x4b0: 0x00000004kfffde[2].xptr.disk: 0 ; 0x4b4: 0x0000kfffde[3].xptr.au: 4 ; 0x4b8: 0x00000004kfffde[3].xptr.disk: 1 ; 0x4bc: 0x0001kfffde[4].xptr.au: 5 ; 0x4c0: 0x00000005kfffde[4].xptr.disk: 0 ; 0x4c4: 0x0000kfffde[5].xptr.au: 5 ; 0x4c8: 0x00000005kfffde[5].xptr.disk: 1 ; 0x4cc: 0x0001kfffde[6].xptr.au: 6 ; 0x4d0: 0x00000006kfffde[6].xptr.disk: 0 ; 0x4d4: 0x0000kfffde[7].xptr.au: 6 ; 0x4d8: 0x00000006kfffde[7].xptr.disk: 1 ; 0x4dc: 0x0001kfffde[8].xptr.au: 7 ; 0x4e0: 0x00000007kfffde[8].xptr.disk: 0 ; 0x4e4: 0x0000kfffde[9].xptr.au: 7 ; 0x4e8: 0x00000007kfffde[9].xptr.disk: 1 ; 0x4ec: 0x0001kfffde[10].xptr.au: 8 ; 0x4f0: 0x00000008kfffde[10].xptr.disk: 0 ; 0x4f4: 0x0000kfffde[11].xptr.au: 8 ; 0x4f8: 0x00000008kfffde[11].xptr.disk: 1 ; 0x4fc: 0x0001kfffde[12].xptr.au: 9 ; 0x500: 0x00000009kfffde[12].xptr.disk: 0 ; 0x504: 0x0000kfffde[13].xptr.au: 9 ; 0x508: 0x00000009kfffde[13].xptr.disk: 1 ; 0x50c: 0x0001kfffde[14].xptr.au: 10 ; 0x510: 0x0000000akfffde[14].xptr.disk: 0 ; 0x514: 0x0000kfffde[15].xptr.au: 10 ; 0x518: 0x0000000akfffde[15].xptr.disk: 1 ; 0x51c: 0x0001kfffde[16].xptr.au: 11 ; 0x520: 0x0000000bkfffde[16].xptr.disk: 0 ; 0x524: 0x0000kfffde[17].xptr.au: 11 ; 0x528: 0x0000000bkfffde[17].xptr.disk: 1 ; 0x52c: 0x0001kfffde[18].xptr.au: 12 ; 0x530: 0x0000000ckfffde[18].xptr.disk: 0 ; 0x534: 0x0000kfffde[19].xptr.au: 12 ; 0x538: 0x0000000ckfffde[19].xptr.disk: 1 ; 0x53c: 0x0001kfffde[20].xptr.au: 13 ; 0x540: 0x0000000dkfffde[20].xptr.disk: 0 ; 0x544: 0x0000kfffde[21].xptr.au: 13 ; 0x548: 0x0000000dkfffde[21].xptr.disk: 1 ; 0x54c: 0x0001kfffde[22].xptr.au: 14 ; 0x550: 0x0000000ekfffde[22].xptr.disk: 0 ; 0x554: 0x0000kfffde[23].xptr.au: 14 ; 0x558: 0x0000000ekfffde[23].xptr.disk: 1 ; 0x55c: 0x0001kfffde[24].xptr.au: 15 ; 0x560: 0x0000000fkfffde[24].xptr.disk: 0 ; 0x564: 0x0000kfffde[25].xptr.au: 15 ; 0x568: 0x0000000fkfffde[25].xptr.disk: 1 ; 0x56c: 0x0001kfffde[26].xptr.au: 16 ; 0x570: 0x00000010kfffde[26].xptr.disk: 0 ; 0x574: 0x0000kfffde[27].xptr.au: 16 ; 0x578: 0x00000010kfffde[27].xptr.disk: 1 ; 0x57c: 0x0001kfffde[28].xptr.au: 17 ; 0x580: 0x00000011kfffde[28].xptr.disk: 0 ; 0x584: 0x0000kfffde[29].xptr.au: 17 ; 0x588: 0x00000011kfffde[29].xptr.disk: 1 ; 0x58c: 0x0001kfffde[30].xptr.au: 18 ; 0x590: 0x00000012kfffde[30].xptr.disk: 0 ; 0x594: 0x0000kfffde[31].xptr.au: 18 ; 0x598: 0x00000012kfffde[31].xptr.disk: 1 ; 0x59c: 0x0001kfffde[32].xptr.au: 19 ; 0x5a0: 0x00000013kfffde[32].xptr.disk: 0 ; 0x5a4: 0x0000kfffde[33].xptr.au: 19 ; 0x5a8: 0x00000013kfffde[33].xptr.disk: 1 ; 0x5ac: 0x0001kfffde[34].xptr.au: 20 ; 0x5b0: 0x00000014kfffde[34].xptr.disk: 0 ; 0x5b4: 0x0000kfffde[35].xptr.au: 20 ; 0x5b8: 0x00000014kfffde[35].xptr.disk: 1 ; 0x5bc: 0x0001kfffde[36].xptr.au: 21 ; 0x5c0: 0x00000015kfffde[36].xptr.disk: 0 ; 0x5c4: 0x0000kfffde[37].xptr.au: 21 ; 0x5c8: 0x00000015kfffde[37].xptr.disk: 1 ; 0x5cc: 0x0001kfffde[38].xptr.au: 22 ; 0x5d0: 0x00000016kfffde[38].xptr.disk: 0 ; 0x5d4: 0x0000kfffde[39].xptr.au: 22 ; 0x5d8: 0x00000016kfffde[39].xptr.disk: 1 ; 0x5dc: 0x0001kfffde[40].xptr.au: 23 ; 0x5e0: 0x00000017kfffde[40].xptr.disk: 0 ; 0x5e4: 0x0000kfffde[41].xptr.au: 23 ; 0x5e8: 0x00000017kfffde[41].xptr.disk: 1 ; 0x5ec: 0x0001kfffde[42].xptr.au: 28 ; 0x5f0: 0x0000001ckfffde[42].xptr.disk: 0 ; 0x5f4: 0x0000kfffde[43].xptr.au: 26 ; 0x5f8: 0x0000001akfffde[43].xptr.disk: 1 ; 0x5fc: 0x0001kfffde[44].xptr.au: 29 ; 0x600: 0x0000001dkfffde[44].xptr.disk: 0 ; 0x604: 0x0000kfffde[45].xptr.au: 27 ; 0x608: 0x0000001bkfffde[45].xptr.disk: 1 ; 0x60c: 0x0001kfffde[46].xptr.au: 30 ; 0x610: 0x0000001ekfffde[46].xptr.disk: 0 ; 0x614: 0x0000kfffde[47].xptr.au: 28 ; 0x618: 0x0000001ckfffde[47].xptr.disk: 1 ; 0x61c: 0x0001kfffde[48].xptr.au: 31 ; 0x620: 0x0000001fkfffde[48].xptr.disk: 0 ; 0x624: 0x0000kfffde[49].xptr.au: 29 ; 0x628: 0x0000001dkfffde[49].xptr.disk: 1 ; 0x62c: 0x0001kfffde[50].xptr.au: 32 ; 0x630: 0x00000020kfffde[50].xptr.disk: 0 ; 0x634: 0x0000kfffde[51].xptr.au: 30 ; 0x638: 0x0000001ekfffde[51].xptr.disk: 1 ; 0x63c: 0x0001kfffde[52].xptr.au: 33 ; 0x640: 0x00000021kfffde[52].xptr.disk: 0 ; 0x644: 0x0000kfffde[53].xptr.au: 31 ; 0x648: 0x0000001fkfffde[53].xptr.disk: 1 ; 0x64c: 0x0001kfffde[54].xptr.au: 34 ; 0x650: 0x00000022kfffde[54].xptr.disk: 0 ; 0x654: 0x0000kfffde[55].xptr.au: 32 ; 0x658: 0x00000020kfffde[55].xptr.disk: 1 ; 0x65c: 0x0001kfffde[56].xptr.au: 35 ; 0x660: 0x00000023kfffde[56].xptr.disk: 0 ; 0x664: 0x0000kfffde[57].xptr.au: 33 ; 0x668: 0x00000021kfffde[57].xptr.disk: 1 ; 0x66c: 0x0001kfffde[58].xptr.au: 36 ; 0x670: 0x00000024kfffde[58].xptr.disk: 0 ; 0x674: 0x0000kfffde[59].xptr.au: 34 ; 0x678: 0x00000022kfffde[59].xptr.disk: 1 ; 0x67c: 0x0001kfffde[60].xptr.au: 35 ; 0x680: 0x00000023kfffde[60].xptr.disk: 1 ; 0x684: 0x00010-59,60个au分布,每个1m,就是60m60这个是间接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=3kffixe[0].xptr.au: 37 ; 0x00c: 0x00000025kffixe[0].xptr.disk: 0 ; 0x010: 0x0000kffixe[1].xptr.au: 36 ; 0x014: 0x00000024kffixe[1].xptr.disk: 1 ; 0x018: 0x0001kffixe[2].xptr.au: 38 ; 0x01c: 0x00000026kffixe[2].xptr.disk: 0 ; 0x020: 0x0000kffixe[3].xptr.au: 37 ; 0x024: 0x00000025kffixe[3].xptr.disk: 1 ; 0x028: 0x0001kffixe[4].xptr.au: 39 ; 0x02c: 0x00000027kffixe[4].xptr.disk: 0 ; 0x030: 0x0000kffixe[5].xptr.au: 38 ; 0x034: 0x00000026kffixe[5].xptr.disk: 1 ; 0x038: 0x0001kffixe[6].xptr.au: 40 ; 0x03c: 0x00000028kffixe[6].xptr.disk: 0 ; 0x040: 0x0000kffixe[7].xptr.au: 39 ; 0x044: 0x00000027kffixe[7].xptr.disk: 1 ; 0x048: 0x0001kffixe[8].xptr.au: 41 ; 0x04c: 0x00000029kffixe[8].xptr.disk: 0 ; 0x050: 0x0000kffixe[9].xptr.au: 40 ; 0x054: 0x00000028kffixe[9].xptr.disk: 1 ; 0x058: 0x0001kffixe[10].xptr.au: 42 ; 0x05c: 0x0000002akffixe[10].xptr.disk: 0 ; 0x060: 0x0000kffixe[11].xptr.au: 41 ; 0x064: 0x00000029kffixe[11].xptr.disk: 1 ; 0x068: 0x0001kffixe[12].xptr.au: 43 ; 0x06c: 0x0000002bkffixe[12].xptr.disk: 0 ; 0x070: 0x0000kffixe[13].xptr.au: 42 ; 0x074: 0x0000002akffixe[13].xptr.disk: 1 ; 0x078: 0x0001kffixe[14].xptr.au: 44 ; 0x07c: 0x0000002ckffixe[14].xptr.disk: 0 ; 0x080: 0x0000kffixe[15].xptr.au: 43 ; 0x084: 0x0000002bkffixe[15].xptr.disk: 1 ; 0x088: 0x0001kffixe[16].xptr.au: 45 ; 0x08c: 0x0000002dkffixe[16].xptr.disk: 0 ; 0x090: 0x0000kffixe[17].xptr.au: 44 ; 0x094: 0x0000002ckffixe[17].xptr.disk: 1 ; 0x098: 0x0001kffixe[18].xptr.au: 46 ; 0x09c: 0x0000002ekffixe[18].xptr.disk: 0 ; 0x0a0: 0x0000kffixe[19].xptr.au: 45 ; 0x0a4: 0x0000002dkffixe[19].xptr.disk: 1 ; 0x0a8: 0x0001kffixe[20].xptr.au: 47 ; 0x0ac: 0x0000002fkffixe[20].xptr.disk: 0 ; 0x0b0: 0x0000kffixe[21].xptr.au: 46 ; 0x0b4: 0x0000002ekffixe[21].xptr.disk: 1 ; 0x0b8: 0x0001kffixe[22].xptr.au: 48 ; 0x0bc: 0x00000030kffixe[22].xptr.disk: 0 ; 0x0c0: 0x0000kffixe[23].xptr.au: 47 ; 0x0c4: 0x0000002fkffixe[23].xptr.disk: 1 ; 0x0c8: 0x00010-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=1Mkfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 7 ; 0x002: KFBTYP_ACDCkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 0 ; 0x004: blk=0kfbh.block.obj: 3 ; 0x008: file=3kfbh.check: 1111746090 ; 0x00c: 0x4243e62akfbh.fcn.base: 0 ; 0x010: 0x00000000kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfracdc.eyec[0]: 65 ; 0x000: 0x41kfracdc.eyec[1]: 67 ; 0x001: 0x43kfracdc.eyec[2]: 68 ; 0x002: 0x44kfracdc.eyec[3]: 67 ; 0x003: 0x43kfracdc.thread: 1 ; 0x004: 0x00000001 --表示对应第一个asm实例kfracdc.lastAba.seq: 4294967295 ; 0x008: 0xffffffff --last ACD block address sequenceskfracdc.lastAba.blk: 4294967295 ; 0x00c: 0xffffffff --last ACD block address block numberkfracdc.blk0: 1 ; 0x010: 0x00000001kfracdc.blks: 10751 ; 0x014: 0x000029ff --ACD数据(元数据和数据)所占用block总数,换算一下即为42M,10751*4096/1024/1024=42Mkfracdc.ckpt.seq: 32 ; 0x018: 0x00000020 --checkpoint 当前的sequenc号kfracdc.ckpt.blk: 657 ; 0x01c: 0x00000291 --checkpoint 信息所占的block数kfracdc.fcn.base: 3365 ; 0x020: 0x00000d25kfracdc.fcn.wrap: 0 ; 0x024: 0x00000000kfracdc.bufBlks: 256 ; 0x028: 0x00000100 --block总数kfracdc.strt112.seq: 2 ; 0x02c: 0x00000002kfracdc.strt112.blk: 0 ; 0x030: 0x00000000[grid@hisdb01 ~]$ kfed read /dev/asmdisk4 aun=28 blkn=0 aus=1048576kfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 7 ; 0x002: KFBTYP_ACDC --ACDC,即active change directory checkpointkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 10752 ; 0x004: blk=10752kfbh.block.obj: 3 ; 0x008: file=3 --此块属于asm file 3kfbh.check: 1111745905 ; 0x00c: 0x4243e571kfbh.fcn.base: 3 ; 0x010: 0x00000003kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfracdc.eyec[0]: 65 ; 0x000: 0x41 --kfracdc这部分表示active change directory checkpoint信息kfracdc.eyec[1]: 67 ; 0x001: 0x43kfracdc.eyec[2]: 68 ; 0x002: 0x44kfracdc.eyec[3]: 67 ; 0x003: 0x43kfracdc.thread: 2 ; 0x004: 0x00000002 --表示对应第二个asm实例kfracdc.lastAba.seq: 4294967295 ; 0x008: 0xffffffff --last ACD block address sequenceskfracdc.lastAba.blk: 4294967295 ; 0x00c: 0xffffffff --last ACD block address block numberkfracdc.blk0: 10753 ; 0x010: 0x00002a01kfracdc.blks: 10751 ; 0x014: 0x000029ff --ACD数据(元数据和数据)所占用block总数,换算一下即为42M,10751*4096/1024/1024=42Mkfracdc.ckpt.seq: 23 ; 0x018: 0x00000017 --checkpoint 当前的sequenc号kfracdc.ckpt.blk: 166 ; 0x01c: 0x000000a6 --checkpoint 信息所占的block数kfracdc.fcn.base: 3198 ; 0x020: 0x00000c7ekfracdc.fcn.wrap: 0 ; 0x024: 0x00000000kfracdc.bufBlks: 256 ; 0x028: 0x00000100 --block总数kfracdc.strt112.seq: 2 ; 0x02c: 0x00000002kfracdc.strt112.blk: 0 ; 0x030: 0x000000004.2 KFBTYP_CHNGDIR ACD实际数据块解析以上是ACD的开始,也就是block 0。我们来看一下block 1,也就是ACD的实际数据。[grid@hisdb01 ~]$ kfed read /dev/asmdisk4 aun=3 blkn=1 aus=1M|morekfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 8 ; 0x002: KFBTYP_CHNGDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 1 ; 0x004: blk=1kfbh.block.obj: 3 ; 0x008: file=3kfbh.check: 17400326 ; 0x00c: 0x01098206kfbh.fcn.base: 0 ; 0x010: 0x00000000kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kfracdb.aba.seq: 2 ; 0x000: 0x00000002 --ACD block address sequencekfracdb.aba.blk: 0 ; 0x004: 0x00000000 --ACD block address block numberkfracdb.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=0kfracdb.lge[0].chgCount: 1 ; 0x00d: 0x01kfracdb.lge[0].len: 52 ; 0x00e: 0x0034kfracdb.lge[0].kfcn.base: 1 ; 0x010: 0x00000001kfracdb.lge[0].kfcn.wrap: 0 ; 0x014: 0x00000000下面的bcd信息是表示ACD block change description信息:kfracdb.lge[0].bcd[0].kfbl.blk: 0 ; 0x018: blk=0kfracdb.lge[0].bcd[0].kfbl.obj: 4 ; 0x01c: file=4kfracdb.lge[0].bcd[0].kfcn.base: 0 ; 0x020: 0x00000000kfracdb.lge[0].bcd[0].kfcn.wrap: 0 ; 0x024: 0x00000000kfracdb.lge[0].bcd[0].oplen: 4 ; 0x028: 0x0004 --表示长度,类似logfile dump的LENkfracdb.lge[0].bcd[0].blkIndex: 0 ; 0x02a: 0x0000kfracdb.lge[0].bcd[0].flags: 28 ; 0x02c: F=0 N=0 F=1 L=1 V=1 A=0 C=0kfracdb.lge[0].bcd[0].opcode: 212 ; 0x02e: 0x00d4 --opcode,类似数据库实例中的update/delete/insert操作的opcodekfracdb.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表示highkfracdb.lge[0].bcd[0].pad: 63903 ; 0x032: 0xf99fkfracdb.lge[0].bcd[0].KFRCOD_CRASH: 1 ; 0x034: 0x00000001kfracdb.lge[0].bcd[0].au[0]: 24 ; 0x038: 0x00000018kfracdb.lge[0].bcd[0].disks[0]: 1 ; 0x03c: 0x0001kfracdb.lge[1].valid: 1 ; 0x040: V=1 B=0 M=0 --由于我DATA对应2个磁盘,下面这个lge1代表另外一个磁盘信息,总共两个lge条目;kfracdb.lge[1].chgCount: 1 ; 0x041: 0x01kfracdb.lge[1].len: 52 ; 0x042: 0x0034kfracdb.lge[1].kfcn.base: 2 ; 0x044: 0x00000002kfracdb.lge[1].kfcn.wrap: 0 ; 0x048: 0x00000000kfracdb.lge[1].bcd[0].kfbl.blk: 1 ; 0x04c: blk=1kfracdb.lge[1].bcd[0].kfbl.obj: 4 ; 0x050: file=4kfracdb.lge[1].bcd[0].kfcn.base: 0 ; 0x054: 0x00000000kfracdb.lge[1].bcd[0].kfcn.wrap: 0 ; 0x058: 0x00000000kfracdb.lge[1].bcd[0].oplen: 4 ; 0x05c: 0x0004kfracdb.lge[1].bcd[0].blkIndex: 1 ; 0x05e: 0x0001kfracdb.lge[1].bcd[0].flags: 28 ; 0x060: F=0 N=0 F=1 L=1 V=1 A=0 C=0kfracdb.lge[1].bcd[0].opcode: 212 ; 0x062: 0x00d4kfracdb.lge[1].bcd[0].kfbtyp: 15 ; 0x064: KFBTYP_COD_RBOkfracdb.lge[1].bcd[0].redund: 17 ; 0x065: SCHE=0x1 NUMB=0x1kfracdb.lge[1].bcd[0].pad: 63903 ; 0x066: 0xf99fkfracdb.lge[1].bcd[0].KFRCOD_CRASH: 0 ; 0x068: 0x00000000kfracdb.lge[1].bcd[0].au[0]: 24 ; 0x06c: 0x00000018kfracdb.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是其元数据,后面的block是data信息.4. ACDC data的数据,跟redo的结构有点类似,里面记录的也是thread,sequence,len,opcode等信息.
5. ACDC平时恢复最多的就是检查点信息,也就是最重要的结构blkn=0;
当磁盘检查点信息不对无法前滚时候,就需要修改这部分内容,将磁盘组mount起来。
文章转载自数据库技术加油站,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




