AMDU資料抽取案例一則

YuhangExtra發表於2019-10-27

上半年遇到一起某客戶對ASM磁碟組擴容,由於擴容期間操作不當導致磁碟組被dismount,日誌如下:

通過日誌可以看到由於磁碟頭的後設資料被破壞,ASM檢測發現PST表不滿足冗餘要求後磁碟組被dismount。對於這種類似由於ASM磁碟後設資料被破壞導致磁碟組無法mount,且後設資料無法修復,需要找回ASM磁碟組中丟失的ASM檔案時可以使用Oracle提供的AMDU工具進行抽取。

AMDU 介紹

AMDU是ASM Metadata Dump Utility的縮寫,即asm後設資料匯出工具,它可以從asm磁碟中將後設資料資訊以及磁碟中的檔案直接抽取出來,並且該工具不依賴asm磁碟組的狀態,可以在asm例項關閉以及asm磁碟組dismount狀態下正常使用。當磁碟組因為某些故障無法mount後,需要恢復資料就可以使用amdu工具對asm磁碟組中的資料檔案進行搶修抽取,但需要注意的是,amdu只能將檔案從asm磁碟中抽取出來,如果檔案本身已經損壞,amdu是無法進行修復,抽取出來的檔案將依然是損壞的,像這種情況,如果需要將損壞的資料檔案中的資料找回,可以使用dul類工具直接讀取抽取出來的資料檔案找回資料。

迴歸主題

回到本次的故障處理,磁碟組已經無法mount,且難以修復,只能用AMDU將資料檔案從asm磁碟中直接抽取,因為控制檔案和引數檔案以及日誌檔案所在的磁碟組均正常,整個恢復相對比較簡單,如果控制檔案所在的磁碟組也無法mount,我們可以從資料庫alert檔案中找到資料庫控制檔案的位置,這通常是第一步:

控制檔案恢復:

control_files="+REDODG/xxxpd/controlfile/current.269.957297789"

然後通過amdu將控制檔案抽取出來:

amdu -diskstring '/dev/xxx/*' -extract REDODG.269 -noreport -nodir

上面命令相關引數的含義:

· diskstring: 使用磁碟的全路徑或者是ASM_DISKSTRING引數值

· extract: 磁碟組名.ASM檔案序號

· output:提取的輸出檔案(當前目錄下)

· noreport:不輸出amdu的執行過程

· nodir:不建立dump目錄

資料庫啟動到mount狀態:

因為alert日誌檔案中輸出的啟動資訊會包含例項引數資訊,通過對輸出的引數資訊重新編輯一個引數檔案,通過引數檔案以及控制檔案我們就可以將資料庫啟動到mount狀態。

SQL> startup nomount pfile='/orabackup/tmp/init.ora'

ORACLE instance started.

Total System Global Area 3.2068E+10 bytes

Fixed Size                  2269072 bytes

Variable Size            4362076272 bytes

Database Buffers         2.7649E+10 bytes

Redo Buffers               55242752 bytes

SQL> alter database mount;

Database altered.

SQL>

獲取資料檔名稱:

此時由於資料庫已啟動到mount狀態,通過v$datafile檢視既可獲取資料檔名稱。

select name from v$datafile;

+DATADG/xxx/datafile/system.347.957297809

+DATADG/xxx/datafile/sysaux.368.957297823

+DATADG/xxx/datafile/undotbs1.316.957297837

+DATADG/xxx/datafile/xxx_large.335.957297873

...

將ASM磁碟組中資料檔案抽取到本地檔案系統:

如果資料檔案採用OMF命名格式直接使用amdu命令進行抽取即可,命令與抽取控制檔案相同,但當資料檔案命名採用+DATADG/xxx/tbs01.dbf方式,需要先抽取後設資料,在後設資料中通過資料檔案的alias找到對應的fnum在依照OMF格式檔案的抽取方式進行抽取,更詳細的介紹請參考《asm翻譯系列》。

客戶在建立資料檔案時均是採用OMF檔案管理方式,直接編輯如下資料檔案抽取命令:

amdu -diskstring '/dev/xxx/*' -extract datadg.347 -noreport -nodir

amdu -diskstring '/dev/xxx/*' -extract datadg.368 -noreport -nodir

amdu -diskstring '/dev/xxx/*' -extract datadg.316 -noreport -nodir

amdu -diskstring '/dev/xxx/*' -extract datadg.335 -noreport -nodir

抽取完成後的檔案格式預設為DATADG_347.f這樣的命令規則,由於抽取到本地後資料檔名稱已經發生變化,在資料庫mount狀態下將控制檔案中記錄的資料檔名稱進行重新命名,讓資料庫識別抽取到本地的資料檔案。

重新命名資料檔案:

alter database rename file '+DATADG/xxx/datafile/system.347.957297809' to '/orabackup/xxx/DATADG_347.f';

alter database rename file '+DATADG/xxx/datafile/sysaux.368.957297823' to '/orabackup/xxx/DATADG_368.f';

alter database rename file '+DATADG/xxxdatafile/undotbs1.316.957297837' to '/orabackup/xxx/DATADG_316.f';

...

將資料庫OPEN:

由於日誌檔案所在的磁碟組沒有出現dismount問題,日誌檔案完好,並可以正常訪問,這種情況下直接open資料庫即可。

SQL> alter database open;

Database altered.

SQL>

資料庫被正常開啟,但此時資料檔案,都儲存在本地檔案系統中,還需將資料檔案移動至asm磁碟組中,由於客戶環境已無可用的asm磁碟組,對上面問題磁碟組程式刪除重新建立後使用rman copy方式將本地檔案系統中的檔案重新移動至asm磁碟組中:

select 'backup as copy datafile ' ||  file_id || ' format ' || '+DATADG;' from dba_data_files;

select 'switch datafile ' || file_id || ' to copy;' from dba_data_files;

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

相關文章