如何使用 RMAN 识别数据库中损坏的对象(2)

Corrupt block relative dba: 0x01000009 (file 4, block 9)
 Bad check value found during validation
 Data in bad block:
  type: 16 format: 2 rdba: 0x01000009
  last change scn: 0x0000.00000000 seq: 0xff flg: 0x04
  spare1: 0x0 spare2: 0x0 spare3: 0x0
  consistency value in tail: 0x000010ff
  check value in block header: 0xb4e0
  computed block checksum: 0xa800
 Reread of blocknum=9, file=/oracle/dbs/users.dbf found same corrupt data
•检查单独一个数据文件或者特定的数据文件,使用命令"check logical validate datafile 1, 2"。
• 监控 VALIDATE 命令运行的进度,请运行下面的查询:


select sid, serial#, context, sofar, totalwork,round(sofar/totalwork*100,2) "%_complete"
 from v$session_longops
 where opname like 'RMAN%'
  and opname not like '%aggregate%'
  and totalwork != 0
  and sofar <> totalwork;
• 10g 或者之前版本的 NOARCHIVELOG 数据库,数据库必须在 MOUNT 状态下运行 VALIDATE 命令,否则报 ORA-19602,如果不能关闭数据库,使用 dbverify 代替 RMAN。这个限制在 11g 取消。
•11g或者更高版本:可以使用 section 子句并行校验一个单独的数据文件。
 RMAN 将数据文件分割为多个部分,并行处理每个部分。下面的例子中数据文件 5 被分割为 1gb 大小的部分,如果配置或者分配了多个通道,那么 RMAN 会并行校验每个部分。(参考: The Oracle Database Backup and Recovery User's Guide for more information):


backup validate check logical datafile 5 SECTION SIZE 1024M;
• 11g 或者更高版本可以使用 BLOCK TO 子句检查一定范围内的数据块。下面命令检查数据文件 1 中的数据块 5 到 20:

validate check logical datafile 1 BLOCK 5 TO 20;
•在 8i 版本中,如果 RMAN validate 命令检查发现坏块,那么只会记录在 alert 日志中。用户必须在alert日志中查看 validate 命令运行时间范围内的日志。坏块信息不会返回到 RMAN 接口。在 9i 及以上版本中,如果 RMAN validate 命令检查发现坏块,那么坏块信息可以通过查询视图 V$DATABASE_BLOCK_CORRUPTION 得到。
• 每次运行 RMAN backup validate 命令,视图 V$DATABASE_BLOCK_CORRUPTION 中坏块信息都会被更新。了解视图内容,参见 Oracle? Database Reference 文档。

步骤2:识别损坏的段

下面的查询可以将视图 v$database_block_corruption 中记录的坏块匹配到对应的段或者是空闲块。

$ sqlplus / as sysdba 

set pagesize 2000
 set linesize 250
SELECT e.owner, e.segment_type, e.segment_name, e.partition_name, c.file#
      , greatest(e.block_id, c.block#) corr_start_block#
      , least(e.block_id+e.blocks-1, c.block#+c.blocks-1) corr_end_block#
      , least(e.block_id+e.blocks-1, c.block#+c.blocks-1)
        - greatest(e.block_id, c.block#) + 1 blocks_corrupted
      , null description
  FROM dba_extents e, v$database_block_corruption c
  WHERE e.file_id = c.file#
    AND e.block_id <= c.block# + c.blocks - 1
    AND e.block_id + e.blocks - 1 >= c.block#
 UNION
 SELECT s.owner, s.segment_type, s.segment_name, s.partition_name, c.file#
      , header_block corr_start_block#
      , header_block corr_end_block#
      , 1 blocks_corrupted
      , 'Segment Header' description
  FROM dba_segments s, v$database_block_corruption c
  WHERE s.header_file = c.file#
    AND s.header_block between c.block# and c.block# + c.blocks - 1
 UNION
 SELECT null owner, null segment_type, null segment_name, null partition_name, c.file#
      , greatest(f.block_id, c.block#) corr_start_block#
      , least(f.block_id+f.blocks-1, c.block#+c.blocks-1) corr_end_block#
      , least(f.block_id+f.blocks-1, c.block#+c.blocks-1)
        - greatest(f.block_id, c.block#) + 1 blocks_corrupted
      , 'Free Block' description
  FROM dba_free_space f, v$database_block_corruption c
  WHERE f.file_id = c.file#
    AND f.block_id <= c.block# + c.blocks - 1
    AND f.block_id + f.blocks - 1 >= c.block#
 order by file#, corr_start_block#; 

输出例子: 

OWNER SEGMENT_TYPE      SEGMENT_NAME PARTITION_ FILE# CORR_START_BLOCK# CORR_END_BLOCK# BLOCKS_CORRUPTED DESCRIPTION
 ----- ------------------ ------------ ---------- ----- ----------------- --------------- ---------------- -------------
 SCOTT TABLE              EMP                        6                10              10                1
 SCOTT TABLE PARTITION    ORDER        ORDER_JAN      6                26              28                3
                                                      6                29              29                1 Free Block
 SCOTT TABLE              BONUS                      6                34              34                1
                                                      6                35              35                1 Free Block
 SCOTT TABLE              DEPT                        6                42              42                1 Segment Header
 SCOTT TABLE              INVOICE                    6                50              50                1
 
注意:
•如果坏块出现在字典管理的表空间,并且段头块损坏,上面的查询可能显示同一个块 2 次。
• 如果 ASSM 表空间的段头块损坏,那么上面的查询会显示该段头块,但是相同对象上的其他坏块可能就不会再显示。

--------------------------------------推荐阅读 --------------------------------------

RMAN 配置归档日志删除策略

Oracle基础教程之通过RMAN复制数据库

RMAN备份策略制定参考内容

RMAN备份学习笔记

Oracle数据库备份加密 RMAN加密

--------------------------------------分割线 --------------------------------------

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a6155aa6b4c49e959747101de57e770c.html