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= and between block_id and block_id+blocks-1;
(和分别是ORA-01578报出的坏块出现的文件号和块号)
以下是利用RMAN的BLOCKRECOFER恢复
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;
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22779291/viewspace-667560/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22779291/viewspace-667560/