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
此命令相關參數的含義如下:
上例中從一個已掛載的磁盤組上提取控制文件的過程簡單明了。但在實際工作中,可能有客戶提出要求從一個未掛載的磁盤組中提取一個重要數據文件,同時并不知道數據文件名,也沒有備份。以下是一個具體的例子,演示了整個操作和分析過程。
本例的目標是使用amdu工具從一個不能被掛載的DATA磁盤組中提取一個數據文件,文件名字中包含NSA。這首先意味著在這里sqlplus和asmcmd工具都不能使用。
首先使用amdu工具對DATA磁盤組做一份元數據的完整dump。
$ cd /tmp
$ 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
AU Size: 1048576 bytes
Metadata Block Size: 4096 bytes
Physical Sector Size: 512 bytes
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
B0000000000
N0001 D0000 R00 A00000002 F00000001 I0 E00000000 U00 C00256 S0000
B0000000000
N0001 D0000 R00 A00000003 F00000003 I0 E00000001 U00 C00256 S0000
B0000000000
N0001 D0000 R00 A00000004 F00000003 I0 E00000011 U00 C00256 S0000
B0000000000 ... N0001 D0000 R00 A00000234 F00000267 I1 E00000000 U00 C00001 S0000
B0000000000 ... N0004 D0001 R00 A00001512 F00000292 I1 E00000000 U00 C00001 S0000
B0000000000
N0004 D0001 R00 A00002304 F00000290 I1 E00000000 U00 C00003 S0000
B0000000000
N0004 D0001 R00 A00002643 F00000264 I1 E00000000 U00 C00001 S0000
B0000000000
一眼看到就感覺有價值的內容是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 B0000000000
通過查找定位到與該元數據文件相關的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 $ ls -l total 102544 -rw-r--r-- 1 grid oinstall 5600 Sep 22 22:57 DATA.map -rw-r--r-- 1 grid oinstall 104865792 Sep 22 23:42 NSA_TN_DATA.267 -rw-r--r-- 1 grid oinstall 10462 Sep 22 22:57 report.txt
使用這個文件我們能夠做些什么呢?好吧,如果能提取到數據庫控制文件,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目錄中定位到真正的數據文件名稱。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。