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;
}
 

你可能感兴趣的:(block)