asm disk header 的自动备份和恢复

来源:互联网 发布:mac如何设置开机密码 编辑:程序博客网 时间:2024/06/05 19:31

本文参考:http://www.dbform.com/html/2012/1875.html

http://www.xifenfei.com/2012/06/%E4%BD%BF%E7%94%A8asm-disk-header-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E4%BF%A1%E6%81%AF%E6%81%A2%E5%A4%8D.html

   在Oracle 10.2.0.5之前,ASM磁盘的头块并没有自己的备份,因此一旦头块损坏,如果没有以前kfed read备份出来的信息,也就没有办法使用kfed merge来作头块恢复,特别是如果一个磁盘组中所有的磁盘头块都出现问题(比如被人为地创建了PV),恢复ASM磁盘头块的操作就会非常麻烦。

   但是从Oracle 10.2.0.5之后,ASM磁盘的头块会自动备份在另外一个块中,这实际上是Oracle 11g出现的功能,不过经过测试,在Oracle 10.2.0.5版本中,这个备份也是存在的。

   对于10.2.0.5.0以及以后版本,不管au size是多少,asm disk header自动备份存储的位置是第2个au的倒数第2个block.
计算方法:AU中包含的block num[AU_SIZE/block_size]*2-2[因为从第一个块从0计数],通过该方法计算结论为:
         1M AU在510
         2M AU在1022
         4M AU在2046
         8M AU在4094
         16M AU在8190
         32M AU在16382
         64M AU在32766

   正是因为存在这个备份,所以Oracle 10.2.0.5之后的kfed程序才有了新的repair命令,该命令将备份块直接覆盖到磁盘头块,完成修复工作。

   在Oracle 10.2.0.4中,如果尝试执行kfed repair,则会报错说命令行参数不正确,此报错说明并不存在repair命令:

$ kfed repair KFED-00101: LRM error [102] while parsing command line arguments

   但是在Oracle 10.2.0.5中,执行kfed repair,则会说无法打开文件空,而这正说明repair命令是存在的,报错是因为还需要明确指定要修复哪块磁盘:

$ kfed repairKFED-00303: unable to open file ''


编译kfed程序

cd $ORACLE_HOME/rdbms/libcp ins_rdbms.mk ins_rdbms.mk.bakmake -f ins_rdbms.mk ikfed

数据库版本

SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionPL/SQL Release 11.2.0.4.0 - ProductionCORE    11.2.0.4.0      ProductionTNS for Linux: Version 11.2.0.4.0 - ProductionNLSRTL Version 11.2.0.4.0 - Production

ASM磁盘属性

SQL> set linesize 300SQL> col PATH format a30SQL> select group_number,DISK_NUMBER,PATH,HEADER_STATUS from v$asm_disk where group_number<>0;GROUP_NUMBER DISK_NUMBER PATH                           HEADER_STATU------------ ----------- ------------------------------ ------------           4           2 /dev/mapper/cdpfra1            MEMBER           4           3 /dev/mapper/cdpfra2            MEMBER           3           7 /dev/mapper/cdpdata4           MEMBER           3           6 /dev/mapper/cdpdata3           MEMBER           3           4 /dev/mapper/cdpdata1           MEMBER           3           5 /dev/mapper/cdpdata2           MEMBERSQL> select group_number,name,BLOCK_SIZE,ALLOCATION_UNIT_SIZE from v$asm_diskgroup;GROUP_NUMBER NAME                           BLOCK_SIZE ALLOCATION_UNIT_SIZE------------ ------------------------------ ---------- --------------------           4 FRA                                  4096              1048576           3 DATA                                 4096              1048576


验证自动备份asm disk header功能

$ kfed read /dev/mapper/cdpfra1 blknum=510|>/tmp/diskhead.510$ kfed read /dev/mapper/cdpfra1 blknum=0|>/tmp/diskhead.0$ ll /tmp/diskhead.*-rw-r--r-- 1 grid oinstall 0 Nov  5 09:47 /tmp/diskhead.0-rw-r--r-- 1 grid oinstall 0 Nov  5 09:46 /tmp/diskhead.510$ diff /tmp/diskhead.0 /tmp/diskhead.510--通过对比发现两者无不同记录返回,证明他们记录内容完全相同

破坏asm disk header

[grid@hlwzf1 lib]$  kfed read /dev/mapper/cdpfra1kfbh.endian:                          1 ; 0x000: 0x01kfbh.hard:                          130 ; 0x001: 0x82kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEADkfbh.datfmt:                          1 ; 0x003: 0x01kfbh.block.blk:                       0 ; 0x004: blk=0kfbh.block.obj:              2147483650 ; 0x008: disk=2kfbh.check:                    49794540 ; 0x00c: 0x02f7cdeckfbh.fcn.base:                     2493 ; 0x010: 0x000009bdkfbh.fcn.wrap:                        0 ; 0x014: 0x00000000kfbh.spare1:                          0 ; 0x018: 0x00000000kfbh.spare2:                          0 ; 0x01c: 0x00000000kfdhdb.driver.provstr:         ORCLDISK ; 0x000: length=8$ dd if=/dev/zero of=/dev/mapper/cdpfra1 bs=4096 count=11+0 records in1+0 records out4096 bytes (4.1 kB) copied, 0.00430849 s, 951 kB/s$ kfed read /dev/mapper/cdpfra1 blknum=0kfbh.endian:                          0 ; 0x000: 0x00kfbh.hard:                            0 ; 0x001: 0x00kfbh.type:                            0 ; 0x002: KFBTYP_INVALIDkfbh.datfmt:                          0 ; 0x003: 0x00kfbh.block.blk:                       0 ; 0x004: blk=0kfbh.block.obj:                       0 ; 0x008: file=0kfbh.check:                           0 ; 0x00c: 0x00000000kfbh.fcn.base:                        0 ; 0x010: 0x00000000kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000kfbh.spare1:                          0 ; 0x018: 0x00000000kfbh.spare2:                          0 ; 0x01c: 0x00000000

查看破坏后的磁盘属性和操作

SQL> set linesize 300SQL> col PATH format a30SQL> select group_number,DISK_NUMBER,PATH,HEADER_STATUS from v$asm_disk where group_number<>0;GROUP_NUMBER DISK_NUMBER PATH                           HEADER_STATU------------ ----------- ------------------------------ ------------           4           2 /dev/mapper/cdpfra1            CANDIDATE           4           3 /dev/mapper/cdpfra2            MEMBER           3           7 /dev/mapper/cdpdata4           MEMBER           3           6 /dev/mapper/cdpdata3           MEMBER           3           4 /dev/mapper/cdpdata1           MEMBER           3           5 /dev/mapper/cdpdata2           MEMBERSQL>  alter diskgroup fra dismount;Diskgroup altered.SQL> alter diskgroup fra mount;alter diskgroup fra mount*ERROR at line 1:ORA-15032: not all alterations performedORA-15040: diskgroup is incompleteORA-15042: ASM disk "2" is missing from group number "4"

使用kfed repair修改损坏asm disk header

$ kfed repair '/dev/mapper/cdpfra1'$ kfed read /dev/mapper/cdpfra1 blknum=0kfbh.endian:                          1 ; 0x000: 0x01kfbh.hard:                          130 ; 0x001: 0x82kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEADkfbh.datfmt:                          1 ; 0x003: 0x01kfbh.block.blk:                       0 ; 0x004: blk=0kfbh.block.obj:              2147483650 ; 0x008: disk=2kfbh.check:                    49794540 ; 0x00c: 0x02f7cdeckfbh.fcn.base:                     2493 ; 0x010: 0x000009bdkfbh.fcn.wrap:                        0 ; 0x014: 0x00000000kfbh.spare1:                          0 ; 0x018: 0x00000000kfbh.spare2:                          0 ; 0x01c: 0x00000000kfdhdb.driver.provstr:         ORCLDISK ; 0x000: length=8SQL> alter diskgroup fra mount;Diskgroup altered.


如果是手动备份asm disk header,比如前面的
kfed read /dev/mapper/cdpfra1 blknum=0|>/tmp/diskhead.0
还可以使用kfed merge恢复

kfed merge /dev/mapper/cdpfra1 /tmp/diskhead.0
0 0
原创粉丝点击