分享

Oracle:blockrecover修复数据库中的坏块

 wghbeyond 2012-04-09

    1.备份数据库

    D:>rman target /
    
    恢复管理器: 版本9.2.0.6.0 - Production
    
    Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
    
    连接到目标数据库: EYGLE (DBID=1365961916)
    
    RMAN> backup database format='d:oradataeygle_fullbk.bak' tag='eygle';
    
    启动 backup 于 12-6月 -05
    正在使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: sid=13 devtype=DISK
    通道 ORA_DISK_1: 正在启动 full 数据文件备份集
    通道 ORA_DISK_1: 正在指定备份集中的数据文件
    在备份集中包含当前的 SPFILE
    备份集中包括当前控制文件
    输入数据文件 fno=00001 name=D:ORADATAEYGLESYSTEM01.DBF
    输入数据文件 fno=00005 name=D:ORADATAEYGLEUNDOTBS2.DBF
    输入数据文件 fno=00002 name=D:ORADATAEYGLEEYGLE01.DBF
    通道 ORA_DISK_1: 正在启动段 1 于 12-6月 -05
    通道 ORA_DISK_1: 已完成段 1 于 12-6月 -05
    段 handle=D:ORADATAEYGLE_FULLBK.BAK comment=NONE
    通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
    完成 backup 于 12-6月 -05
    
    RMAN> list backup;
    
    
    备份集列表
    ===================
    
    BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
    ------- ---- -- ---------- ----------- ------------ ----------
    2       Full    140M       DISK        00:00:22     12-6月 -05
    BP 关键字: 1   状态: AVAILABLE   标记:TAG20050612T004442
    段名:D:ORADATAEYGLE_FULL.BAK
      包含的 SPFILE: 修改时间: 04-3月 -05
      备份集 2 中的数据文件列表
      文件 LV 类型 Ckp SCN    Ckp 时间   名称
      ---- -- ---- ---------- ---------- ----
      1       Full 452236     12-6月 -05 D:ORADATAEYGLESYSTEM01.DBF
      2       Full 452236     12-6月 -05 D:ORADATAEYGLEEYGLE01.DBF
      5       Full 452236     12-6月 -05 D:ORADATAEYGLEUNDOTBS2.DBF
    
    BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
    ------- ---- -- ---------- ----------- ------------ ----------
    4       Full    140M       DISK        00:00:21     12-6月 -05
    BP 关键字: 2   状态: AVAILABLE   标记:EYGLE
    段名:D:ORADATAEYGLE_FULLBK.BAK
      包含的 SPFILE: 修改时间: 04-3月 -05
      备份集 4 中的数据文件列表
      文件 LV 类型 Ckp SCN    Ckp 时间   名称
      ---- -- ---- ---------- ---------- ----
      1       Full 492975     12-6月 -05 D:ORADATAEYGLESYSTEM01.DBF
      2       Full 492975     12-6月 -05 D:ORADATAEYGLEEYGLE01.DBF
      5       Full 492975     12-6月 -05 D:ORADATAEYGLEUNDOTBS2.DBF
    
    RMAN> exit
    
    
    恢复管理器完成。
    

    2.使用工具破坏数据块
    可以使用UltraEdit或者WinHex打开文件修改某个数据块,然后保存。
    3.访问损坏的数据
    D:>sqlplus "/ as sysdba"
    
    SQL*Plus: Release 9.2.0.6.0 - Production on 星期日 6月 12 09:06:19 2005
    
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    
    已连接到空闲例程。
    
    09:06:19 SQL> startup
    ORACLE 例程已经启动。
    
    Total System Global Area   59842188 bytes
    Fixed Size                   454284 bytes
    Variable Size              33554432 bytes
    Database Buffers           25165824 bytes
    Redo Buffers                 667648 bytes
    数据库装载完毕。
    数据库已经打开。
    09:06:33 SQL> select count(*)from t;
    select count(*)from t
                        *
    ERROR 位于第 1 行:
    ORA-01578: ORACLE 数据块损坏(文件号2,块号14)
    ORA-01110: 数据文件 2: 'D:ORADATAEYGLEEYGLE01.DBF'
    

    此时alert_.log文件中会记录损坏块。
    ***
    Corrupt block relative dba: 0x0080000e (file 2, block 14)
    Bad check value found during buffer read
    Data in bad block -
     type: 6 format: 2 rdba: 0x0080000e
     last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
     consistency value in tail: 0x85840601
     check value in block header: 0xca4b, computed block checksum: 0x5a6
     spare1: 0x0, spare2: 0x0, spare3: 0x0
    ***
    Reread of rdba: 0x0080000e (file 2, block 14) found same corrupted data
    

    4.检查坏块
    也可以使用RMAN验证数据文件,以发现坏块:
    D:>rman target /
    
    恢复管理器: 版本9.2.0.6.0 - Production
    
    Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
    
    连接到目标数据库: EYGLE (DBID=1365961916)
    
    RMAN> backup validate datafile 2;
    
    启动 backup 于 12-6月 -05
    正在使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: sid=13 devtype=DISK
    通道 ORA_DISK_1: 正在启动 full 数据文件备份集
    通道 ORA_DISK_1: 正在指定备份集中的数据文件
    输入数据文件 fno=00002 name=D:ORADATAEYGLEEYGLE01.DBF
    通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
    完成 backup 于 12-6月 -05
    
    RMAN> exit
    
    
    恢复管理器完成。
    

    此时alert_.log文件中会记录RMAN发现的坏块信息:
    ***
    Corrupt block relative dba: 0x0080000e (file 2, block 14)
    Bad check value found during backing up datafile
    Data in bad block -
     type: 6 format: 2 rdba: 0x0080000e
     last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
     consistency value in tail: 0x85840601
     check value in block header: 0xca4b, computed block checksum: 0x5a6
     spare1: 0x0, spare2: 0x0, spare3: 0x0
    ***
    Reread of blocknum=14, file=D:ORADATAEYGLEEYGLE01.DBF. found same corrupt data
    

    5.查询RMAN发现的坏块信息
    09:08:25 SQL> select * from v$database_block_corruption where file#=2;
    
         FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
    ---------- ---------- ---------- ------------------ ---------
             2         14          1                  0 FRACTURED
    
    已用时间:  00: 00: 00.00
    

    6.执行恢复
    D:>rman target /
    
    恢复管理器: 版本9.2.0.6.0 - Production
    
    Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
    
    已连接到目标数据库 (未启动)
    
    RMAN> startup mount;
    
    Oracle 例程已启动
    数据库已加载
    
    系统全局区域总计      59842188 字节
    
    Fixed Size                      454284 字节
    Variable Size                 33554432 字节
    Database Buffers              25165824 字节
    Redo Buffers                    667648 字节
    
    RMAN> blockrecover datafile 2 block 14 from backupset;
    
    启动 blockrecover 于 12-6月 -05
    正在使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: sid=11 devtype=DISK
    
    
    通道 ORA_DISK_1: 正在恢复块
    通道 ORA_DISK_1: 正在指定要从备份集恢复的块
    正在恢复数据文件 00002 的块
    通道 ORA_DISK_1: 已从备份段 1 恢复块
    段 handle=D:ORADATAEYGLE_FULLBK.BAK tag=EYGLE params=NULL
    通道 ORA_DISK_1: 块恢复已完成
    
    正在开始介质的恢复
    完成介质的恢复
    
    完成 blockrecover 于 12-6月 -05
    

    7.检查数据的恢复
    D:>sqlplus "/ as sysdba"
    
    SQL*Plus: Release 9.2.0.6.0 - Production on 星期日 6月 12 09:10:55 2005
    
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    
    
    连接到:
    Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.6.0 - Production
    
    09:10:55 SQL> alter database open;
    
    数据库已更改。
    
    已用时间:  00: 00: 07.01
    09:11:08 SQL> select * from v$database_block_corruption where file#=2;
    
         FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
    ---------- ---------- ---------- ------------------ ---------
             2         14          1                  0 FRACTURED
    
    已用时间:  00: 00: 00.01
    09:11:12 SQL> select count(*) from t;
    
      COUNT(*)
    ----------
           896
    
    已用时间:  00: 00: 00.00
    
    

    此时数据已经恢复,但是block corruption信息仍然记录在数据库中,直到下次validate才会清除这部分信息:
    D:>rman target /
    
    恢复管理器: 版本9.2.0.6.0 - Production
    
    Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
    
    连接到目标数据库: EYGLE (DBID=1365961916)
    
    RMAN> backup validate datafile 2;
    
    启动 backup 于 12-6月 -05
    正在使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: sid=9 devtype=DISK
    通道 ORA_DISK_1: 正在启动 full 数据文件备份集
    通道 ORA_DISK_1: 正在指定备份集中的数据文件
    输入数据文件 fno=00002 name=D:ORADATAEYGLEEYGLE01.DBF
    通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
    完成 backup 于 12-6月 -05
    
    RMAN>
    

    此时从数据库中查询,坏块信息被清除。
    09:11:22 SQL> select * from v$database_block_corruption where file#=2;
    
    未选定行
    
    已用时间:  00: 00: 00.00
    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多