【作者简介】
本人医疗行业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 --非omfSQL> select name,group_number,file_number from v$asm_alias where file_number <>'4294967295';NAME GROUP_NUMBER FILE_NUMBER------------------------------ ------------ -----------pwdorcl.256.1136540433 1 256SYSTEM.257.1136540449 1 257SYSAUX.258.1136540485 1 258UNDOTBS1.259.1136540499 1 259USERS.260.1136540501 1 260UNDOTBS2.265.1136541035 1 265WX.269.1142521345 1 269wx.dbf 1 269Current.261.1136540541 1 261group_2.262.1136540543 1 262group_1.263.1136540543 1 263
2、定位asm file 6
1)通过视图查询set line 200col diskgroup_name for a15col disk_name for a10col path for a40select 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_gbfrom 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.08984382 NDATA NORMAL 4 N NDATA_0001 dev/oracleasm/disks/ASMDATA2 9.76464844 9.76171875 8.71093752 NDATA NORMAL 4 N NDATA_0000 dev/oracleasm/disks/ASMDATA1 9.76464844 9.76171875 8.714843753 OCR NORMAL 4 Y OCR_0002 dev/oracleasm/disks/ASMOCR3 1.95214844 1.94921875 1.61718753 OCR NORMAL 4 Y OCR_0001 dev/oracleasm/disks/ASMOCR2 1.95214844 1.94921875 1.61718753 OCR NORMAL 4 Y OCR_0000 dev/oracleasm/disks/ASMOCR1 1.95214844 1.94921875 1.6015625select 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 12 0 23 0 224 0 25 0 16 0 1 --6就是alias别名8 0 1set line 200 pages 1000col "disk name" for a20col path for a30col 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=6ORDER 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 02)kfed 定位au分配信息--先读取文件目录,是在10号au上[grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3 aun=0 blkn=0|egrep -i "aus|f1b1locn"kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000kfdhdb.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=4kfbh.block.obj: 1 ; 0x008: file=1kfbh.block.blk: 6 ; 0x004: blk=6kfbh.block.obj: 1 ; 0x008: file=1kfffde[0].xptr.au: 19 ; 0x4a0: 0x00000013kfffde[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|morekfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 1 ; 0x004: blk=1kfbh.block.obj: 6 ; 0x008: file=6kfbh.check: 1670080257 ; 0x00c: 0x638b6701kfbh.fcn.base: 5031 ; 0x010: 0x000013a7kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffffkffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffffkffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0kffdnd.parent.number: 0 ; 0x014: 0x00000000kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0kffdnd.fstblk.number: 1 ; 0x01c: 0x00000001kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0kfade[0].entry.hash: 722014700 ; 0x028: 0x2b0911eckfade[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 snapshotS - File is stripedS - Strict allocation policyD - File is damagedC - File creation is committedI - File has empty indirect blockR - File has known at-risk valueA - The at-risk value itseflkfade[0].ub1spare: 0 ; 0x06d: 0x00 --无实际意义kfade[0].freeblock: 0 ; 0x06e: 0x0000 --无实际意义kfade[1].entry.incarn: 1 ; 0x070: A=1 NUMM=0x0kfade[1].entry.hash: 710518681 ; 0x074: 0x2a59a799kfade[1].entry.refer.number: 3 ; 0x078: 0x00000003kfade[1].entry.refer.incarn: 1 ; 0x07c: A=1 NUMM=0x0kfade[1].name: DATAFILE ; 0x080: length=8kfade[1].fnum: 4294967295 ; 0x0b0: 0xffffffffkfade[1].finc: 4294967295 ; 0x0b4: 0xffffffffkfade[1].flags: 4 ; 0x0b8: U=0 S=0 S=1 U=0 F=0kfade[1].ub1spare: 0 ; 0x0b9: 0x00kfade[1].freeblock: 0 ; 0x0ba: 0x0000kfade[2].entry.incarn: 3 ; 0x0bc: A=1 NUMM=0x1kfade[2].entry.hash: 4053320104 ; 0x0c0: 0xf198c1a8kfade[2].entry.refer.number: 4 ; 0x0c4: 0x00000004kfade[2].entry.refer.incarn: 3 ; 0x0c8: A=1 NUMM=0x1kfade[2].name: CONTROLFILE ; 0x0cc: length=11kfade[2].fnum: 4294967295 ; 0x0fc: 0xffffffffkfade[2].finc: 4294967295 ; 0x100: 0xffffffffkfade[2].flags: 4 ; 0x104: U=0 S=0 S=1 U=0 F=0kfade[2].ub1spare: 0 ; 0x105: 0x00kfade[2].freeblock: 0 ; 0x106: 0x0000kfade[3].entry.incarn: 1 ; 0x108: A=1 NUMM=0x0kfade[3].entry.hash: 2803485489 ; 0x10c: 0xa719cb31kfade[3].entry.refer.number: 5 ; 0x110: 0x00000005kfade[3].entry.refer.incarn: 1 ; 0x114: A=1 NUMM=0x0kfade[3].name: ONLINELOG ; 0x118: length=9kfade[3].fnum: 4294967295 ; 0x148: 0xffffffffkfade[3].finc: 4294967295 ; 0x14c: 0xffffffffkfade[3].flags: 4 ; 0x150: U=0 S=0 S=1 U=0 F=0kfade[3].ub1spare: 0 ; 0x151: 0x00kfade[3].freeblock: 0 ; 0x152: 0x0000kfade[4].entry.incarn: 1 ; 0x154: A=1 NUMM=0x0kfade[4].entry.hash: 2905271101 ; 0x158: 0xad2aeb3dkfade[4].entry.refer.number: 6 ; 0x15c: 0x00000006kfade[4].entry.refer.incarn: 1 ; 0x160: A=1 NUMM=0x0kfade[4].name: TEMPFILE ; 0x164: length=8kfade[4].fnum: 4294967295 ; 0x194: 0xffffffffkfade[4].finc: 4294967295 ; 0x198: 0xffffffffkfade[4].flags: 4 ; 0x19c: U=0 S=0 S=1 U=0 F=0kfade[4].ub1spare: 0 ; 0x19d: 0x00kfade[4].freeblock: 0 ; 0x19e: 0x0000kfade[5].entry.incarn: 1 ; 0x1a0: A=1 NUMM=0x0kfade[5].entry.hash: 3261836913 ; 0x1a4: 0xc26bae71kfade[5].entry.refer.number: 7 ; 0x1a8: 0x00000007kfade[5].entry.refer.incarn: 3 ; 0x1ac: A=1 NUMM=0x1kfade[5].name: PARAMETERFILE ; 0x1b0: length=13kfade[5].fnum: 4294967295 ; 0x1e0: 0xffffffffkfade[5].finc: 4294967295 ; 0x1e4: 0xffffffffkfade[5].flags: 4 ; 0x1e8: U=0 S=0 S=1 U=0 F=0kfade[5].ub1spare: 0 ; 0x1e9: 0x00kfade[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|morekfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 11 ; 0x002: KFBTYP_ALIASDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 3 ; 0x004: blk=3kfbh.block.obj: 6 ; 0x008: file=6kfbh.check: 1726335270 ; 0x00c: 0x66e5c926kfbh.fcn.base: 5721 ; 0x010: 0x00001659kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffffkffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffffkffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0 --overf1,表示指向同层级的下一个blockkffdnd.parent.number: 1 ; 0x014: 0x00000001 --表示指向上一层的blockkffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0kffdnd.fstblk.number: 3 ; 0x01c: 0x00000003 --代表当前块kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0kfade[0].entry.incarn: 1 ; 0x024: A=1 NUMM=0x0kfade[0].entry.hash: 4293500617 ; 0x028: 0xffe99ec9kfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffffkfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0kfade[0].name: SYSTEM ; 0x034: length=6kfade[0].fnum: 257 ; 0x064: 0x00000101kfade[0].finc: 1136540449 ; 0x068: 0x43be3b21kfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1kfade[0].ub1spare: 0 ; 0x06d: 0x00kfade[0].freeblock: 0 ; 0x06e: 0x0000kfade[1].entry.incarn: 1 ; 0x070: A=1 NUMM=0x0kfade[1].entry.hash: 922506839 ; 0x074: 0x36fc5657kfade[1].entry.refer.number: 4294967295 ; 0x078: 0xffffffffkfade[1].entry.refer.incarn: 0 ; 0x07c: A=0 NUMM=0x0kfade[1].name: SYSAUX ; 0x080: length=6kfade[1].fnum: 258 ; 0x0b0: 0x00000102kfade[1].finc: 1136540485 ; 0x0b4: 0x43be3b45kfade[1].flags: 18 ; 0x0b8: U=0 S=1 S=0 U=0 F=1kfade[1].ub1spare: 0 ; 0x0b9: 0x00kfade[1].freeblock: 0 ; 0x0ba: 0x0000kfade[2].entry.incarn: 1 ; 0x0bc: A=1 NUMM=0x0kfade[2].entry.hash: 104433507 ; 0x0c0: 0x06398763kfade[2].entry.refer.number: 4294967295 ; 0x0c4: 0xffffffffkfade[2].entry.refer.incarn: 0 ; 0x0c8: A=0 NUMM=0x0kfade[2].name: UNDOTBS1 ; 0x0cc: length=8kfade[2].fnum: 259 ; 0x0fc: 0x00000103kfade[2].finc: 1136540499 ; 0x100: 0x43be3b53kfade[2].flags: 18 ; 0x104: U=0 S=1 S=0 U=0 F=1kfade[2].ub1spare: 0 ; 0x105: 0x00kfade[2].freeblock: 0 ; 0x106: 0x0000kfade[3].entry.incarn: 1 ; 0x108: A=1 NUMM=0x0kfade[3].entry.hash: 1290613691 ; 0x10c: 0x4ced33bbkfade[3].entry.refer.number: 4294967295 ; 0x110: 0xffffffffkfade[3].entry.refer.incarn: 0 ; 0x114: A=0 NUMM=0x0kfade[3].name: USERS ; 0x118: length=5kfade[3].fnum: 260 ; 0x148: 0x00000104kfade[3].finc: 1136540501 ; 0x14c: 0x43be3b55kfade[3].flags: 18 ; 0x150: U=0 S=1 S=0 U=0 F=1kfade[3].ub1spare: 0 ; 0x151: 0x00kfade[3].freeblock: 0 ; 0x152: 0x0000kfade[4].entry.incarn: 1 ; 0x154: A=1 NUMM=0x0kfade[4].entry.hash: 4181100904 ; 0x158: 0xf9368968kfade[4].entry.refer.number: 4294967295 ; 0x15c: 0xffffffffkfade[4].entry.refer.incarn: 0 ; 0x160: A=0 NUMM=0x0kfade[4].name: UNDOTBS2 ; 0x164: length=8kfade[4].fnum: 265 ; 0x194: 0x00000109kfade[4].finc: 1136541035 ; 0x198: 0x43be3d6bkfade[4].flags: 18 ; 0x19c: U=0 S=1 S=0 U=0 F=1kfade[4].ub1spare: 0 ; 0x19d: 0x00kfade[4].freeblock: 0 ; 0x19e: 0x0000kfade[5].entry.incarn: 1 ; 0x1a0: A=1 NUMM=0x0kfade[5].entry.hash: 1321293848 ; 0x1a4: 0x4ec15818kfade[5].entry.refer.number: 4294967295 ; 0x1a8: 0xffffffffkfade[5].entry.refer.incarn: 0 ; 0x1ac: A=0 NUMM=0x0kfade[5].name: WX ; 0x1b0: length=2kfade[5].fnum: 269 ; 0x1e0: 0x0000010dkfade[5].finc: 1142521345 ; 0x1e4: 0x44197e01kfade[5].flags: 18 ; 0x1e8: U=0 S=1 S=0 U=0 F=1kfade[5].ub1spare: 0 ; 0x1e9: 0x00kfade[5].freeblock: 0 ; 0x1ea: 0x0000kfade[6].entry.incarn: 1 ; 0x1ec: A=1 NUMM=0x0kfade[6].entry.hash: 3488756721 ; 0x1f0: 0xcff233f1kfade[6].entry.refer.number: 4294967295 ; 0x1f4: 0xffffffffkfade[6].entry.refer.incarn: 0 ; 0x1f8: A=0 NUMM=0x0kfade[6].name: wx.dbf ; 0x1fc: length=6kfade[6].fnum: 269 ; 0x22c: 0x0000010dkfade[6].finc: 1142521345 ; 0x230: 0x44197e01kfade[6].flags: 17 ; 0x234: U=1 S=0 S=0 U=0 F=1kfade[6].ub1spare: 0 ; 0x235: 0x00kfade[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=0x1kfade[0].entry.hash: 3530000122 ; 0x028: 0xd26786fakfade[0].entry.refer.number: 4294967295 ; 0x02c: 0xffffffffkfade[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0kfade[0].name: Current ; 0x034: length=7kfade[0].fnum: 261 ; 0x064: 0x00000105kfade[0].finc: 1136540541 ; 0x068: 0x43be3b7dkfade[0].flags: 18 ; 0x06c: U=0 S=1 S=0 U=0 F=1kfade[0].ub1spare: 0 ; 0x06d: 0x00kfade[0].freeblock: 0 ; 0x06e: 0x0000...--通过这部分信息可以知道controlfile的全名是:Current.261.1136540541我们解析这些目的就是为了磁盘组不能够mount的情况下,通过amdu来进行提取的,当清楚别名信息后,提取想要的文件就变得非常容易,如下,比如我要提取wx.dbf这个文件;[grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA3|grep -i grpnamekfdhdb.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: 0x0000kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000kfdhdb.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=4kfbh.block.obj: 1 ; 0x008: file=1kfbh.block.blk: 6 ; 0x004: blk=6kfbh.block.obj: 1 ; 0x008: file=1kfffde[0].xptr.au: 19 ; 0x4a0: 0x00000013kfffde[0].xptr.disk: 0 ; 0x4a4: 0x0000for (( num=0; num<1024; num++ ))dokfed 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 ";" - - -donename:ORCL;fnum:4294967295;finc:4294967295name:ASM;fnum:4294967295;finc:4294967295name:PASSWORD;fnum:4294967295;finc:4294967295name:DATAFILE;fnum:4294967295;finc:4294967295name:CONTROLFILE;fnum:4294967295;finc:4294967295name:ONLINELOG;fnum:4294967295;finc:4294967295name:TEMPFILE;fnum:4294967295;finc:4294967295name:PARAMETERFILE;fnum:4294967295;finc:4294967295name:pwdorcl;fnum:256;finc:1136540433name:pwdorcl_bak46263;fnum:265;finc:1136540547name:SYSTEM;fnum:257;finc:1136540449name:SYSAUX;fnum:258;finc:1136540485name:UNDOTBS1;fnum:259;finc:1136540499name:USERS;fnum:260;finc:1136540501name:UNDOTBS2;fnum:265;finc:1136541035name:WX;fnum:269;finc:1142521345name:wx.dbf;fnum:269;finc:1142521345name:Current;fnum:261;finc:1136540541name:group_2;fnum:262;finc:1136540543name:group_1;fnum:263;finc:1136540543name:group_3;fnum:266;finc:1136541077name:group_4;fnum:267;finc:1136541077name:TEMP;fnum:264;finc:1136540547name:spfile;fnum:268;finc:1136541079name:pwdasm;fnum:265;finc:1136540547--写shell获取1)输入要读取的磁盘2)获取磁盘的au大小和块号3)获取别名4)amdu抽取for i in ` ls /dev/oracleasm/disks/ASMDATA3`doausize=`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 ] ;thenlet n=$ausize/$blksizeecho $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;0fidone4.2)直接扫,不找文件目录方式--第一个for循环au,前20个--第二个for循环blkn,如果是1M的au,0-255,如果是4M的au,0-1023,根据实际情况调整for ((i=0;i<=20;i++));dofor ((j=0;j<1023;j++));doDIR=`kfed read /dev/oracleasm/disks/ASMDATA3 aunum=$i blknum=$j aus=4M|grep -i ALIAS`if [ "$DIR" != "" ];thenecho "aun="$i "blknum="$j "dir="$DIRfidone;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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




