天天看點

Oracle ASM 翻譯系列第十二彈:ASM Internal amdu - ASM Metadata Dump Utility

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>