Oracle asm磁碟損壞異常恢復

jason_yehua發表於2022-11-30

工具介紹:

          工具適用於在  asm  磁碟組無法正常  mount  的情況下,將  asm  中的資料檔案取出。適用於  11g    linux/aix/hp-unix  環境。

 

 

使用方法如下。

上傳     linux_aix_hpunix.zip    asm.json  檔案到指定目錄。如  /backup

 

修改許可權為  grid:oinstall  ,解壓壓縮檔案,並將  asm.json  檔案複製到解壓的資料夾中。

 

 

編輯  asm.json  檔案,將  asm  的磁碟機代號名字新增到  asmPath  中,中間以逗號隔開

{

  "asmPaths": [

    "/dev/asm-diske","/dev/asm-diskf"

  ]

}

 

透過字元介面登陸

# su  - grid

# cd /backup/20190919-linux_aix_hpunix

# java -jar  mcdbra-asm-1.0.jar

ASM>

 

該介面有  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章