DBVERIFY工具用来验证数据文件的物理结构。

DBVERIFY工具用来验证数据文件的物理结构。


一.DBVERIFY工具的主要目的是为了检查数据文件的物理结构,包括数据文件是否损坏,是否存在逻辑坏块,以及数据文件中包含何种类型的数据。

DBVERIFY工具可以验证ONLINE或OFFLINE的数据文件。不管数据库是否打开,都可以访问数据文件。一个最简单的访问数据文件的例子:
1.ONLINE DATAFILE :
SQL> select file_name from dba_data_files;

FILE_NAME
----------------------------------------------------------------

D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/USERS01.DBF
D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSAUX01.DBF
D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS01.DBF

C:/>dbv file=D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/USERS01.DBF

DBVERIFY: Release 10.2.0.1.0 - Production on 星期二 7月 7 10:27:33 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - 开始验证: FILE = D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/USERS01.DBF


DBVERIFY - 验证完成

检查的页总数: 2720
处理的页总数 (数据): 283
失败的页总数 (数据): 0
处理的页总数 (索引): 188
失败的页总数 (索引): 0
处理的页总数 (其它): 1960
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 289
标记为损坏的总页数: 0
流入的页总数: 0
最高块 SCN            : 2063874 (0.2063874)


可以看到,dbverify给出的结果包括数据文件包括的BLOCK数量,其中包括多少个数据块,多少个索引块,多少空块,多少个已经被标志为坏块的块,多少个坏块。

2.OFFLINE DATAFILE:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
C:/>dbv file=D:/ORACLE/PRODUCT/10.2.0/ORADAT
A/ORCL/USERS01.DBF

DBVERIFY: Release 10.2.0.1.0 - Production on 星期二 7月 7 10:29:50 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - 开始验证: FILE = D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/USERS01.DBF


DBVERIFY - 验证完成

检查的页总数: 2720
处理的页总数 (数据): 283
失败的页总数 (数据): 0
处理的页总数 (索引): 188
失败的页总数 (索引): 0
处理的页总数 (其它): 1960
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 289
标记为损坏的总页数: 0
流入的页总数: 0
最高块 SCN            : 2063874 (0.2063874)

3.对于DBVERIFY工具,高版本可以自动识别低版本数据库,比如11g的dbv访问9i的数据库:
但是低版本的dbv访问高版本会报错:


二.DBV工具还有一种在数据库打开的情况下使用的,验证指定段的用法:
SQL> SELECT TABLESPACE_ID, HEADER_FILE, HEADER_BLOCK
from sys_dba_segs
where segment_name='EMP';

TABLESPACE_ID HEADER_FILE HEADER_BLOCK
------------- ----------- ------------
            4           4          475

解释:
SQL> select file_id,file_name from dba_data_files;

   FILE_ID FILE_NAME
---------- --------------------------------------------------
         4 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/USERS01.DBF
         3 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSAUX01.DBF
         2 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/UNDOTBS01.DB
           F

         1 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSTEM01.DBF
         5 D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/EXAMPLE01.DB
           F

SQL> select TABLESPACE_ID,TABLESPACE_NAME from sys_dba_segs  where tablespace_name='USERS';

TABLESPACE_ID TABLESPACE_NAME
------------- ------------------------------
            4 USERS
            4 USERS
这种方法需要查询表空间ID、段头所在的数据文件ID和以及段头所在表空间ID,要获取这个信息可以通过SYS用户查询SYS_DBA_SEGS视图。需要注意的是,Oracle文档给出的SYS_USER_SEGS视图只能查询SYS用户的段,要查询普通用户的段信息,需要访问SYS_DBA_SEGS。

C:/Documents and Settings/Administrator>dbv userid=scott/tiger segment_id=4.4.475

DBVERIFY: Release 10.2.0.1.0 - Production on 星期日 7月 5 17:24:26 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - 开始验证: SEGMENT_ID = 4.4.475


DBVERIFY - 验证完成

检查的页总数: 8
处理的页总数 (数据): 1
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 2
处理的总页数 (段)  : 1
失败的总页数 (段)  : 0
空的页总数: 4
标记为损坏的总页数: 0
流入的页总数: 0
最高块 SCN            : 2062262 (0.2062262)
这种方式要求数据库处于打开的状态。


三.由于dbv可以在实例关闭情况下验证数据文件,因此dbv也可以验证数据文件的拷贝。
这个拷贝指的是通过RMAN的COPY命令或者操作系统命令cp拷贝的数据文件,而不是RMAN生成的备份集格式

C:/>rman target  /
RMAN> run {
copy datafile 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/USERS01.DBF' to 'c:/user
bak.dbf';
}

C:>dbv file=c:/userbak.dbf blocksize=8192

DBVERIFY: Release 10.2.0.1.0 - Production on 星期日 7月 5 17:32:22 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - 开始验证: FILE = c:/userbak.dbf


DBVERIFY - 验证完成

检查的页总数: 2720
处理的页总数 (数据): 283
失败的页总数 (数据): 0
处理的页总数 (索引): 188
失败的页总数 (索引): 0
处理的页总数 (其它): 1960
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 289
标记为损坏的总页数: 0
流入的页总数: 0
最高块 SCN            : 2063874 (0.2063874)

四.利用RMAN的BACKUP VALIDATE DATABASE;命令检查全库,此命令不产生任何备份集
我们可以通过Validate命令来检查是否能备份,如数据文件是否存在,是否存在坏块不能被备份,如:
BACKUP VALIDATE DATABASE;
BACKUP VALIDATE DATABASE ARCHIVELOG ALL
检查结果,查询v$database_block_corruption,如果有坏快此视图会显示;

SQL> select * from v$database_block_corruption;

no rows selected

五.如有坏块,用下面的SQL查找所有坏块的影响范围,确定坏块中影响的是表还是索引和UNDO段。

Select owner,segment_name,segment_type from dba_extents where file_id=<F> and <B> between block_id and block_id+blocks-1;
(<F>和<B>分别是ORA-01578报出的坏块出现的文件号和块号)

以下是利用RMAN的BLOCKRECOVER恢复

rman target /

Recovery Manager: Release 9.2.0.8.0 - 64bit Production

Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

connected to target database: BOSSCRM1 (DBID=3925805135)

RMAN>run{
allocate channel c1 device type sbt parms 'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
blockrecover datafile 423 block  187971 ;
release channel c1;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值