目录
一、与块损坏的相关特性(几种检查工具)
----------------------------------------------------- 特性 坏块侦测类型 能否修复损坏块 ----------------------------------------------------- DBVERIFY 物理 否 ANALYZE 逻辑 否 DB_BLOCK_CHECKING 逻辑 否 DB_BLOCK_CHECKSUM 物理 否 exp 物理 否 FlashBack 逻辑 是 DBMS_REPAIR 逻辑 是 Block media recovery 未知 是 rman blcokrecover 未知 是
二、关于DBVERIFY 工具的介绍
DBVERIFY 是 Oracle 数据库提供的一个工具,用于验证和诊断数据库中的数据文件的完整性。
它可以帮助检测和诊断坏块、损坏的数据文件以及其他数据文件中的潜在问题。
1、关于 DBVERIFY 的主要特点和用途:
(1)坏块检测:
DBVERIFY 可以扫描和检测数据文件中的坏块。坏块是物理数据块在磁盘上发生损坏或错误的情况。DBVERIFY 会通过读取和分析数据文件中的数据,发现并报告出现的坏块。
(2)数据一致性验证:
DBVERIFY 可以验证数据文件的逻辑和结构完整性,以确保数据在存储中的正确性。它可以识别和报告文件中可能存在的逻辑错误或损坏。
(3)数据文件完整性检查:
DBVERIFY 可以检查数据文件和逻辑结构之间的一致性,以确保数据文件的完整性。它检查数据文件头、段、区块和其他结构,以发现任何异常或问题。
(4)定位坏块和损坏数据段:
DBVERIFY 可以确定和报告数据文件中坏块的位置,帮助管理员更精确地定位和诊断问题。它还可以标识数据段中的损坏,以便进行进一步的修复或纠正操作。
(5)工具的使用:
DBVERIFY 是一个命令行工具,使用时需要在操作系统的命令提示符下执行相应的命令。它可以针对指定的数据文件或整个表空间执行验证操作。
DBVERIFY 是一项有力的工具,可以帮助数据库管理员及时发现和处理数据库中的坏块和数据文件问题。它可以作为数据库维护和数据完整性保障的一部分,并且常被用于备份和恢复操作之前的数据验证工作。
2、特性
--是一个运行于操作系统提示符下的外部程序,用于验证数据文件,检查块的一致性错误 --仅仅针对数据文件,能够校验open阶段的数据文件以及shutdown状态下的数据文件 --可以验证复制的数据文件,也可以验证备份的镜像副本 --不支持联机日志文件,控制文件,归档日志,RMAN备份集验证 --被验证的文件可以位于文件系统,ASM磁盘或原始设备 --在Unix系统中位于:$ORACLE_HOME/bin/dbv --在Windows系统中位于:%ORACLE_HOME%/bin/dbv.exe --对于DBVERIFY工具,高版本可以自动识别低版本数据库,比如11g的dbv访问9i的数据库,但是低版本的dbv访问高版本会报错。
三、DBVERIFY工具展示
1、损坏的数据块的错误提示
可以从告警日志文件中找到该错误提示,以及在会话中发现损坏的数据块时也会给出类似的提示
ORA-01578: ORACLE data block corrupted (file # 6, block # 11) ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
2、帮助信息
[oracle@qdmes219:/oracle]$dbv DBVERIFY: Release 11.2.0.4.0 - Production on Wed Dec 6 11:19:55 2023 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Keyword Description (Default) ---------------------------------------------------- FILE File to Verify (NONE) START Start Block (First Block of File) END End Block (Last Block of File) BLOCKSIZE Logical Block Size (8192) --(8192)--指定数据文件的尺寸,缺省值为8192,对于非8192块将收到DBV-00103错误 LOGFILE Output Log (NONE) ----用于显示验证进度 FEEDBACK Display Progress (0) PARFILE Parameter File (NONE) --可以指定参数文件 USERID Username/Password (NONE) SEGMENT_ID Segment ID (tsn.relfile.block) (NONE) ----校验段、ASM文件需要使用 HIGH_SCN Highest Block SCN To Verify (NONE) (scn_wrap.scn_base OR scn)
3、校验online,offline数据文件
(1)online/offline数据文件校验
[oracle@qdmes219:/oracle/oradata]$dbv file=test001.dbf DBVERIFY: Release 11.2.0.4.0 - Production on Wed Dec 6 16:22:23 2023 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. DBVERIFY - Verification starting : FILE = /oracle/oradata/test001.dbf DBVERIFY - Verification complete Total Pages Examined : 1280 --校验的总页面数,一个页面即是一个数据块 Total Pages Processed (Data) : 5 --已处理的数据页面数 Total Pages Failing (Data) : 0 --已处理数据页面的失败数 Total Pages Processed (Index): 0 --已处理的索引页面数 Total Pages Failing (Index): 0 --已处理索引页面失败数 Total Pages Processed (Other): 130 --已处理的其它页面数 Total Pages Processed (Seg) : 0 Total Pages Failing (Seg) : 0 Total Pages Empty : 1145 Total Pages Marked Corrupt : 0 Total Pages Influx : 0 --注意:如果Total Pages Influx的值大于零,且未存在坏块的情况下, 是由于针对open状态的文件运行dbv程序遇到了一个当前正在被DBWn进程写入的数据块 Total Pages Encrypted : 0 Highest block SCN : 12969210 (0.12969210)
(2)显示feedback参数
[oracle@qdmes219:/oracle/oradata]$dbv file=test001.dbf feedback=100 --上面这句在执行时每验证100个块将显示一个"."号,下面一共是1280块,所以有13个"."。 DBVERIFY - Verification starting : FILE = /oracle/oradata/test001.dbf ............. DBVERIFY - Verification complete Total Pages Examined : 1280 Total Pages Processed (Data) : 5 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 0 Total Pages Failing (Index): 0 Total Pages Processed (Other): 130 Total Pages Processed (Seg) : 0 Total Pages Failing (Seg) : 0 Total Pages Empty : 1145 Total Pages Marked Corrupt : 0 Total Pages Influx : 0 Total Pages Encrypted : 0 Highest block SCN : 12969210 (0.12969210)
四、破坏数据展示1-只破坏数据文件开头的1m数据块
1、破坏数据文件
[oracle@qdmes219:/oracle/oradata]$dd if=/dev/zero of=test003.dbf bs=1m count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.00154571 s, 678 MB/s
2、重启数据库报错提示:
08:43:50 SYS@mesorcl>shutdown abort; ORACLE instance shut down. 08:43:54 SYS@mesorcl>startup ORACLE instance started. Total System Global Area 4943876096 bytes Fixed Size 2261688 bytes Variable Size 989859144 bytes Database Buffers 3942645760 bytes Redo Buffers 9109504 bytes Database mounted. ORA-01157: cannot identify/lock data file 9 - see DBWR trace file ORA-01110: data file 9: '/oracle/oradata/test003.dbf'
3、修复数据块(使用RMAN修复)
(1)如果使用restore datafile是不可以的,因为他判定datafile 9是存在的
如果把test003.dbf删除后,重新还原是ok的。但此处只是文件块出现了数据不一致,所以直接进行修复即可
RMAN> restore datafile 9; Starting restore at 2023-12-07 08:45:23 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=189 device type=DISK creating datafile file number=9 name=/oracle/oradata/test003.dbf restore not done; all files read only, offline, or already restored Finished restore at 2023-12-07 08:45:24
(2)dbv检查数据文件
[oracle@qdmes219:/oracle/oradata]$dbv file=/oracle/oradata/test003.dbf DBVERIFY: Release 11.2.0.4.0 - Production on Thu Dec 7 08:49:31 2023 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. DBVERIFY - Verification starting : FILE = /oracle/oradata/test003.dbf DBVERIFY - Verification complete Total Pages Examined : 1280 Total Pages Processed (Data) : 0 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 0 Total Pages Failing (Index): 0 Total Pages Processed (Other): 1 Total Pages Processed (Seg) : 0 Total Pages Failing (Seg) : 0 Total Pages Empty : 1279 Total Pages Marked Corrupt : 0 Total Pages Influx : 0 Total Pages Encrypted : 0 Highest block SCN : 0 (0.0)
(3)查看块错误(数据文件头如果出现错误,而不是某个块出现错误,可能无法正常查出来)
select * from v$database_block_corruption;
(4)直接修复错误块
因为我们用dd破坏的是操作系统文件test003.dbf的第一个块开始的1m存储,一个块是8192k=8m,所以破坏的不足1个快,我们在Oracle中修复时,直接修复第一个块(8192k)就ok。
RMAN> blockrecover datafile 9 block 1; Starting recover at 2023-12-07 08:55:17 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=189 device type=DISK starting media recovery media recovery complete, elapsed time: 00:00:00 Finished recover at 2023-12-07 08:55:17 RMAN> restore datafile 9; RMAN> recover datafile 9; Starting recover at 2023-12-07 08:55:24 using channel ORA_DISK_1 starting media recovery media recovery complete, elapsed time: 00:00:01 Finished recover at 2023-12-07 08:55:25 RMAN> alter database open;
database opened.
五、破坏数据展示2-只破坏数据文件开头的10m数据块(2个数据块)
[oracle@qdmes219:/oracle/oradata]$dd if=/dev/zero of=test003.dbf bs=1m count=10
其实是和四一样的,因为最后借助于rman恢复的数据。
如果我们破坏的数据块,不是数据文件的第一个块,而是内部的某个数据块的,那么报错的时候如下:
ORA-01578: ORACLE data block corrupted (file # 6, block # 11)
ORA-01110: data file 6: '/oracle/oradata/test001.dbf'
因为数据文件test001.dbf的第一个块的信息是存在的,和Oracle的控制文件一致,所以数据库可以检测到这个文件里面某个块有问题。
如果我们通过dd破坏掉第一个块,那么Oracle直接就不识别这个文件,也就无法检测这个数据文件内部某个块的报错情况。