ASM Metadata Dump Utility

shilei1發表於2018-05-13

原作者:Bane Radulovic

譯者:    莊培培

稽核:    魏興華  沃趣科技

DBGeeK社群聯合出品



amdu - ASM Metadata Dump Utility
ASM Metadata Dump Utility,即ASM後設資料匯出工具,它的簡寫amdu更被人所熟知,常被Oracle技術支援人員和Oracle開發人員用來診斷和解決ASM故障。它能輸出ASM的後設資料資訊並且從ASM磁碟組中抽取後設資料和資料檔案。 amdu工具不依賴於ASM例項或者ASM磁碟組的狀態,所以它能在ASM例項關閉和磁碟組未掛載的情況下正常使用,它甚至能在ASM磁碟出現故障或者不可見的場景下使用。

Use amdu to extract a controlfile from a mounted disk group
在接下來的第一個例子中,我們將以一個處於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目錄

Use amdu to extract a datafile from a dismounted disk group
上例中從一個已掛載的磁碟組上提取控制檔案的過程簡單明瞭。但在實際工作中,可能有客戶提出要求從一個未掛載的磁碟組中提取一個重要資料檔案,同時並不知道資料檔名,也沒有備份。以下是一個具體的例子,演示了整個操作和分析過程。本例的目標是使用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
...
一眼看到就感覺有價值的內容是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來抽取到完好的資料檔案。但是記住這個過程不能用來替代備份。

The amdu dump triggered on an error
從ASM的11.2.0.3版本開始,ORA-600 [kfd...]類似的錯誤可能會觸發一次自動的amdu的dump操作。當這種型別的錯誤發生時,除了錯誤資訊會記錄到ASM的Alert日誌外,還會有資訊提示做了一次amdu的dump操作。dump的檔案會放在相應的診斷目錄下。

Conclusion
amdu是一個非常稱手的工具,但它對使用者或者DBA的意義相對有限。但是如果知道amdu的作用,在與Oracle技術支援人員交流中還是非常有幫助的。譯者注:除了從ASM的alias檔案目錄中獲取資料檔案的名稱外,還可以從控制檔案中獲得,有了控制檔案就能夠將資料庫啟動到mount狀態檢視v$datafile檢視,進而獲取資料檔名稱。但是控制檔案中記錄的資訊可能只是個alias,如果是這種情況,那麼還是需要從alias目錄中定位到真正的資料檔名稱。

關於譯者:莊培培,沃趣科技資料庫售前工程師,主要負責資料庫平臺架構方案設計、產品驗證測試。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-2154406/,如需轉載,請註明出處,否則將追究法律責任。

相關文章