【作者简介】
本人医疗行业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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
804次阅读
2025-03-17 11:33:53
替换OCR磁盘组导致集群无法启动
zwtian
242次阅读
2025-03-12 09:00:16
记一次oracle rac 一个节点load averge高导致的问题
Digital Observer
242次阅读
2025-03-13 10:13:43
ASM 内存不足引发核心数据库故障分析与解决方案
Digital Observer
42次阅读
2025-03-24 09:13:17
为什么元数据很重要?
刺史武都
40次阅读
2025-03-14 11:54:30
Apache Iceberg 解析,一文了解Iceberg定义、应用及未来发展
镜舟科技
39次阅读
2025-03-26 22:25:28
高途基于 Iceberg 和 Amoro 的湖仓一体架构实践
Amoro Community
38次阅读
2025-03-18 10:49:51
迈向云原生:理想汽车 OLAP 引擎变革之路
镜舟科技
36次阅读
2025-04-01 20:22:16
Hologres实时湖仓能力入门实践
阿里云大数据AI技术
29次阅读
2025-03-18 10:04:18
Oracle GoldenGate实现数据库同步
luyingjun
28次阅读
2025-03-30 23:25:52