联系:手机(17813235971) QQ(107644445)
链接:http://www.xifenfei.com/5888.html
作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
在上一篇中写道了文件系统的库,在进行异常恢复前的备份方法(Oracle异常恢复前备份保护现场建议—FileSystem环境),对于asm库,因为asm 里面的数据文件无法直接dd文件头,因此备份方式也有所改变.对于asm是mount,但是数据库不能打开,使用rman或者asm的cp命令全部备份数据文件也来不及或者空间不足,这样的情况下,你可以考虑使用rman或者cp命令备份控制文件和system表空间文件,cp命令备份redo,dd命令备份文件头,来完成asm情况下数据库异常恢复前备份
控制文件备份
11.2及其以后版本使用asmcmd cp命令处理
select 'asmcmd cp '||name||' &&backup_dir/' from v$datafile where ts#=0 union all select 'asmcmd cp '||name||' &&backup_dir/crontrofile_'||rownum||'.ctl' from v$controlfile union all select 'asmcmd cp '||member||' &&backup_dir/'||thread#||'_'||a.group#||'_'||sequence#||'_'||substr(member, instr(member,'/',-1)+1) FROM v$log a, v$logfile b WHERE a.group# = B.GROUP#;
其他版本使用rman命令处理
--rman备份控制文件(/tmp目录自己修改) copy current controlfile to '/tmp/ctl.ctl'; --rman备份system表空间 select 'copy datafile '||file#||' to ''&backup_dir/system_'||file#||'.dbf'';' from v$datafile where ts#=0; --redo无法直接备份
备份文件头
[grid@xifenfei ~]$ ss SQL*Plus: Release 11.2.0.4.0 Production on Fri May 1 04:15:18 2015 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Automatic Storage Management option SQL> set lines 150 SQL> select 'dd if='||c.PATH_KFDSK||' of=&&backup_path/'||a.GROUP_KFFXP||'_'||a.disk_kffxp||'_'|| 2 b.NUMBER_KFFIL||'.asm count=1 bs='|| d.AUSIZE_KFGRP||' skip='||a.au_kffxp backup_dd_cmd 3 FROM x$kffxp a, X$KFFIL b,X$KFDSK c,X$KFGRP d WHERE 4 a.GROUP_KFFXP=b.GROUP_KFFIL 5 and a.NUMBER_KFFXP=b.NUMBER_KFFIL 6 and b.FTYPE_KFFIL in(2,12) 7 and b.NUMBER_KFFIL>255 8 and a.xnum_kffxp=0 9 and a.GROUP_KFFXP=c.GRPNUM_KFDSK 10 and a.disk_kffxp=c.NUMBER_KFDSK 11 and a.GROUP_KFFXP=d.NUMBER_KFGRP; Enter value for backup_path: /tmp old 1: select 'dd if='||c.PATH_KFDSK||' of=&&backup_path/'||a.GROUP_KFFXP||'_'||a.disk_kffxp||'_'|| new 1: select 'dd if='||c.PATH_KFDSK||' of=/tmp/'||a.GROUP_KFFXP||'_'||a.disk_kffxp||'_'|| BACKUP_DD_CMD ------------------------------------------------------------------------------------------------------------------ dd if=/dev/asm-disk1 of=/tmp/1_0_256.asm count=1 bs=1048576 skip=29 dd if=/dev/asm-disk2 of=/tmp/1_1_257.asm count=1 bs=1048576 skip=404 dd if=/dev/asm-disk2 of=/tmp/1_1_258.asm count=1 bs=1048576 skip=641 dd if=/dev/asm-disk1 of=/tmp/1_0_259.asm count=1 bs=1048576 skip=648 dd if=/dev/asm-disk3 of=/tmp/2_0_256.asm count=1 bs=1048576 skip=51
还原文件头
SQL> set lines 150 SQL> select 'dd of='||c.PATH_KFDSK||' if=&&backup_path/'||a.GROUP_KFFXP||'_'||a.disk_kffxp|| 2 '_'||b.NUMBER_KFFIL||'.asm count=1 conv=notrunc bs='|| d.AUSIZE_KFGRP||' seek='||a.au_kffxp restore_dd_cmd 3 FROM x$kffxp a, X$KFFIL b,X$KFDSK c,X$KFGRP d WHERE 4 a.GROUP_KFFXP=b.GROUP_KFFIL 5 and a.NUMBER_KFFXP=b.NUMBER_KFFIL 6 and b.FTYPE_KFFIL in(2,12) 7 and b.NUMBER_KFFIL>255 8 and a.xnum_kffxp=0 9 and a.GROUP_KFFXP=c.GRPNUM_KFDSK 10 and a.disk_kffxp=c.NUMBER_KFDSK 11 and a.GROUP_KFFXP=d.NUMBER_KFGRP; old 1: select 'dd of='||c.PATH_KFDSK||' if=&&backup_path/'||a.GROUP_KFFXP||'_'||a.disk_kffxp|| new 1: select 'dd of='||c.PATH_KFDSK||' if=/tmp/'||a.GROUP_KFFXP||'_'||a.disk_kffxp|| RESTORE_DD_CMD ----------------------------------------------------------------------------------------------------------------- dd of=/dev/asm-disk1 if=/tmp/1_0_256.asm count=1 conv=notrunc bs=1048576 seek=29 dd of=/dev/asm-disk2 if=/tmp/1_1_257.asm count=1 conv=notrunc bs=1048576 seek=404 dd of=/dev/asm-disk2 if=/tmp/1_1_258.asm count=1 conv=notrunc bs=1048576 seek=641 dd of=/dev/asm-disk1 if=/tmp/1_0_259.asm count=1 conv=notrunc bs=1048576 seek=648 dd of=/dev/asm-disk3 if=/tmp/2_0_256.asm count=1 conv=notrunc bs=1048576 seek=51 SQL>
备份还原文件头测试–通过测试证明该方法备份文件头是ok的
关闭数据库,使用dd备份文件头
[oracle@xifenfei ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Fri May 1 04:21:49 2015 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down.
dul查看当前dbname值为XIFENFEI
[oracle@xifenfei dul]$ ./dul Data UnLoader: 10.2.0.6.5 - Internal Only - on Fri May 1 04:37:43 2015 with 64-bit io functions Copyright (c) 1994 2015 Bernard van Duijnen All rights reserved. Strictly Oracle Internal Use Only Disk group DATA, dul group_cid 0 Discovered disk /dev/asm-disk1 as diskgroup DATA, disk number 0 size 3922 Mb File1 starts at 2, dul_disk_cid 0 Discovered disk /dev/asm-disk2 as diskgroup DATA, disk number 1 size 3922 Mb without File1 meta data, dul_disk_cid 1 Disk group XIFENFEI, dul group_cid 1 Discovered disk /dev/asm-disk3 as diskgroup XIFENFEI, disk number 0 size 4439 Mb File1 starts at 2, dul_disk_cid 2 DUL: Warning: Dictionary cache DC_ASM_EXTENTS is empty Probing for attributes in File9, the attribute directory, for disk group DATA attribute name "_extent_sizes", value "1 4 16" attribute name "_extent_counts", value "20000 20000 2147483647" Oracle data file size 775954432 bytes, block size 8192 Found db_id = 1495013434 Found db_name = XIFENFEI <-----db name DUL: Error: Filedir block not allocated, file does not exist DUL: Error: Could not load asm meta data for group XIFENFEI file 9 Probing for filenames in File6, the alias directory, for disk group XIFENFEI +XIFENFEI/XIFENFEI/DATAFILE/XIFENFEI.256.878397315 Probing for database datafiles in File1, the file directory, for disk group XIFENFEI File 256 datafile size 104865792, block size 8192 Disk group XIFENFEI has one file of type datafile
使用dd备份1文件头
[oracle@xifenfei tmp]$ dd if=/dev/asm-disk1 of=/tmp/1_0_256.asm count=1 bs=1048576 skip=29 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.0168209 seconds, 62.3 MB/s
尝试把dbname从XIFENFEI修改为ORCL
SQL> select dump('XIFENFEI',16) from dual; DUMP('XIFENFEI',16) ------------------------------------- Typ=96 Len=8: 58,49,46,45,4e,46,45,49 SQL> SELECT DUMP('ORCL',16) FROM DUAL; DUMP('ORCL',16) ------------------------- Typ=96 Len=4: 4f,52,43,4c SQL>
bbed修改XIFENFEI为ORCL
[oracle@xifenfei tmp]$ bbed filename='/tmp/1_0_256.asm' mode=edit Password: BBED: Release 2.0.0.0.0 - Limited Production on Fri May 1 04:24:06 2015 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> set blocksize 8192 BLOCKSIZE 8192 BBED> set block 1 BLOCK# 1 BBED> map File: /tmp/1_0_256.asm (0) Block: 1 Dba:0x00000000 ------------------------------------------------------------ Data File Header struct kcvfh, 860 bytes @0 ub4 tailchk @8188 BBED> p kcvfhhdr struct kcvfhhdr, 76 bytes @20 ub4 kccfhswv @20 0x00000000 ub4 kccfhcvn @24 0x0b200400 ub4 kccfhdbi @28 0x591c183a text kccfhdbn[0] @32 X text kccfhdbn[1] @33 I text kccfhdbn[2] @34 F text kccfhdbn[3] @35 E text kccfhdbn[4] @36 N text kccfhdbn[5] @37 F text kccfhdbn[6] @38 E text kccfhdbn[7] @39 I BBED> d seek 32 File: /tmp/1_0_256.asm (0) Block: 1 seeks: 32 to 63 Dba:0x00000000 ------------------------------------------------------------------------ 58494645 4e464549 12040000 00720100 00200000 01000300 00000000 00000000 <32 bytes per line>
dd把修改的block还原到asm中
[oracle@xifenfei dul]$ dd of=/dev/asm-disk1 if=/tmp/1_0_256.asm count=1 conv=notrunc bs=1048576 seek=29 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.00253244 seconds, 414 MB/s
dul验证dbname 修改为ORCL成功
[oracle@xifenfei dul]$ ./dul Data UnLoader: 10.2.0.6.5 - Internal Only - on Fri May 1 04:41:33 2015 with 64-bit io functions Copyright (c) 1994 2015 Bernard van Duijnen All rights reserved. Strictly Oracle Internal Use Only Disk group DATA, dul group_cid 0 Discovered disk /dev/asm-disk1 as diskgroup DATA, disk number 0 size 3922 Mb File1 starts at 2, dul_disk_cid 0 Discovered disk /dev/asm-disk2 as diskgroup DATA, disk number 1 size 3922 Mb without File1 meta data, dul_disk_cid 1 Disk group XIFENFEI, dul group_cid 1 Discovered disk /dev/asm-disk3 as diskgroup XIFENFEI, disk number 0 size 4439 Mb File1 starts at 2, dul_disk_cid 2 DUL: Warning: Dictionary cache DC_ASM_EXTENTS is empty Probing for attributes in File9, the attribute directory, for disk group DATA attribute name "_extent_sizes", value "1 4 16" attribute name "_extent_counts", value "20000 20000 2147483647" Oracle data file size 775954432 bytes, block size 8192 Found db_id = 1495013434 Found db_name = ORCL <----修改后的dbname DUL: Error: Filedir block not allocated, file does not exist DUL: Error: Could not load asm meta data for group XIFENFEI file 9 Probing for filenames in File6, the alias directory, for disk group XIFENFEI +XIFENFEI/XIFENFEI/DATAFILE/XIFENFEI.256.878397315 Probing for database datafiles in File1, the file directory, for disk group XIFENFEI File 256 datafile size 104865792, block size 8192 Disk group XIFENFEI has one file of type datafile
对于asm无法mount情况下备份asm disk header
asm磁盘的备份主要是备份磁盘头100M空间,使用dd命令直接备份
set lines 150 set pages 1000 select 'dd if='||path||' of=&asmbackup_dir/'||group_number||'_'||disk_number||'.asm bs=1048576 count=100' from v$asm_disk;
set lines 150 set pages 1000 select 'dd of='||path||' if=&asmbackup_dir/'||group_number||'_'||disk_number||'.asm bs=1048576 count=100 conv=notrunc' from v$asm_disk;
asmlib需要注意把ORCL:替换为/dev/oracleasm/disks/对应目录.