Oracle asm磁盘损坏异常恢复

来源:这里教程网 时间:2026-03-03 17:54:56 作者:

1 工具介绍:

         工具适用于在 asm 磁盘组无法正常 mount 的情况下,将 asm 中的数据文件取出。适用于 11g linux/aix/hp-unix 环境。

 

 

2 使用方法如下。

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 的情况下,可以将数据库相关文件拷贝出来,重建磁盘组,恢复数据库。

 

 

3 linux rac 测试

不破坏盘头

测试环境为 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

正常启动,说明拷贝出来的文件能正常启用,测试通过。  

不适用的情况

磁盘被损坏的情况下

这种毫无疑问,如果磁盘损坏,那么就算能拷贝出来,也是损坏的数据文件,无法使用 

相关推荐