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
正常启动,说明拷贝出来的文件能正常启用,测试通过。
不适用的情况
磁盘被损坏的情况下
这种毫无疑问,如果磁盘损坏,那么就算能拷贝出来,也是损坏的数据文件,无法使用
