ASM AMDU工具使用

muxinqing發表於2014-05-08
AMDU是ORACLE針對ASM開發的源資料轉儲工具,其全稱為ASM Metadata Dump Utility(AMDU)

從oracle 11gR2版本,amdu工具可以直接使用,不需要單獨下載 命令放在$ORACLE_HOME/bin
 
AMDU具體以下三個主要功能:
 
1. 將ASM DISK上的後設資料轉儲到檔案系統上以便分析
 2. 將ASM檔案的內容抽取出來並寫入到OS檔案系統,Diskgroup是否mount均可
 3. 列印出塊的後設資料,以塊中C語言結構或16進位制的形式
 
這裡我們將用到使用AMDU抽取ASM DISKGROUP中的資料檔案; ASM作為近幾年最流行的儲存解決方案, 大家對他的優缺點都有所瞭解,其中的問題之一就是ASM是個黑盒。 一旦DISKGROUP無法MOUNT起來就意味著傳統方法無法以磁碟為基礎匯出任何資料。
 
AMDU解決了這一問題, 這裡我們僅討論在ASM DISKGROUP 無法MOUNT的情況下的範疇,不討論RDBMS資料檔案在ASM下訛誤的處理。
 
注意 AMDU雖然是11g才釋出的工具,但是實際對10g的ASM 也有效。
 
當前你可能遇到的場景是, ORACLE DATABASE的SPFILE、CONTROLFILE、DATAFILE均存放在ASM DISKGROUP中,而由於一些ASM ORA-600錯誤導致無法MOUNT該DISKGROUP, 你需要的是使用AMDU將這些檔案從ASM DISK中轉儲出來。
 
場景 1 丟失了 包括SPFILE、CONTROLFILE、DATAFILE
 
恢復步驟: 從備份中還原出SPFILE ,即便沒有SPFILE的話PFILE也可以,總之你需要從引數檔案中瞭解control_files的資訊
 
SQL> show parameter control_files
 
NAME TYPE VALUE
 ———————————— ———– ——————————
 control_files string +DATA/prodb/controlfile/curren
 t.260.794687955, +FRA/prodb/co
 ntrolfile/current.256.79468795
 5
 
獲得control_files 控制檔案在ASM中的位置後事情就好辦了,+DATA/prodb/controlfile/current.260.794687955 這裡 260是這個控制檔案在+DATA 這個DISKGROUP中的FILE NUMBER
 
此外我們還需要ASM DISK的DISCOVERY PATH資訊,這完全可以從ASM的SPFILE中的asm_diskstring 引數獲得
 
[oracle@mlab2 oracle.SupportTools]$ unzip amdu_X86-64.zip
 Archive: amdu_X86-64.zip
 inflating: libskgxp11.so
 inflating: amdu
 inflating: libnnz11.so
 inflating: libclntsh.so.11.1
 
[oracle@mlab2 oracle.SupportTools]$ export LD_LIBRARY_PATH=./
 
[oracle@mlab2 oracle.SupportTools]$ ./amdu -diskstring ‘/dev/asm*’ -extract data.260
 amdu_2009_10_10_20_19_17/
 AMDU-00204: Disk N0006 is in currently mounted diskgroup DATA
 AMDU-00201: Disk N0006: ‘/dev/asm-disk10′
 AMDU-00204: Disk N0003 is in currently mounted diskgroup DATA
 AMDU-00201: Disk N0003: ‘/dev/asm-disk5′
 AMDU-00204: Disk N0002 is in currently mounted diskgroup DATA
 AMDU-00201: Disk N0002: ‘/dev/asm-disk6′
 
[oracle@mlab2 oracle.SupportTools]$ cd amdu_2009_10_10_20_19_17/
 [oracle@mlab2 amdu_2009_10_10_20_19_17]$ ls
 DATA_260.f report.txt
 [oracle@mlab2 amdu_2009_10_10_20_19_17]$ ls -l
 total 9548
 -rw-r–r– 1 oracle oinstall 9748480 Oct 10 20:19 DATA_260.f
 -rw-r–r– 1 oracle oinstall 9441 Oct 10 20:19 report.txt
 
以上轉儲出來的DATA_260.f 就是控制檔案,我們使用該控制檔案startup mount RDBMS例項:
 
SQL> alter system set control_files=’/opt/oracle.SupportTools/amdu_2009_10_10_20_19_17/DATA_260.f’ scope=spfile;
 
System altered.
 
SQL> startup force mount;
 ORACLE instance started.
 
Total System Global Area 1870647296 bytes
 Fixed Size 2229424 bytes
 Variable Size 452987728 bytes
 Database Buffers 1409286144 bytes
 Redo Buffers 6144000 bytes
 Database mounted.
檢視資料檔案的位置,然後一一匯出
1234567891011
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
+DATA/db/datafile/system.256.804295135
+DATA/db/datafile/sysaux.257.804295137
+DATA/db/datafile/undotbs1.258.804295139
+DATA/db/datafile/users.259.804295141
$  amdu -diskstring '/dev/oracleasm/disks/ASMDISK*' -extract data.256     <<<<<<<<<<<<< $  amdu -diskstring '/dev/oracleasm/disks/ASMDISK*' -extract data.257     <<<<<<<<<<<<< $  amdu -diskstring '/dev/oracleasm/disks/ASMDISK*' -extract data.258     <<<<<<<<<<<<< $  amdu -diskstring '/dev/oracleasm/disks/ASMDISK*' -extract data.259     <<<<<<<<<<<<< 12345678
$ mv amdu_2013_07_03_18_12_56/DATA_257.f sysaux.257.804295137
$ mv amdu_2013_07_03_18_22_23/DATA_259.f users.259.804295141
$ mv amdu_2013_07_03_18_23_06/DATA_258.f undotbs1.258.804295139
$ ll
-rw-r--r-- 1 oracle dba 545267712 Jul  3 18:14 sysaux.257.804295137
-rw-r--r-- 1 oracle dba 702554112 Jul  3 18:11 system.256.804295135
-rw-r--r-- 1 oracle dba  99622912 Jul  3 18:23 undotbs1.258.804295139
-rw-r--r-- 1 oracle dba   5251072 Jul  3 18:22 users.259.804295141
11. 掛載前需要修改pfile檔案,下面是open資料庫是control file如何識別不同路徑的datafile, 我使用convert引數來解決(也可以是用set newname的方式)
db_file_name_convert='+DATA/db/datafile','/u01/amdu/amdu_datafile'
新增完pfile,啟動資料庫,最終成功啟動資料庫
12345678910111213141516
SQL> startup pfile='/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilebk.ora';
[oracle@Single-DB ~]$ sqlplus / as sysdba
Connected to an idle instance.
SQL> startup pfile='/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfilebk.ora';
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size                  2220200 bytes
Variable Size             281022296 bytes
Database Buffers          780140544 bytes
Redo Buffers                5554176 bytes
Database mounted.
Database opened.
SQL>  select status, instance_name  from v$instance;
STATUS       INSTANCE_NAME
------------ ----------------
OPEN         db
總結,備份很重要!!
由於是在我測試庫上進行的實驗,我沒有破壞資料檔案來完全模擬客戶問題。
但是透過這個測試,我們可以確認的是,在ASM diskgroup無法掛載的情況下,我們是有辦法將資料檔案讀出(即使是壞的),然後我們在針對具體的壞塊嘗試block恢復(估計沒有備份,這個也沒轍了)。
但是至少,資料檔案擺在我們面前了,我們還有其他很多辦法去嘗試修復,再不行,也只是丟失部分資料,因為其中可能只是個別資料檔案的個別block損壞。
總之,資料檔案弄出來了,剩下的,繼續研究吧。

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

相關文章