Oracle asm磁盘损坏异常恢复

来源:这里教程网 时间:2026-03-03 18:11:28 作者:

工具介绍:

          工具适用于在  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

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

 

 

不适用的情况

磁盘被损坏的情况下

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

相关推荐