天天看點

【ASM】ASMCMD 磁盤中繼資料的備份與恢複實踐

1 實驗目的

對于oracle10g版本的asm,很多功能還不夠完善,比如就沒有asm磁盤資訊中繼資料有效的備份方式,如斷電或者誤操作導緻asm磁盤頭資訊丢失,不得不重新建立asm磁盤組,通過備份的方式恢複資料,如果沒有備份,則導緻資料丢失。oracle11g 在asm指令工具asmcmd中增加了md_backup,md_restore兩個指令可以很好的備份和恢複asm磁盤組中繼資料,使用這兩個指令可以友善的備份和恢複asm磁盤的中繼資料。

2 實驗環境

資料庫版本     環境  資料庫名  執行個體名ip位址作業系統和主機名

oracle11.2.0.1 rac   racdb

                     racdb1     192.168.1.227 linux as 5.3+rac1

                     racdb2     192.168.1.228 linux as 5.3+rac2

以上環境針對于磁盤組内磁盤頭資訊丢失恢複

3 實驗步驟

3.1 md_backup備份磁盤組中繼資料

3.1.1檢視磁盤組下的磁盤資訊

[grid@rac1 ~]$ sqlplus / as sysdba

sql*plus: release11.2.0.1.0 production on thu jul 8 15:24:19 2010

copyright (c) 1982, 2009, oracle. all rights reserved.

connected to:

oracle database11genterprise edition release11.2.0.1.0 - 64bit production

with the real application clusters and automatic storage management options

sql> select name,state from v$asm_diskgroup;

name state

------------------------------ -----------

crs mounted --crs磁盤組(存放ocr和vote盤)

testdg mounted

sql> select name,path from v$asm_disk;

name path

testdg_0000 /dev/raw/raw1

3.1.2用kfed讀取磁盤頭資訊

比如讀取磁盤組testdg下/dev/raw/raw1磁盤頭資訊

[grid@rac1 amdu_2010_07_08_15_15_18]$ kfed read /dev/raw/raw1 > /home/grid/raw1bak.txt

[grid@rac1 amdu_2010_07_08_15_15_18]$ more /home/grid/raw1bak.txt

kfbh.endian: 1 ; 0x000: 0x01

kfbh.hard: 130 ; 0x001: 0x82

kfbh.type: 1 ; 0x002: kfbtyp_diskhead

kfbh.datfmt: 1 ; 0x003: 0x01

kfbh.block.blk: 0 ; 0x004: t=0 numb=0x0

kfbh.block.obj: 2147483648 ; 0x008: type=0x8 numb=0x0

kfbh.check: 534688621 ; 0x00c: 0x1fdeb36d

kfbh.fcn.base: 0 ; 0x010: 0x00000000

kfbh.fcn.wrap: 0 ; 0x014: 0x00000000

kfbh.spare1: 0 ; 0x018: 0x00000000

kfbh.spare2: 0 ; 0x01c: 0x00000000

kfdhdb.driver.provstr: orcldisk ; 0x000: length=8

kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000

kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000

kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000

kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000

kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000

kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000

kfdhdb.compat: 186646528 ; 0x020: 0x0b200000

kfdhdb.dsknum: 0 ; 0x024: 0x0000

kfdhdb.grptyp: 1 ; 0x026: kfdgtp_external

kfdhdb.hdrsts: 3 ; 0x027: kfdhdr_member

kfdhdb.dskname: testdg_0000 ; 0x028: length=11

kfdhdb.grpname: testdg ; 0x048: length=6

kfdhdb.fgname: testdg_0000 ; 0x068: length=11

kfdhdb.capname: ; 0x088: length=0

kfdhdb.crestmp.hi: 32939275 ; 0x0a8: hour=0xb days=0x8 mnth=0x7 year=0x7da

kfdhdb.crestmp.lo: 3713031168 ; 0x0ac: usec=0x0 msec=0x17 secs=0x15 mins=0x37

kfdhdb.mntstmp.hi: 32939275 ; 0x0b0: hour=0xb days=0x8 mnth=0x7 year=0x7da

kfdhdb.mntstmp.lo: 3725327360 ; 0x0b4: usec=0x0 msec=0x2ff secs=0x20 mins=0x37

kfdhdb.secsize: 512 ; 0x0b8: 0x0200

kfdhdb.blksize: 4096 ; 0x0ba: 0x1000

kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000

kfdhdb.mfact: 454272 ; 0x0c0: 0x0006ee80

kfdhdb.dsksize: 12799 ; 0x0c4: 0x000031ff

kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002

kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001

kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002

kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002

kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000

kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000

kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000

kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000

kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000

kfdhdb.grpstmp.hi: 32939275 ; 0x0e4: hour=0xb days=0x8 mnth=0x7 year=0x7da

kfdhdb.grpstmp.lo: 3712403456 ; 0x0e8: usec=0x0 msec=0x1b2 secs=0x14 mins=0x37

kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000

kfdhdb.vfend: 0 ; 0x0f0: 0x00000000

kfdhdb.spfile: 0 ; 0x0f4: 0x00000000

kfdhdb.spfflg: 0 ; 0x0f8: 0x00000000

kfdhdb.ub4spare[0]: 0 ; 0x0fc: 0x00000000

kfdhdb.ub4spare[1]: 0 ; 0x100: 0x00000000

kfdhdb.ub4spare[2]: 0 ; 0x104: 0x00000000

kfdhdb.ub4spare[3]: 0 ; 0x108: 0x00000000

kfdhdb.ub4spare[4]: 0 ; 0x10c: 0x00000000

kfdhdb.ub4spare[5]: 0 ; 0x110: 0x00000000

kfdhdb.ub4spare[6]: 0 ; 0x114: 0x00000000

kfdhdb.ub4spare[7]: 0 ; 0x118: 0x00000000

kfdhdb.ub4spare[8]: 0 ; 0x11c: 0x00000000

kfdhdb.ub4spare[9]: 0 ; 0x120: 0x00000000

kfdhdb.ub4spare[10]: 0 ; 0x124: 0x00000000

kfdhdb.ub4spare[11]: 0 ; 0x128: 0x00000000

kfdhdb.ub4spare[12]: 0 ; 0x12c: 0x00000000

kfdhdb.ub4spare[13]: 0 ; 0x130: 0x00000000

kfdhdb.ub4spare[14]: 0 ; 0x134: 0x00000000

kfdhdb.ub4spare[15]: 0 ; 0x138: 0x00000000

kfdhdb.ub4spare[16]: 0 ; 0x13c: 0x00000000

kfdhdb.ub4spare[17]: 0 ; 0x140: 0x00000000

kfdhdb.ub4spare[18]: 0 ; 0x144: 0x00000000

kfdhdb.ub4spare[19]: 0 ; 0x148: 0x00000000

kfdhdb.ub4spare[20]: 0 ; 0x14c: 0x00000000

kfdhdb.ub4spare[21]: 0 ; 0x150: 0x00000000

kfdhdb.ub4spare[22]: 0 ; 0x154: 0x00000000

kfdhdb.ub4spare[23]: 0 ; 0x158: 0x00000000

kfdhdb.ub4spare[24]: 0 ; 0x15c: 0x00000000

kfdhdb.ub4spare[25]: 0 ; 0x160: 0x00000000

kfdhdb.ub4spare[26]: 0 ; 0x164: 0x00000000

kfdhdb.ub4spare[27]: 0 ; 0x168: 0x00000000

kfdhdb.ub4spare[28]: 0 ; 0x16c: 0x00000000

kfdhdb.ub4spare[29]: 0 ; 0x170: 0x00000000

kfdhdb.ub4spare[30]: 0 ; 0x174: 0x00000000

kfdhdb.ub4spare[31]: 0 ; 0x178: 0x00000000

kfdhdb.ub4spare[32]: 0 ; 0x17c: 0x00000000

kfdhdb.ub4spare[33]: 0 ; 0x180: 0x00000000

kfdhdb.ub4spare[34]: 0 ; 0x184: 0x00000000

kfdhdb.ub4spare[35]: 0 ; 0x188: 0x00000000

kfdhdb.ub4spare[36]: 0 ; 0x18c: 0x00000000

kfdhdb.ub4spare[37]: 0 ; 0x190: 0x00000000

kfdhdb.ub4spare[38]: 0 ; 0x194: 0x00000000

kfdhdb.ub4spare[39]: 0 ; 0x198: 0x00000000

kfdhdb.ub4spare[40]: 0 ; 0x19c: 0x00000000

kfdhdb.ub4spare[41]: 0 ; 0x1a0: 0x00000000

kfdhdb.ub4spare[42]: 0 ; 0x1a4: 0x00000000

kfdhdb.ub4spare[43]: 0 ; 0x1a8: 0x00000000

kfdhdb.ub4spare[44]: 0 ; 0x1ac: 0x00000000

kfdhdb.ub4spare[45]: 0 ; 0x1b0: 0x00000000

kfdhdb.ub4spare[46]: 0 ; 0x1b4: 0x00000000

kfdhdb.ub4spare[47]: 0 ; 0x1b8: 0x00000000

kfdhdb.ub4spare[48]: 0 ; 0x1bc: 0x00000000

kfdhdb.ub4spare[49]: 0 ; 0x1c0: 0x00000000

kfdhdb.ub4spare[50]: 0 ; 0x1c4: 0x00000000

kfdhdb.ub4spare[51]: 0 ; 0x1c8: 0x00000000

kfdhdb.ub4spare[52]: 0 ; 0x1cc: 0x00000000

kfdhdb.ub4spare[53]: 0 ; 0x1d0: 0x00000000

kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0x00000000

kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0x00000000

kfdhdb.acdb.ents: 0 ; 0x1dc: 0x0000

kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000

從上面讀出的内容,我們可以擷取以下資訊:

dsknum磁盤号

grptyp磁盤所屬類型external redundancy,主要有以下三種類型

normal redundancy- two-way mirroring, requiring two failure groups.

high redundancy- three-way mirroring, requiring three failure groups.

external redundancy- no mirroring for disks that are already protected using hardware mirroring or raid.

ddrsts      磁盤頭狀态

dskname在asm中磁盤名

grpname 磁盤組名

fgname failure group name

crestmp.hi   asm磁盤組建立時間

mntstmp.hi   asm磁盤組mount時間

blksize 磁盤頭塊大小4096

ausize 條帶化大小4m

dsksize磁盤大小

f1b1locn file directory blk 1 au num   beginging for file directory

3.2 md_backup備份

[grid@rac1 amdu_2010_07_08_15_15_18]$ asmcmd md_backup /home/grid/asmbk -g 'testdg'

disk group metadata to be backed up: testdg

current alias directory path: rac-cluster/ocrfile

current alias directory path: rac-cluster

current alias directory path: rac-cluster/asmparameterfile

3.3 模拟磁盤頭資訊丢失

[grid@rac1 ~]$ dd if=/dev/zero f=/dev/raw/raw1 bs=4096 count=1

1+0 records in

1+0 records out

4096 bytes (4.1 kb) copied, 0.016114 seconds, 254 kb/s

[grid@rac1 ~]$ kfed read /dev/raw/raw1

kfbh.endian: 0 ; 0x000: 0x00

kfbh.hard: 0 ; 0x001: 0x00

kfbh.type: 0 ; 0x002: kfbtyp_invalid

kfbh.datfmt: 0 ; 0x003: 0x00

kfbh.block.obj: 0 ; 0x008: type=0x0 numb=0x0

kfbh.check: 0 ; 0x00c: 0x00000000

error!!!, failed to get the oracore error message

這時磁盤組testdg下/dev/raw/raw1磁盤頭資訊丢失,不能正常讀取。

sql> alter diskgroup testdg dismount;

diskgroupaltered.

sql> alter diskgroup testdg mount;

alter diskgroup testdg mount

*

error at line 1:

ora-15032: not all alterations performed

ora-15017: diskgroup "testdg" cannot be mounted

ora-15063: asm discovered an insufficient number of disks for diskgroup

"testdg"

可以看到testdg不能正常提供對外通路。

3.4 md_restore指令恢複磁盤組中繼資料

3.4.1所有節點把testdg服務offline

srvctl stop diskgroup –g testdg

否則恢複時會報ora-15030錯誤

[grid@rac1 ~]$ asmcmd md_restore /home/grid/asmbk.txt --silent -g 'testdg'

current diskgroup metadata being restored: testdg

asmcmd-09352: create diskgroup failed

ora-15018: diskgroup cannot be created

ora-15030: diskgroup name "testdg" is in use by another diskgroup (dbd error: ocistmtexecute)

3.4.2恢複磁盤組中繼資料庫

[grid@rac1 ~]$ asmcmd md_restore /home/grid/asmbk --silent -g 'testdg'

diskgroup testdg created!

system template onlinelog modified!

system template autobackup modified!

system template asmparameterfile modified!

system template ocrfile modified!

system template asm_stale modified!

system template ocrbackup modified!

system template parameterfile modified!

system template asmparameterbakfile modified!

system template flashfile modified!

system template xtransport modified!

system template dataguardconfig modified!

system template tempfile modified!

system template archivelog modified!

system template controlfile modified!

system template dumpset modified!

system template backupset modified!

system template flashback modified!

system template datafile modified!

system template changetracking modified!

[grid@rac1 ~]$

3.4.3所有節點包testdg服務online

[grid@rac1 ~]$srvctl start diskgroup -g testdg

[grid@rac1 ~]$ sqlplus "/as sysasm"

sql*plus: release11.2.0.1.0 production on thu jul 8 16:43:53 2010

---------------

crs    mounted

可以看到磁盤組testdg恢複成功。

3.5 總結

oracle11gasm磁盤組内中繼資料備份與恢複非常簡單,隻需要我們安裝完成後做好備份工作即可。