IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Oracle异常恢复前备份保护现场建议—ASM环境

    惜分飞发表于 2015-05-15 03:13:59
    love 0

    联系:手机(13429648788) QQ(107644445)

    链接:http://www.xifenfei.com/5888.html

    标题:Oracle异常恢复前备份保护现场建议—ASM环境

    作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]

    在上一篇中写道了文件系统的库,在进行异常恢复前的备份方法(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/对应目录.

    • 使用dd复制asm中文件
    • kfed恢复误删除磁盘组
    • Oracle异常恢复前备份保护现场建议—FileSystem环境
    • bbed修改ASM中数据
    • 密码保护:dul抽取异常asm文件
    • asm备份元数据之md_backup和md_restore
    • 密码保护:使用dul恢复asm中数据
    • dd操作数据文件


沪ICP备19023445号-2号
友情链接