asm metadata dump utility,即asm中繼資料導出工具,它的簡寫amdu更被人所熟知,常被oracle技術支援人員和oracle開發人員用來診斷和解決asm故障。它能輸出asm的中繼資料資訊并且從asm磁盤組中抽取中繼資料和資料檔案。 amdu工具不依賴于asm執行個體或者asm磁盤組的狀态,是以它能在asm執行個體關閉和磁盤組未挂載的情況下正常使用,它甚至能在asm磁盤出現故障或者不可見的場景下使用。
在接下來的第一個例子中,我們将以一個處于mount狀态的磁盤組為例,使用amdu提取資料庫br的一個控制檔案。
通過asmcmd的find指令結合--type參數,指定查找檔案類型為controlfile的檔案,以下輸出列出了所有找到的控制檔案的位置:
$ asmcmd find --type controlfile + "*"
+data/asm/controlfile/cfcopy.268.734178331
+data/br/controlfile/current.276.723906721
+data/br/controlfile/current.285.723908117
+data/br/controlfile/current.294.723912823
+data/orcl/controlfile/current.260.715782325
+data/cfcopy
+reco/br/controlfile/current.256.723906723
+reco/br/controlfile/current.260.723908117
+reco/br/controlfile/current.264.723912823
以上輸出我們可以知道,在data磁盤組和reco磁盤組分别存放了br資料庫控制檔案的三個副本。這裡以提取data磁盤組的current.276.723906721控制檔案為例。
首先我們看下data磁盤組有哪些磁盤
$ asmcmd lsdsk -g data
path
orcl:disk1
orcl:disk2
data磁盤組共有兩塊磁盤-disk1和disk2,名字都是以orcl為字首的asmlib磁盤。嚴格意義上,并不需要知道具體的磁盤名,隻需要查找asm_diskstring參數值所定義的目錄即可。
我們接着用amdu工具将控制檔案從data磁盤組提取到檔案系統上
$ cd /tmp
$ amdu -diskstring="orcl:*" -extract data.276 -output control.276 -noreport -nodir
amdu-00204: disk n0001 is in currently mounted diskgroup data
amdu-00201: disk n0001: 'orcl:disk1'
$ ls -l control.276
-rw-r--r-- 1 grid oinstall 9748480 sep 22 22:42 control.276
此指令相關參數的含義如下:
· diskstring: 使用磁盤的全路徑或者是asm_diskstring參數值
· extract: 磁盤組名.asm檔案序号
· output:提取的輸出檔案(目前目錄下)
· noreport:不輸出amdu的執行過程
· nodir:不建立dump目錄
上例中從一個已挂載的磁盤組上提取控制檔案的過程簡單明了。但在實際工作中,可能有客戶提出要求從一個未挂載的磁盤組中提取一個重要資料檔案,同時并不知道資料檔案名,也沒有備份。以下是一個具體的例子,示範了整個操作和分析過程。
本例的目标是使用amdu工具從一個不能被挂載的data磁盤組中提取一個資料檔案,檔案名字中包含nsa。這首先意味着在這裡sqlplus和asmcmd工具都不能使用。
首先使用amdu工具對data磁盤組做一份中繼資料的完整dump。
$ amdu -dump data -noimage
amdu_2011_09_22_22_57_05/
$ cd amdu_2011_09_22_22_57_05
$ ls -l
total 28
-rw-r--r-- 1 grid oinstall 5600 sep 22 22:57 data.map
-rw-r--r-- 1 grid oinstall 10462 sep 22 22:57 report.txt
在本例中amdu建立了dump目錄并産生了兩個檔案。report.txt檔案包含主機、amdu指令及使用的參數、data磁盤組可能的成員磁盤和這些磁盤上的au資訊。report.txt檔案内容如下
$ more report.txt
-*-amdu-*-
******************************* amdu settings ********************************
oracle_home = /u01/app/11.2.0/grid
system name: linux
node name:
release: 2.6.18-128.4.1.0.1.el5
version: #1 smp tue aug 4 15:10:25 edt 2009
machine: i686
amdu run:
endianess: 1
...
----------------------------- disk report n0001 ------------------------------
disk path: orcl:disk1
unique disk id:
disk label: disk1
physical sector size: 512 bytes
disk size: 4886 megabytes
group name: data
disk name: disk1
failure group name: disk1
disk number: 0
header status: 3
disk creation time: 2010/03/01 15:07:47.135000
last mount time: 2011/09/02 15:35:52.676000
compatibility version: 0x0b200000(11020000)
disk sector size: 512 bytes
disk size in aus: 4886 aus
group redundancy: 1
metadata block size: 4096 bytes
au size: 1048576 bytes
stride: 113792 aus
group creation time: 2010/03/01 15:07:46.819000
file 1 block 1 location: au 2
ocr present: no
************************** scanning diskgroup data ***************************
creation time: 2010/03/01 15:07:46.819000
disks discovered: 2
redundancy: 1
metadata stride: 113792 au
duplicate disk numbers: 0
---------------------------- scanning disk n0001 -----------------------------
disk n0001: 'orcl:disk1'
allocated au's: 2563
free au's: 2323
au's read for dump: 34
block images saved: 6661
map lines written: 34
heartbeats seen: 0
corrupt metadata blocks: 0
corrupt at blocks: 0
data.map檔案包含資料分布資訊。它的内容十分神秘,但對于我們本次的操作目标十分重要。
$ more data.map
n0001 d0000 r00 a00000000 f00000000 i0 e00000000 u00 c00256 s0000
b0000000000
n0001 d0000 r00 a00000001 f00000000 i0 e00000000 u00 c00256 s0000
n0001 d0000 r00 a00000002 f00000001 i0 e00000000 u00 c00256 s0000
n0001 d0000 r00 a00000003 f00000003 i0 e00000001 u00 c00256 s0000
n0001 d0000 r00 a00000004 f00000003 i0 e00000011 u00 c00256 s0000
n0001 d0000 r00 a00000234 f00000267 i1 e00000000 u00 c00001 s0000
n0004 d0001 r00 a00001512 f00000292 i1 e00000000 u00 c00001 s0000
n0004 d0001 r00 a00002304 f00000290 i1 e00000000 u00 c00003 s0000
n0004 d0001 r00 a00002643 f00000264 i1 e00000000 u00 c00001 s0000
一眼看到就感覺有價值的内容是a和f起始的兩列。比如,a00000234代表本行是關于au 234. f00000267代表本行與序号267的asm檔案相關。
重新回到查找nsa資料檔案的目标。asm序号6的中繼資料檔案是alias别名目錄,這是查找目标的起點。通過data.map檔案,能找到序号6的asm中繼資料檔案的所有au。
$ grep f00000006 data.map
n0004 d0001 r00 a00000008 f00000006 i0 e00000000 u00 c00256 s0000
通過查找定位到與該中繼資料檔案相關的au記錄隻有一行。這說明磁盤組内的檔案不多,它們所有的别名都隻存放在一個au内,同時别名目錄中繼資料檔案存放在磁盤1(d0001)的au 8(a00000008)。 從前面report.txt的記錄中知道,磁盤1指的是orcl:disk2并且它的au大小是1mb。通過kfed工具來檢視alias目錄檔案。
$ ls -l /dev/oracleasm/disks/disk2
brw-rw---- 1 grid asmadmin 8, 6 aug 24 14:38 /dev/oracleasm/disks/disk2
$ kfed read /dev/oracleasm/disks/disk2 aun=8 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 11 ; 0x002: kfbtyp_aliasdir
kfed的輸出資訊中kfbh.type驗證了這是一個alias目錄檔案。下一步查找名字包含nsa的資料檔案:
for (( i=0; i<256; i++ ))
do
kfed read /dev/oracleasm/disks/disk2 aun=8 blkn=$i | grep -1 nsa
done
指令的輸出内容如下:
kfade[15].entry.refer.incarn: 0 ; 0x4a4: a=0 numm=0x0
kfade[15].name: nsa_tn_data ; 0x4a8: length=11
kfade[15].fnum: 267 ; 0x4d8: 0x0000010b
名字包含nsa的資料檔案是nsatndata,它的asm檔案序号是267.接下來可以進一步提取資料檔案:
$ amdu -diskstring="orcl:*" -extract data.267 -output nsa_tn_data.267 -noreport -nodir
total 102544
-rw-r--r-- 1 grid oinstall 104865792 sep 22 23:42 nsa_tn_data.267
使用這個檔案我們能夠做些什麼呢?好吧,如果能提取到資料庫控制檔案,system和sysaux系統表空間資料檔案,就可以用這些檔案來打開資料庫。還可能把這個檔案“遷移”到别的資料庫,甚至可能用dul這樣的非正常工具來提取資料檔案内的資料。
需要注意是amdu提取的可能是有損壞或者是已破壞的檔案,這取決于檔案本身是否有損壞。對于那些由于元資訊損壞或者丢失兒導緻的不能呗mount的磁盤組,也有可能資料檔案是好的,這樣情況下同樣可以使用amdu來抽取到完好的資料檔案。
但是記住這個過程不能用來替代備份。
從asm的11.2.0.3版本開始,ora-600 [kfd...]類似的錯誤可能會觸發一次自動的amdu的dump操作。當這種類型的錯誤發生時,除了錯誤資訊會記錄到asm的alert日志外,還會有資訊提示做了一次amdu的dump操作。dump的檔案會放在相應的診斷目錄下。
amdu是一個非常稱手的工具,但它對使用者或者dba的意義相對有限。但是如果知道amdu的作用,在與oracle技術支援人員交流中還是非常有幫助的。
譯者注:除了從asm的alias檔案目錄中擷取資料檔案的名稱外,還可以從控制檔案中獲得,有了控制檔案就能夠将資料庫啟動到mount狀态檢視v$datafile視圖,進而擷取資料檔案名稱。但是控制檔案中記錄的資訊可能隻是個alias,如果是這種情況,那麼還是需要從alias目錄中定位到真正的資料檔案名稱。
<b>本文來自雲栖社群合作夥伴“dbgeek”</b>