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

ASM虚拟元数据-alias asm file 6

【作者简介

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

【正文

1、ASM 别名介绍


    6号文件是ASM的别名目录,包含了磁盘组中所有asm file 的alias信息。
    通过了解和学习别名目录,在asm磁盘组无法mount的时候,可以将数据从磁盘组中抽取到文件系统实现恢复。
    以下是实验的演示:
    复制


      //rdbms创建表空间文件
      SQL> create tablespace wx datafile '+edata/orcl/datafile/wx.dbf' size 100m autoextend on;


      Tablespace created.
      SQL> select name from v$datafile;


      NAME
      --------------------------------------------------------------------------------
      ...
      +NDATA/ORCL/DATAFILE/not_important.263.1141576263 --omf
      +EDATA/orcl/datafile/wx.dbf --非omf


      SQL> select name,group_number,file_number from v$asm_alias where file_number <>'4294967295';


      NAME GROUP_NUMBER FILE_NUMBER
      ------------------------------ ------------ -----------
      pwdorcl.256.1136540433 1 256
      SYSTEM.257.1136540449 1 257
      SYSAUX.258.1136540485 1 258
      UNDOTBS1.259.1136540499 1 259
      USERS.260.1136540501 1 260
      UNDOTBS2.265.1136541035 1 265
      WX.269.1142521345 1 269
      wx.dbf 1 269
      Current.261.1136540541 1 261
      group_2.262.1136540543 1 262
      group_1.263.1136540543 1 263
      复制


      2、定位asm file 6

        1)通过视图查询


        set line 200
        col diskgroup_name for a15
        col disk_name for a10
        col path for a40
        select a.GROUP_NUMBER,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
        from v$asm_diskgroup a,v$asm_disk b where a.group_number=b.group_number;


        GROUP_NUMBER DISKGROUP_NAME TYPE UNIT_MB VO DISK_NAME PATH OS_GB TOTAL_GB FREE_GB
        ------------ --------------- ------------ ---------- -- ---------- ---------------------------------------- ---------- ---------- ----------
        1 EDATA EXTERN 4 N EDATA_0000 dev/oracleasm/disks/ASMDATA3 29.2958984 29.2929688 25.0898438
        2 NDATA NORMAL 4 N NDATA_0001 dev/oracleasm/disks/ASMDATA2 9.76464844 9.76171875 8.7109375
        2 NDATA NORMAL 4 N NDATA_0000 dev/oracleasm/disks/ASMDATA1 9.76464844 9.76171875 8.71484375
        3 OCR NORMAL 4 Y OCR_0002 dev/oracleasm/disks/ASMOCR3 1.95214844 1.94921875 1.6171875
        3 OCR NORMAL 4 Y OCR_0001 dev/oracleasm/disks/ASMOCR2 1.95214844 1.94921875 1.6171875
        3 OCR NORMAL 4 Y OCR_0000 dev/oracleasm/disks/ASMOCR1 1.95214844 1.94921875 1.6015625




        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
        5 0 1
        6 0 1 --6就是alias别名
        8 0 1


        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=6
        ORDER BY 1, 2;
        FILE# Extent TYPE AU Disk # Disk name PATH GROUP_NUMBER DISK_NUMBER
        ---------- ---------- -------------------- ------ ---------- -------------------- ------------------------------ ------------ -----------
        6 0 Primary Copy 19 0 EDATA_0000 dev/oracleasm/disks/ASMDATA3 1 0


        2)kfed 定位au分配信息
        --先读取文件目录,是在10号au上
        [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=6 aus=4M|egrep "block|disk|au"|egrep -v "65535|4294967295"
        kfbh.block.blk: 4 ; 0x004: blk=4
        kfbh.block.obj: 1 ; 0x008: file=1
        kfbh.block.blk: 6 ; 0x004: blk=6
        kfbh.block.obj: 1 ; 0x008: file=1
        kfffde[0].xptr.au: 19 ; 0x4a0: 0x00000013
        kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000
        从上面信息可以看到Alias分配信息在disk 0的第19 au中,和x$kffxp查询的结果完全一致;
        复制

        3、kfed解析别名目录

          //总共三部分信息,1 kfbh,头部信息 2 kffdnd 这部分信息用来定位和描述block在目录树中的具体位置。和disk directory的kffdbd结构一样;
          [grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3 aun=19 blkn=1 aus=4M|more
          kfbh.endian: 1 ; 0x000: 0x01
          kfbh.hard: 130 ; 0x001: 0x82
          kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR
          kfbh.datfmt: 1 ; 0x003: 0x01
          kfbh.block.blk: 1 ; 0x004: blk=1
          kfbh.block.obj: 6 ; 0x008: file=6
          kfbh.check: 1670080257 ; 0x00c: 0x638b6701
          kfbh.fcn.base: 5031 ; 0x010: 0x000013a7
          kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
          kfbh.spare1: 0 ; 0x018: 0x00000000
          kfbh.spare2: 0 ; 0x01c: 0x00000000
          kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0
          kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff
          kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
          kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff
          kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0
          kffdnd.parent.number: 0 ; 0x014: 0x00000000
          kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0
          kffdnd.fstblk.number: 1 ; 0x01c: 0x00000001
          kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0
          kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0
          kfade[0].entry.hash: 722014700 ; 0x028: 0x2b0911ec
          kfade[0].entry.refer.number: 2 ; 0x02c: 0x00000002 --指向下一层的块号
          kfade[0].entry.refer.incarn: 1 ; 0x030: A=1 NUMM=0x0 --entry部分内容,表示分支号,hash值和指向下一层块的指针等信息;
          kfade[0].name: PASSWORD ; 0x034: length=8 --表示对应的alias元数据名称
          kfade[0].fnum: 4294967295 ; 0x064: 0xffffffff --对应文件号,这里为最大值
          kfade[0].finc: 4294967295 ; 0x068: 0xffffffff --表示分支号
          kfade[0].flags: 4 ; 0x06c: U=0 S=0 S=1 U=0 F=0 --标志信息
          该属性有如下的值:
          O - File is original, not snapshot
          S - File is striped
          S - Strict allocation policy
          D - File is damaged
          C - File creation is committed
          I - File has empty indirect block
          R - File has known at-risk value
          A - The at-risk value itsefl


          kfade[0].ub1spare: 0 ; 0x06d: 0x00 --无实际意义
          kfade[0].freeblock: 0 ; 0x06e: 0x0000 --无实际意义
          kfade[1].entry.incarn: 1 ; 0x070: A=1 NUMM=0x0
          kfade[1].entry.hash: 710518681 ; 0x074: 0x2a59a799
          kfade[1].entry.refer.number: 3 ; 0x078: 0x00000003
          kfade[1].entry.refer.incarn: 1 ; 0x07c: A=1 NUMM=0x0
          kfade[1].name: DATAFILE ; 0x080: length=8
          kfade[1].fnum: 4294967295 ; 0x0b0: 0xffffffff
          kfade[1].finc: 4294967295 ; 0x0b4: 0xffffffff
          kfade[1].flags: 4 ; 0x0b8: U=0 S=0 S=1 U=0 F=0
          kfade[1].ub1spare: 0 ; 0x0b9: 0x00
          kfade[1].freeblock: 0 ; 0x0ba: 0x0000
          kfade[2].entry.incarn: 3 ; 0x0bc: A=1 NUMM=0x1
          kfade[2].entry.hash: 4053320104 ; 0x0c0: 0xf198c1a8
          kfade[2].entry.refer.number: 4 ; 0x0c4: 0x00000004
          kfade[2].entry.refer.incarn: 3 ; 0x0c8: A=1 NUMM=0x1
          kfade[2].name: CONTROLFILE ; 0x0cc: length=11
          kfade[2].fnum: 4294967295 ; 0x0fc: 0xffffffff
          kfade[2].finc: 4294967295 ; 0x100: 0xffffffff
          kfade[2].flags: 4 ; 0x104: U=0 S=0 S=1 U=0 F=0
          kfade[2].ub1spare: 0 ; 0x105: 0x00
          kfade[2].freeblock: 0 ; 0x106: 0x0000
          kfade[3].entry.incarn: 1 ; 0x108: A=1 NUMM=0x0
          kfade[3].entry.hash: 2803485489 ; 0x10c: 0xa719cb31
          kfade[3].entry.refer.number: 5 ; 0x110: 0x00000005
          kfade[3].entry.refer.incarn: 1 ; 0x114: A=1 NUMM=0x0
          kfade[3].name: ONLINELOG ; 0x118: length=9
          kfade[3].fnum: 4294967295 ; 0x148: 0xffffffff
          kfade[3].finc: 4294967295 ; 0x14c: 0xffffffff
          kfade[3].flags: 4 ; 0x150: U=0 S=0 S=1 U=0 F=0
          kfade[3].ub1spare: 0 ; 0x151: 0x00
          kfade[3].freeblock: 0 ; 0x152: 0x0000
          kfade[4].entry.incarn: 1 ; 0x154: A=1 NUMM=0x0
          kfade[4].entry.hash: 2905271101 ; 0x158: 0xad2aeb3d
          kfade[4].entry.refer.number: 6 ; 0x15c: 0x00000006
          kfade[4].entry.refer.incarn: 1 ; 0x160: A=1 NUMM=0x0
          kfade[4].name: TEMPFILE ; 0x164: length=8
          kfade[4].fnum: 4294967295 ; 0x194: 0xffffffff
          kfade[4].finc: 4294967295 ; 0x198: 0xffffffff
          kfade[4].flags: 4 ; 0x19c: U=0 S=0 S=1 U=0 F=0
          kfade[4].ub1spare: 0 ; 0x19d: 0x00
          kfade[4].freeblock: 0 ; 0x19e: 0x0000
          kfade[5].entry.incarn: 1 ; 0x1a0: A=1 NUMM=0x0
          kfade[5].entry.hash: 3261836913 ; 0x1a4: 0xc26bae71
          kfade[5].entry.refer.number: 7 ; 0x1a8: 0x00000007
          kfade[5].entry.refer.incarn: 3 ; 0x1ac: A=1 NUMM=0x1
          kfade[5].name: PARAMETERFILE ; 0x1b0: length=13
          kfade[5].fnum: 4294967295 ; 0x1e0: 0xffffffff
          kfade[5].finc: 4294967295 ; 0x1e4: 0xffffffff
          kfade[5].flags: 4 ; 0x1e8: U=0 S=0 S=1 U=0 F=0
          kfade[5].ub1spare: 0 ; 0x1e9: 0x00
          kfade[5].freeblock: 0 ; 0x1ea: 0x0000


          通过解析这部分信息,我们可以得知重点地方,AU 的block=0为NULL,block=1存放的是目录数和对应下一层entry.refer.numbe指向的块的位置,我们想去找对应这种文件类型的别名,就需要在本AU中进入到指定块:


          比如,我想找datafile目录下所有的文件别名信息,我就要进入本AU的块3:
          [grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3 aun=19 blkn=3 aus=4M|more
          kfbh.endian: 1 ; 0x000: 0x01
          kfbh.hard: 130 ; 0x001: 0x82
          kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIR
          kfbh.datfmt: 1 ; 0x003: 0x01
          kfbh.block.blk: 3 ; 0x004: blk=3
          kfbh.block.obj: 6 ; 0x008: file=6
          kfbh.check: 1726335270 ; 0x00c: 0x66e5c926
          kfbh.fcn.base: 5721 ; 0x010: 0x00001659
          kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
          kfbh.spare1: 0 ; 0x018: 0x00000000
          kfbh.spare2: 0 ; 0x01c: 0x00000000
          kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0
          kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffff
          kffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
          kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffff
          kffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 --overf1,表示指向同层级的下一个block
          kffdnd.parent.number: 1 ; 0x014: 0x00000001 --表示指向上一层的block
          kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0
          kffdnd.fstblk.number: 3 ; 0x01c: 0x00000003 --代表当前块
          kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0
          kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0
          kfade[0].entry.hash: 4293500617 ; 0x028: 0xffe99ec9
          kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
          kfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0
          kfade[0].name: SYSTEM ; 0x034: length=6
          kfade[0].fnum: 257 ; 0x064: 0x00000101
          kfade[0].finc: 1136540449 ; 0x068: 0x43be3b21
          kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1
          kfade[0].ub1spare: 0 ; 0x06d: 0x00
          kfade[0].freeblock: 0 ; 0x06e: 0x0000
          kfade[1].entry.incarn: 1 ; 0x070: A=1 NUMM=0x0
          kfade[1].entry.hash: 922506839 ; 0x074: 0x36fc5657
          kfade[1].entry.refer.number: 4294967295 ; 0x078: 0xffffffff
          kfade[1].entry.refer.incarn: 0 ; 0x07c: A=0 NUMM=0x0
          kfade[1].name: SYSAUX ; 0x080: length=6
          kfade[1].fnum: 258 ; 0x0b0: 0x00000102
          kfade[1].finc: 1136540485 ; 0x0b4: 0x43be3b45
          kfade[1].flags: 18 ; 0x0b8: U=0 S=1 S=0 U=0 F=1
          kfade[1].ub1spare: 0 ; 0x0b9: 0x00
          kfade[1].freeblock: 0 ; 0x0ba: 0x0000
          kfade[2].entry.incarn: 1 ; 0x0bc: A=1 NUMM=0x0
          kfade[2].entry.hash: 104433507 ; 0x0c0: 0x06398763
          kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffff
          kfade[2].entry.refer.incarn: 0 ; 0x0c8: A=0 NUMM=0x0
          kfade[2].name: UNDOTBS1 ; 0x0cc: length=8
          kfade[2].fnum: 259 ; 0x0fc: 0x00000103
          kfade[2].finc: 1136540499 ; 0x100: 0x43be3b53
          kfade[2].flags: 18 ; 0x104: U=0 S=1 S=0 U=0 F=1
          kfade[2].ub1spare: 0 ; 0x105: 0x00
          kfade[2].freeblock: 0 ; 0x106: 0x0000
          kfade[3].entry.incarn: 1 ; 0x108: A=1 NUMM=0x0
          kfade[3].entry.hash: 1290613691 ; 0x10c: 0x4ced33bb
          kfade[3].entry.refer.number: 4294967295 ; 0x110: 0xffffffff
          kfade[3].entry.refer.incarn: 0 ; 0x114: A=0 NUMM=0x0
          kfade[3].name: USERS ; 0x118: length=5
          kfade[3].fnum: 260 ; 0x148: 0x00000104
          kfade[3].finc: 1136540501 ; 0x14c: 0x43be3b55
          kfade[3].flags: 18 ; 0x150: U=0 S=1 S=0 U=0 F=1
          kfade[3].ub1spare: 0 ; 0x151: 0x00
          kfade[3].freeblock: 0 ; 0x152: 0x0000
          kfade[4].entry.incarn: 1 ; 0x154: A=1 NUMM=0x0
          kfade[4].entry.hash: 4181100904 ; 0x158: 0xf9368968
          kfade[4].entry.refer.number: 4294967295 ; 0x15c: 0xffffffff
          kfade[4].entry.refer.incarn: 0 ; 0x160: A=0 NUMM=0x0
          kfade[4].name: UNDOTBS2 ; 0x164: length=8
          kfade[4].fnum: 265 ; 0x194: 0x00000109
          kfade[4].finc: 1136541035 ; 0x198: 0x43be3d6b
          kfade[4].flags: 18 ; 0x19c: U=0 S=1 S=0 U=0 F=1
          kfade[4].ub1spare: 0 ; 0x19d: 0x00
          kfade[4].freeblock: 0 ; 0x19e: 0x0000
          kfade[5].entry.incarn: 1 ; 0x1a0: A=1 NUMM=0x0
          kfade[5].entry.hash: 1321293848 ; 0x1a4: 0x4ec15818
          kfade[5].entry.refer.number: 4294967295 ; 0x1a8: 0xffffffff
          kfade[5].entry.refer.incarn: 0 ; 0x1ac: A=0 NUMM=0x0
          kfade[5].name: WX ; 0x1b0: length=2
          kfade[5].fnum: 269 ; 0x1e0: 0x0000010d
          kfade[5].finc: 1142521345 ; 0x1e4: 0x44197e01
          kfade[5].flags: 18 ; 0x1e8: U=0 S=1 S=0 U=0 F=1
          kfade[5].ub1spare: 0 ; 0x1e9: 0x00
          kfade[5].freeblock: 0 ; 0x1ea: 0x0000
          kfade[6].entry.incarn: 1 ; 0x1ec: A=1 NUMM=0x0
          kfade[6].entry.hash: 3488756721 ; 0x1f0: 0xcff233f1
          kfade[6].entry.refer.number: 4294967295 ; 0x1f4: 0xffffffff
          kfade[6].entry.refer.incarn: 0 ; 0x1f8: A=0 NUMM=0x0
          kfade[6].name: wx.dbf ; 0x1fc: length=6
          kfade[6].fnum: 269 ; 0x22c: 0x0000010d
          kfade[6].finc: 1142521345 ; 0x230: 0x44197e01
          kfade[6].flags: 17 ; 0x234: U=1 S=0 S=0 U=0 F=1
          kfade[6].ub1spare: 0 ; 0x235: 0x00
          kfade[6].freeblock: 0 ; 0x236: 0x0000


          --通过上面可以看到我们重点就关注两个内容:fnum和name,就是文件号和别名信息,回过头来看通过select name from v$datafile是不是看到三部分信息ts_name.asm_filenumber.incarnation_number; 就是和这里的三部分信息对应;




          同理,我要看controlfile目录下的文件别名信息,我就要进入本AU的块4:
          [grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3 aun=19 blkn=4 aus=4M|more
          ...
          kfade[0].entry.incarn: 3 ; 0x024: A=1 NUMM=0x1
          kfade[0].entry.hash: 3530000122 ; 0x028: 0xd26786fa
          kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
          kfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0
          kfade[0].name: Current ; 0x034: length=7
          kfade[0].fnum: 261 ; 0x064: 0x00000105
          kfade[0].finc: 1136540541 ; 0x068: 0x43be3b7d
          kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1
          kfade[0].ub1spare: 0 ; 0x06d: 0x00
          kfade[0].freeblock: 0 ; 0x06e: 0x0000
          ...
          --通过这部分信息可以知道controlfile的全名是:Current.261.1136540541


          我们解析这些目的就是为了磁盘组不能够mount的情况下,通过amdu来进行提取的,当清楚别名信息后,提取想要的文件就变得非常容易,如下,比如我要提取wx.dbf这个文件;
          [grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3|grep -i grpname
          kfdhdb.grpname: EDATA ; 0x048: length=5


          [grid@his1 ~]$ amdu -diskstring='/dev/oracleasm/disks/*' -extract EDATA.269 -output wx.dbf -noreport -nodir
          [grid@his1 ~]$ ll
          -rw-r--r-- 1 grid oinstall 104865792 7月 18 16:21 wx.dbf


          ● diskstring: 使用磁盘的全路径或者是ASM_DISKSTRING参数值
          ● extract: 磁盘组名.ASM文件序号
          ● output:提取的输出文件(当前目录下)
          ● noreport:不输出amdu的执行过程
          ● nodir:不创建dump目录
          复制

          4、kfed 批量拿到别名目录

          --如果大面积的需要手工来找别名的情况,我们一个一个是不是显得无能为力:

            4.1) 从文件目录中定位到AU
            --先读取文件目录,是在10号au上
            [grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3 aun=0 blkn=0|egrep -i "dsknum|aus|f1b1locn"
            kfdhdb.dsknum: 0 ; 0x024: 0x0000
            kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000
            kfdhdb.f1b1locn: 10 ; 0x0d4: 0x0000000a


            [grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3 aun=10 blkn=6 aus=4M|egrep "block|disk|au"|egrep -v "65535|4294967295"
            kfbh.block.blk: 4 ; 0x004: blk=4
            kfbh.block.obj: 1 ; 0x008: file=1
            kfbh.block.blk: 6 ; 0x004: blk=6
            kfbh.block.obj: 1 ; 0x008: file=1
            kfffde[0].xptr.au: 19 ; 0x4a0: 0x00000013
            kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000


            for (( num=0; num<1024; num++ ))
            do
            kfed read /dev/oracleasm/disks/ASMDATA3 aun=19 blknum=$num aus=4M |egrep 'name|fnum|finc'|grep -v length=0 |grep -v 0x00000000|tr -d " "|sed "s/kfade\[.*\].//"|awk -F ";" '{print $(NF-1)}'|paste -d ";" - - -
            done
            name:ORCL;fnum:4294967295;finc:4294967295
            name:ASM;fnum:4294967295;finc:4294967295
            name:PASSWORD;fnum:4294967295;finc:4294967295
            name:DATAFILE;fnum:4294967295;finc:4294967295
            name:CONTROLFILE;fnum:4294967295;finc:4294967295
            name:ONLINELOG;fnum:4294967295;finc:4294967295
            name:TEMPFILE;fnum:4294967295;finc:4294967295
            name:PARAMETERFILE;fnum:4294967295;finc:4294967295
            name:pwdorcl;fnum:256;finc:1136540433
            name:pwdorcl_bak46263;fnum:265;finc:1136540547
            name:SYSTEM;fnum:257;finc:1136540449
            name:SYSAUX;fnum:258;finc:1136540485
            name:UNDOTBS1;fnum:259;finc:1136540499
            name:USERS;fnum:260;finc:1136540501
            name:UNDOTBS2;fnum:265;finc:1136541035
            name:WX;fnum:269;finc:1142521345
            name:wx.dbf;fnum:269;finc:1142521345
            name:Current;fnum:261;finc:1136540541
            name:group_2;fnum:262;finc:1136540543
            name:group_1;fnum:263;finc:1136540543
            name:group_3;fnum:266;finc:1136541077
            name:group_4;fnum:267;finc:1136541077
            name:TEMP;fnum:264;finc:1136540547
            name:spfile;fnum:268;finc:1136541079
            name:pwdasm;fnum:265;finc:1136540547


            --写shell获取
            1)输入要读取的磁盘
            2)获取磁盘的au大小和块号
            3)获取别名
            4)amdu抽取


            for i in ` ls /dev/oracleasm/disks/ASMDATA3`
            do
            ausize=`kfed read $i|grep ausize|tr -s ' '|cut -d ' ' -f2`
            blksize=`kfed read $i|grep blksize|tr -s ' '|cut -d ' ' -f2`
            grpname=`kfed read $i|grep grpname|tr -s ' '|cut -d ' ' -f2`
            dsknum=`kfed read $i|grep dsknum|tr -s ' '|cut -d ' ' -f2`


            f1b1=`kfed read $i|grep f1b1lo|tr -s ' '|cut -d ' ' -f2`


            if [ ! -z $ausize ] || [ ! -z $blksize ] ;then
            let n=$ausize/$blksize
            echo $dsknum"号磁盘" $i "块数量为: " $n, "au大小为: " $ausize "磁盘组为: " $grpname "文件目录au起始为: " $f1b1


            ##先找到文件分布情况
            kfed read $i aun=$f1b1 blkn=6 aus=$ausize|egrep "disk|au"|egrep -v "65535|4294967295"


            #[grid@his1 ~]$ kfed read /dev/oracleasm/disks/ASMDATA3 aun=10 blkn=6 aus=4M|egrep "disk|au"|egrep -v "65535|4294967295"|tr -d " "|awk -F ":" '{print $(NF-1)}'|sed "s/;.*//"|paste -d ";" - -
            #19;0
            fi
            done






            4.2)直接扫,不找文件目录方式
            --第一个for循环au,前20个
            --第二个for循环blkn,如果是1M的au,0-255,如果是4M的au,0-1023,根据实际情况调整


            for ((i=0;i<=20;i++));do
            for ((j=0;j<1023;j++));do
            DIR=`kfed read /dev/oracleasm/disks/ASMDATA3 aunum=$i blknum=$j aus=4M|grep -i ALIAS`
            if [ "$DIR" != "" ];then
            echo "aun="$i "blknum="$j "dir="$DIR
            fi
            done;
            done;
            复制


            4、总结

            asm所有的文件都有一个内部的名称,我们称为别名;

            多个文件的别名或者名称需要有一个位置来存放,这个位置就是v$alias,也就是底层的asm file 6文件;

            当使用omf创建的数据文件时候我们能够轻易的获取到名称,在rac 磁盘组无法mount的时候我们可以通过amdu进行数据抽取,然后恢复数据,但是往往生产环境很多时候不是用的omf创建的文件,且文件较多,所以一个一个去恢复出来,再amdu确实也是一个问题;

            通过学习别名目录,在关键时候能够知道怎么去定位到别名目录,然后快速的把asm 里面的数据文件抽取到文件系统进行恢复;如果有一定shell能力的朋友,想自动处理,可以参考我前面写的文章,一键抽取asm里面的所有文件到文件系统;

            amdu一键抽取asm中所有数据

            王旭,公众号:oracle技术加油站amdu 一键抽出asm中所有数据!!!


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

            评论