Oracle asm磁碟損壞異常恢復
工具介紹:
工具適用於在 asm 磁碟組無法正常 mount 的情況下,將 asm 中的資料檔案取出。適用於 11g , linux/aix/hp-unix 環境。
使用方法如下。
1 上傳 linux_aix_hpunix.zip 和 asm.json 檔案到指定目錄。如 /backup
2 修改許可權為 grid:oinstall ,解壓壓縮檔案,並將 asm.json 檔案複製到解壓的資料夾中。
3 編輯 asm.json 檔案,將 asm 的磁碟機代號名字新增到 asmPath 中,中間以逗號隔開
{
"asmPaths": [
"/dev/asm-diske","/dev/asm-diskf"
]
}
4 透過字元介面登陸
# su - grid
# cd /backup/20190919-linux_aix_hpunix
# java -jar mcdbra-asm-1.0.jar
ASM>
5 該介面有 4 種操作方式,其中三種為 cd ls cp ,如截圖所示
還有一種為 manual_init_disk 。
該方式是在盤頭以及自動備份盤頭的資訊都被損壞的情況下,去取出 asm 中的檔案。詳見 3.2
透過該方式,在磁碟組無法 mount 的情況下,可以將資料庫相關檔案複製出來,重建磁碟組,恢復資料庫。
測試
不破壞盤頭
測試環境為 11204rac xtts 資料庫
建一個新的磁碟組, +newdata,
SQL> SQL> SQL> SQL>
NAME NAME PATH TYPE STATE OS_MB TOTAL_MB
-------------- -------------- ----------------- ------ ----------- -------- ----------
DATA DATA_0000 /dev/asm-diskd EXTERN MOUNTED 102400 102400
NEWDATA NEWDATA_0001 /dev/asm-diskf NORMAL MOUNTED 10240 10240
NEWDATA NEWDATA_0000 /dev/asm-diske NORMAL MOUNTED 10240 10240
OCRVT OCRVT_0001 /dev/asm-diskb EXTERN MOUNTED 2048 2048
OCRVT OCRVT_0000 /dev/asm-diska EXTERN MOUNTED 2048 2048
OCRVT OCRVT_0002 /dev/asm-diskc EXTERN MOUNTED 2048 2048
6 rows selected.
select group_number,name,allocation_unit_size,total_mb from v$asm_diskgroup;
GROUP_NUMBER NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------ -------------- -------------------- ----------
1 DATA 1048576 (1M) 102400
2 NEWDATA 1048576 20480
3 OCRVT 1048576 6144
在新的磁碟組中建立表空間以及插入資料。
create tablespace test_json datafile '+newdata/test01.dbf' size 10m autoextend on;
create table test_t tablespace test_json as select * from dba_objects ;
insert into test_t select * from test_t;
commit;
關閉資料庫和叢集
srvctl stop database –d xtts
/oracle/grid/crs_1/bin/crsctl stop crs –f
配置asm 工具
由3.1 可知,oracle 的磁碟路徑具體是哪些。實際在客戶環境中,叢集無法開啟的情況下,可以透過一般常識去判斷路徑位置,一般盤的路徑的在/dev 下面。
也可以透過 gpnptool get 獲取asmdisk_string
下例中, 路徑僅為 +newdata 磁碟組對應的磁碟 。
# cat asm.json
{
"asmPaths": [
"/dev/asm-diske","/dev/asm-diskf"
]
}
登陸並複製test01.dbf 到本地
注意,此時叢集已經關閉
$ java -jar mcdbra-asm-1.0.jar
ASM>cd newdata
ASM>ls
dir ASM
file test01.dbf
ASM>cp test01.dbf /tmp/test01.dbf
$ ll -h /tmp/test01.dbf
-rw-r--r-- 1 root root 33M Oct 11 13:57 /tmp/test01.dbf
啟動叢集,不啟動庫,刪除+newdata/test01.dbf
/oracle/grid/crs_1/bin/crsctl start crs
su – grid
asmcmd
rm +newdata/test01.dbf
將/tmp/test01.dbf 複製回去,資料庫能正常開啟,測試成功。
su – grid
asmcmd
ASMCMD> cp /tmp/test01.dbf +newdata
exit
srvctl start database –d xtts
破壞盤頭以及自動備份的盤頭資訊。
AU 是 asm 中的最小分配單位,預設是 1M 。
一般情況下,盤頭資訊位於磁碟第一個 AU 的的第一個塊中。由於盤頭資訊非常重要, 10.2.0.5 之後, oracle 自動將盤頭備份在第二個 AU 的倒數第二個塊中。
以本次測試環境為例,我們針對測試的為 newdata 磁碟組, ausize 為 1M , blocksize 為 4096bytes 。
select group_number,name,sector_size,block_size,allocation_unit_size/1024/1024 au_size_M from v$asm_diskgroup;
GROUP_NUMBER NAME BLOCK_SIZE AU_SIZE_M
----------------------------------- --------------- ----------- ---------- ----------
1 DATA 4096 1
2 NEWDATA 4096 1
3 OCRVT 4096 1
## 注意 ,如果 僅僅破壞盤頭 的情況,即自動備份的盤頭資訊完整的情況下,參考 3.1 的步驟,該工具會直接尋找自動備份的盤頭資訊,該情況本文件跳過測試步驟。
備份盤頭資訊
## 注意:本次測試涉及的磁碟組為 +NEWDATA, normal, 包含 /dev/asm-diskf /dev/asm-diske 兩塊盤
kfed read /dev/asm-diskf aunum=0 blknum=0 text=diskf.txt
kfed read /dev/asm-diske aunum=0 blknum=0 text=diske.txt
kfed read /dev/asm-diskf blknum=510 text=diskf_510.txt ## 可省略
kfed read /dev/asm-diske blknum=510 text=diske_510.txt ## 可省略
破壞盤頭和自動備份的盤頭資訊
dd if=/dev/zero of=/dev/asm-diskf bs=4096 count=1
dd if=/dev/zero of=/dev/asm-diske bs=4096 count=1
dd if=/dev/zero of=/dev/asm-diskf seek=510 bs=4096 count=1
dd if=/dev/zero of=/dev/asm-diske seek=510 bs=4096 count=1
嘗試 kfed 去 repair ,可以看到如下報錯,說明自動備份的盤頭資訊已經被破壞了
kfed repair /dev/asm-diskf
KFED-00320: Invalid block num1 = [0], num2 = [1], error = [endian_kfbh]
關閉資料庫和叢集
srvctl stop database –d xtts
/oracle/grid/crs_1/bin/crsctl stop crs –f
使用工具複製asm 中的檔案
該工具需要手動輸入 1 diskgroup name 2 disk name 3 disk number 4 ausize 5 f1b1 這 5 個引數。
please input disk group name: newdata
please input disk name: /dev/asm-diske
please input disk number: 2
please input ausize: 1048576
please input f1b1 location: 2
disk number: Number assigned to the disk within its disk group, 從 0 開始,依次遞增 1 ,如果有 drop 的操作,比如刪除 0 號盤,再次新增一個盤會順延一個號,而不是 0 號。
f1b1 location ; ASM 中 file directory 的位置。 file directory 包含 diskgroup 中的所有檔案資訊,如檔案大小、建立時間等。一般都是 2 。表示在 2 號 au 。
一般來說,預設的 ausize 都是 1M , 1048576 bytes 為 1M 。 大部分的 f1b1 都是 2.
disk number 由下列 sql 確認
select disk_number,path,name from v$asm_disk
DISK_NUMBER PATH NAME
----------- ------------------------------ ------------------------------
1 /dev/asm-diskf NEWDATA_0001
0 /dev/asm-diskd DATA_0000
1 /dev/asm-diskb OCRVT_0001
2 /dev/asm-diskc OCRVT_0002
2 /dev/asm-diske NEWDATA_0002
0 /dev/asm-diska OCRVT_0000
6 rows selected.
3.2.4.1 獲取上述資訊的方法
1 AUSIZE :
su - grid
grep ausize -i $GI_HOME/inventory/response/grid_install.rsp
# Example: oracle.install.asm.diskGroup.AUSize=4
oracle.install.asm.diskGroup.AUSize=1
2
######## 補充
這裡可以使用一個抽取工具獲取盤的相關資訊。
可以在叢集無法啟動的情況下獲取磁碟組資訊。但是磁碟頭損壞的情況下無法獲取。
解壓後,
$ cat asmdisk.txt
# disk_no disk_path group_name meta_block_size ausize disk_size header_offset
1 /dev/asm-diske
2 /dev/asm-diskf
$./odc
grp# dsk# bsize ausize disksize diskname groupname path
---- ---- ----- ------ -------- --------------- --------------- --------------------------------------------
1 2 4096 1024K 10240 NEWDATA_0002 NEWDATA /dev/asm-diske
1 1 4096 1024K 10240 NEWDATA_0001 NEWDATA /dev/asm-diskf
##########
詳細操作例子如下:
[grid@11grac2 20190919-linux_aix_hpunix]$ java -jar mcdbra-asm-1.0.jar
ASM>ls
ASM>exit
[grid@11grac2 20190919-linux_aix_hpunix]$ java -jar mcdbra-asm-1.0.jar
ASM>l
upport cmd: pwd ls cd cp manual_init_disk exit quit help
ASM>manual_init_disk
try to init disk: /dev/asm-diske
please input disk group name: newdata
please input disk name: /dev/asm-diske
please input disk number: 2
please input ausize: 1048576
please input f1b1 location: 2
try to init disk: /dev/asm-diskf
please input disk group name: newdata
please input disk name: /dev/asm-diskf
please input disk number: 1
please input ausize: 1048576
please input f1b1 location: 2
ASM>ls
newdata
ASM>cd newdata
ASM>ls
dir ASM
file test01.dbf
ASM>cp test01.dbf /tmp/test01.dbf
ASM>exit
啟動叢集,恢復盤頭,mount diskgroup, 保持關庫狀態,刪除 +nwedata/test01.dbf
/oracle/grid/crs_1/bin/crsctl start crs 開啟叢集
恢復盤頭,否則認不到磁碟組
kfed write /dev/asm-diskf blknum=510 text=diskf.txt
kfed write /dev/asm-diske blknum=510 text=diske.txt
kfed write /dev/asm-diskf blknum=0 text=diskf.txt
kfed write /dev/asm-diske blknum=0 text=diske.txt
sqlplus / as sysasm
alter diskgroup newdata mount;
asmcmd
ASMCMD>cd +newdata
ASMCMD>rm test01.dbf
ASMCMD> cp /tmp/test01.dbf .
啟動庫
srvctl start database –d xtts
正常啟動,說明複製出來的檔案能正常啟用,測試透過。
不適用的情況
磁碟被損壞的情況下
這種毫無疑問,如果磁碟損壞,那麼就算能複製出來,也是損壞的資料檔案,無法使用
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31547506/viewspace-2925947/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RAC 11G ASM磁碟損壞恢復ASM
- ASM之OCR所在磁碟組損壞後的恢復ASM
- 深入解析:段頭塊損壞bbed異常恢復
- ASM磁碟頭資訊損壞和修復(kfed/dd)ASM
- Oracle ASM異常dismount磁碟組OracleASM
- 探索ORACLE之RMAN_07 磁碟損壞資料丟失恢復Oracle
- index損壞恢復Index
- 磁碟損壞造成RMAN備份檔案有壞塊的恢復案例
- Oracle塊損壞恢復(有rman備份)Oracle
- 存貯在asm中的ocr/votedisk/asm磁碟組損害的恢復ASM
- linux下修復磁碟損壞Linux
- 磁碟損壞導致資料檔案丟失的恢復
- Oracle資料庫UNDO損壞後的恢復Oracle資料庫
- 轉載:Oracle資料塊損壞恢復總結Oracle
- Oracle不同檔案丟失/損壞的恢復方法Oracle
- 損壞聯機日誌 恢復
- 【vSAN資料恢復案例】異常斷電導致vSAN底層資料損壞的資料恢復資料恢復
- 介質恢復,即磁碟或作業系統檔案損壞的恢復-非RMAN方法作業系統
- Oracle資料檔案損壞恢復例項二則Oracle
- 損壞控制檔案的恢復方法
- SQL Server ldf 檔案損壞恢復SQLServer
- 案例:磁碟分割槽壞掉-oracle無備份的恢復Oracle
- u盤檔案損壞怎麼恢復資料 u盤恢復損壞資料的有效方法
- 6_Oracle truncate異常恢復之bbed修復Oracle
- 7_Oracle truncate異常恢復之plsql修復OracleSQL
- Oracle資料庫不同損壞級別的恢復詳解Oracle資料庫
- 聯機日誌損壞恢復實驗
- 恢復之單個控制檔案損壞
- 損壞聯機日誌的恢復方法
- 單個控制檔案損壞的恢復
- 當前日誌組全部損壞的恢復
- 線上日誌檔案損壞恢復方法
- 【LINUX】Oracle資料庫 linux磁碟頭資料損壞修復LinuxOracle資料庫
- 【恢復】使用控制檔案的trace備份恢復因異常斷電導致所有控制檔案損壞的資料庫故障資料庫
- 記一次Oracle RAC for aix 儲存雙控鎖盤導致ASM控制檔案損壞恢復OracleAIASM
- Oracle Database 12c RAC損壞ocr和votedisk恢復實驗OracleDatabase
- Oracle資料庫恢復:歸檔日誌損壞案例一則Oracle資料庫
- Oracle database 11g rac損壞ocr和votedisk恢復實驗OracleDatabase