本文档风哥主要介绍Oracle DBVerify工具使用相关知识,包括DBVerify的概念、DBVerify的参数说明、DBVerify的使用方法、DBVerify使用配置、DBVerify使用监控、DBVerify使用故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 DBVerify的概念
Oracle DBVerify是Oracle数据库提供的一个外部命令行工具,用于验证数据文件的物理结构完整性。DBVerify可以检测数据文件中的损坏块,包括物理损坏和逻辑损坏。DBVerify不需要数据库实例运行,可以在数据库关闭状态下使用。更多视频教程www.fgedu.net.cn
- 外部工具:独立于数据库实例运行
- 物理验证:验证数据文件物理结构
- 损坏检测:检测数据文件中的损坏块
- 离线验证:可以在数据库关闭状态下使用
- 快速检查:快速验证数据文件完整性
1.2 DBVerify的参数说明
Oracle DBVerify的常用参数:
- FILE:要验证的数据文件名
- START:开始验证的块号
- END:结束验证的块号
- BLOCKSIZE:数据块大小
- LOGFILE:输出日志文件名
- FEEDBACK:显示进度反馈
- USERID:数据库用户名和密码
- SEGMENT_ID:要验证的段ID
FILE=filename
指定要验证的数据文件名
示例:FILE=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
START=block_number
指定开始验证的块号
默认值:1
示例:START=100
END=block_number
指定结束验证的块号
默认值:数据文件最后一个块
示例:END=1000
BLOCKSIZE=bytes
指定数据块大小
默认值:8192
示例:BLOCKSIZE=8192
LOGFILE=filename
指定输出日志文件名
默认值:标准输出
示例:LOGFILE=/home/oracle/dbv_system.log
FEEDBACK=n
指定显示进度反馈的间隔
默认值:0(不显示)
示例:FEEDBACK=1000
USERID=username/password
指定数据库用户名和密码(用于验证段)
示例:USERID=scott/tiger
SEGMENT_ID=tsn.segfile.segblock
指定要验证的段ID
示例:SEGMENT_ID=4.12345
1.3 DBVerify的使用方法
Oracle DBVerify的使用方法:
- 验证整个数据文件:验证数据文件的所有块
- 验证部分块:验证数据文件的指定块范围
- 验证段:验证指定的表或索引段
- 输出日志:将验证结果输出到日志文件
- 进度显示:显示验证进度
Part02-生产环境规划与建议
2.1 DBVerify使用规划
Oracle DBVerify使用规划要点:
– 验证频率:定期验证数据文件
– 验证范围:验证所有数据文件
– 验证时间:在低峰期进行验证
– 验证记录:记录验证结果
# 验证频率规划
– 每日验证:验证关键数据文件
– 每周验证:验证所有数据文件
– 每月验证:全面验证数据库
# 验证范围规划
– 系统表空间:验证SYSTEM和SYSAUX表空间
– 用户表空间:验证用户数据表空间
– Undo表空间:验证Undo表空间
– 临时表空间:验证临时表空间
# 验证时间规划
– 低峰期:在业务低峰期进行验证
– 维护窗口:在维护窗口进行验证
– 备份后:在备份后进行验证
– 迁移后:在数据迁移后进行验证
# 验证记录规划
– 记录方式:选择记录方式
– 记录格式:定义记录格式
– 记录保留:设置记录保留时间
– 记录备份:备份验证记录
2.2 DBVerify使用场景
Oracle DBVerify使用场景:
- 定期检查:定期检查数据文件完整性
- 备份验证:验证备份文件的完整性
- 故障诊断:诊断数据损坏问题
- 迁移验证:验证数据迁移后的完整性
- 存储验证:验证存储系统的可靠性
1. 定期检查
– 每周验证所有数据文件
– 每月验证数据库完整性
– 发现损坏及时修复
2. 备份验证
– 验证备份文件完整性
– 确保备份可用
– 验证恢复能力
3. 故障诊断
– 诊断数据损坏问题
– 定位损坏块位置
– 确定损坏范围
4. 迁移验证
– 验证数据迁移后完整性
– 确保数据一致
– 验证应用功能
5. 存储验证
– 验证存储系统可靠性
– 检测存储故障
– 预防数据损坏
2.3 DBVerify使用最佳实践
Oracle DBVerify使用最佳实践:
- 定期验证:定期使用DBVerify验证数据文件
- 记录结果:记录验证结果和发现的问题
- 及时处理:及时处理发现的损坏块
- 结合备份:结合备份策略使用DBVerify
- 自动化:自动化DBVerify验证过程
Part03-生产环境项目实施方案
3.1 DBVerify使用配置
3.1.1 配置DBVerify验证数据文件
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
DBVERIFY – Verification complete
Total Pages Examined : 51200
Total Pages Processed (Data) : 32768
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 8192
Total Pages Failing (Index): 0
Total Pages Processed (Other): 10240
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 2. 验证数据文件并显示进度
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf feedback=1000
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
……….
DBVERIFY – Verification complete
Total Pages Examined : 51200
Total Pages Processed (Data) : 32768
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 8192
Total Pages Failing (Index): 0
Total Pages Processed (Other): 10240
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 3. 验证数据文件的指定块范围
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf start=1 end=1000
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY – Verification complete
Total Pages Examined : 1000
Total Pages Processed (Data) : 500
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 200
Total Pages Failing (Index): 0
Total Pages Processed (Other): 300
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 4. 验证数据文件并输出到日志文件
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf logfile=/home/oracle/dbv_system.log
$ cat /home/oracle/dbv_system.log
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
DBVERIFY – Verification complete
Total Pages Examined : 51200
Total Pages Processed (Data) : 32768
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 8192
Total Pages Failing (Index): 0
Total Pages Processed (Other): 10240
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 5. 验证损坏的数据文件
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
Page 1024 is marked corrupt
Corrupt block relative dba: 0x01000400, file 4, block 1024
Completely zero block found during dbv:
DBVERIFY – Verification complete
Total Pages Examined : 12800
Total Pages Processed (Data) : 8192
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 2048
Total Pages Failing (Index): 0
Total Pages Processed (Other): 2559
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 1
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 6. 验证指定块大小的数据文件
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf blocksize=8192
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY – Verification complete
Total Pages Examined : 12800
Total Pages Processed (Data) : 8192
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 2048
Total Pages Failing (Index): 0
Total Pages Processed (Other): 2559
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 7. 验证段
$ dbv userid=scott/tiger segment_id=4.12345
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : SEGMENT_ID = 4.12345
DBVERIFY – Verification complete
Total Pages Examined : 100
Total Pages Processed (Data) : 80
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 20
Total Pages Failing (Index): 0
Total Pages Processed (Other): 0
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 8. 验证所有数据文件脚本
$ vi /home/oracle/scripts/dbv_all_datafiles.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 验证所有数据文件
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/scripts/dbv_logs”
mkdir -p $LOG_DIR
# 获取所有数据文件
sqlplus -s / as sysdba <
set heading off
set feedback off
set linesize 200
select file_name from dba_data_files;
exit
EOF
# 验证每个数据文件
while read file_name; do
file_basename=$(basename $file_name)
echo “Verifying $file_name…”
dbv file=$file_name feedback=1000 > $LOG_DIR/${file_basename}.log 2>&1
# 检查是否有损坏
if grep -q “Total Pages Marked Corrupt” $LOG_DIR/${file_basename}.log; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $LOG_DIR/${file_basename}.log | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
echo “CORRUPTION FOUND in $file_name: $corrupt_count corrupt pages”
echo “$(date): CORRUPTION FOUND in $file_name: $corrupt_count corrupt pages” >> $LOG_DIR/corruption_alert.log
fi
fi
done < /tmp/datafiles.txt
echo "DBVERIFY completed for all data files"
# 执行验证脚本
$ chmod +x /home/oracle/scripts/dbv_all_datafiles.sh
$ /home/oracle/scripts/dbv_all_datafiles.sh
3.1.2 配置DBVerify验证备份文件
$ dbv file=/backup/FGEDUDB/backup_12345.bak
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /backup/FGEDUDB/backup_12345.bak
DBVERIFY – Verification complete
Total Pages Examined : 128000
Total Pages Processed (Data) : 0
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 128000
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 0 (0.0)
# 2. 验证数据泵导出文件
$ dbv file=/backup/FGEDUDB/expdp_full.dmp
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /backup/FGEDUDB/expdp_full.dmp
DBVERIFY – Verification complete
Total Pages Examined : 25600
Total Pages Processed (Data) : 0
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 25600
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 0 (0.0)
# 3. 验证冷备份文件
$ dbv file=/backup/FGEDUDB/cold_backup/system01.dbf
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /backup/FGEDUDB/cold_backup/system01.dbf
DBVERIFY – Verification complete
Total Pages Examined : 51200
Total Pages Processed (Data) : 32768
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 8192
Total Pages Failing (Index): 0
Total Pages Processed (Other): 10240
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 4. 验证所有备份文件脚本
$ vi /home/oracle/scripts/dbv_all_backups.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 验证所有备份文件
BACKUP_DIR=”/backup/FGEDUDB”
LOG_DIR=”/home/oracle/scripts/dbv_logs”
mkdir -p $LOG_DIR
# 验证所有备份文件
for backup_file in $BACKUP_DIR/*.bak; do
file_basename=$(basename $backup_file)
echo “Verifying $backup_file…”
dbv file=$backup_file > $LOG_DIR/${file_basename}.log 2>&1
# 检查是否有损坏
if grep -q “Total Pages Marked Corrupt” $LOG_DIR/${file_basename}.log; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $LOG_DIR/${file_basename}.log | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
echo “CORRUPTION FOUND in $backup_file: $corrupt_count corrupt pages”
fi
fi
done
echo “DBVERIFY completed for all backup files”
# 执行验证脚本
$ chmod +x /home/oracle/scripts/dbv_all_backups.sh
$ /home/oracle/scripts/dbv_all_backups.sh
3.2 DBVerify使用监控
3.2.1 配置DBVerify监控脚本
$ vi /home/oracle/scripts/monitor_dbverify.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# DBVerify监控脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/scripts/dbv_logs”
mkdir -p $LOG_DIR
# 获取所有数据文件
sqlplus -s / as sysdba <
set heading off
set feedback off
set linesize 200
select file_name from dba_data_files;
exit
EOF
# 验证每个数据文件
total_corrupt=0
while read file_name; do
file_basename=$(basename $file_name)
echo “$(date): Verifying $file_name…” >> $LOG_DIR/dbv_monitor.log
dbv file=$file_name feedback=1000 > $LOG_DIR/${file_basename}.log 2>&1
# 检查是否有损坏
if grep -q “Total Pages Marked Corrupt” $LOG_DIR/${file_basename}.log; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $LOG_DIR/${file_basename}.log | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
echo “$(date): CORRUPTION FOUND in $file_name: $corrupt_count corrupt pages” >> $LOG_DIR/dbv_monitor.log
total_corrupt=$((total_corrupt + corrupt_count))
fi
fi
done < /tmp/datafiles.txt
# 汇总结果
echo "$(date): DBVERIFY completed. Total corrupt pages: $total_corrupt" >> $LOG_DIR/dbv_monitor.log
if [ “$total_corrupt” -gt 0 ]; then
# 发送告警邮件
echo “Data corruption detected. Total corrupt pages: $total_corrupt” | mail -s “DBVERIFY Alert” admin@fgedu.net.cn
fi
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/monitor_dbverify.sh
# 3. 测试脚本
$ /home/oracle/scripts/monitor_dbverify.sh
# 4. 设置定期监控
$ crontab -e
# 每周日凌晨2点验证所有数据文件
0 2 * * 0 /home/oracle/scripts/monitor_dbverify.sh >> /home/oracle/scripts/dbv_monitor.log 2>&1
3.2.2 配置DBVerify结果分析
$ vi /home/oracle/scripts/analyze_dbverify_results.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# DBVerify结果分析脚本
LOG_DIR=”/home/oracle/scripts/dbv_logs”
REPORT_FILE=”/home/oracle/scripts/dbv_report.txt”
echo “DBVerify Results Analysis Report” > $REPORT_FILE
echo “Generated: $(date)” >> $REPORT_FILE
echo “========================================” >> $REPORT_FILE
# 统计验证结果
total_files=0
total_corrupt=0
corrupt_files=””
for log_file in $LOG_DIR/*.log; do
if [ -f “$log_file” ]; then
total_files=$((total_files + 1))
if grep -q “Total Pages Marked Corrupt” $log_file; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $log_file | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
total_corrupt=$((total_corrupt + corrupt_count))
file_name=$(basename $log_file .log)
corrupt_files=”$corrupt_files\n$file_name: $corrupt_count corrupt pages”
fi
fi
fi
done
echo “” >> $REPORT_FILE
echo “Summary:” >> $REPORT_FILE
echo “——–” >> $REPORT_FILE
echo “Total files verified: $total_files” >> $REPORT_FILE
echo “Total corrupt pages: $total_corrupt” >> $REPORT_FILE
if [ “$total_corrupt” -gt 0 ]; then
echo “” >> $REPORT_FILE
echo “Corrupt Files:” >> $REPORT_FILE
echo “————–” >> $REPORT_FILE
echo -e “$corrupt_files” >> $REPORT_FILE
else
echo “” >> $REPORT_FILE
echo “No corruption detected.” >> $REPORT_FILE
fi
echo “” >> $REPORT_FILE
echo “Recommendations:” >> $REPORT_FILE
echo “—————-” >> $REPORT_FILE
if [ “$total_corrupt” -gt 0 ]; then
echo “1. Use RMAN BLOCKRECOVER to fix corrupt blocks” >> $REPORT_FILE
echo “2. Check hardware and storage systems” >> $REPORT_FILE
echo “3. Review alert log for related errors” >> $REPORT_FILE
else
echo “1. Continue regular DBVerify checks” >> $REPORT_FILE
echo “2. Maintain backup strategy” >> $REPORT_FILE
fi
# 发送报告
cat $REPORT_FILE | mail -s “DBVerify Weekly Report” admin@fgedu.net.cn
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/analyze_dbverify_results.sh
# 3. 测试脚本
$ /home/oracle/scripts/analyze_dbverify_results.sh
# 4. 查看报告
$ cat /home/oracle/scripts/dbv_report.txt
DBVerify Results Analysis Report
Generated: Tue Mar 31 10:00:00 CST 2026
========================================
Summary:
——–
Total files verified: 5
Total corrupt pages: 1
Corrupt Files:
————–
users01.dbf: 1 corrupt pages
Recommendations:
—————-
1. Use RMAN BLOCKRECOVER to fix corrupt blocks
2. Check hardware and storage systems
3. Review alert log for related errors
3.3 DBVerify使用故障处理
3.3.1 DBVerify验证损坏处理
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
Page 1024 is marked corrupt
Corrupt block relative dba: 0x01000400, file 4, block 1024
Completely zero block found during dbv:
DBVERIFY – Verification complete
Total Pages Examined : 12800
Total Pages Processed (Data) : 8192
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 2048
Total Pages Failing (Index): 0
Total Pages Processed (Other): 2559
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 1
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 分析步骤
# 1. 确认损坏块位置
# 文件号:4
# 块号:1024
# 损坏类型:ALL ZERO
# 2. 查看损坏块所属对象
SQL> select
segment_type,
owner,
segment_name
from dba_extents
where file_id = 4
and 1024 between block_id and block_id + blocks – 1;
SEGMENT_TYPE OWNER SEGMENT_NAME
————– ——- ————
TABLE SCOTT EMP
# 3. 查看备份可用性
RMAN> list backup of datafile 4;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
——- —- — ———- ———– ———— —————
123 Full 1024.00M DISK 00:05:00 2026-03-30 10:00:00
# 4. 解决方案:使用RMAN恢复损坏块
RMAN> blockrecover datafile 4 block 1024;
Starting blockrecover at 2026-03-31 10:10:00
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=150 device type=DISK
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00004
channel ORA_DISK_1: reading from backup piece /backup/FGEDUDB/backup_12345.bak
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:10
starting media recovery
media recovery complete, elapsed time: 00:00:05
Finished blockrecover at 2026-03-31 10:10:15
# 5. 验证修复结果
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY: Release 19.0.0.0.0 – Production on Tue Mar 31 10:15:00 2026
DBVERIFY – Verification starting : FILE = /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY – Verification complete
Total Pages Examined : 12800
Total Pages Processed (Data) : 8192
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 2048
Total Pages Failing (Index): 0
Total Pages Processed (Other): 2559
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 12345678 (0.12345678)
# 6. 验证数据完整性
SQL> select count(*) from scott.emp;
COUNT(*)
———-
14
3.3.2 DBVerify常见错误处理
# 原因:参数格式错误
# 解决:检查参数格式
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf blocksize=abc
DBV-00100: specified parameter invalid (blocksize)
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf blocksize=8192
DBVERIFY – Verification complete
# 2. 错误:DBV-00101: file not found
# 原因:文件不存在
# 解决:检查文件路径
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/notexist.dbf
DBV-00101: file not found (/oracle/app/oracle/oradata/FGEDUDB/notexist.dbf)
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
DBVERIFY – Verification complete
# 3. 错误:DBV-00102: file is not a database file
# 原因:文件不是数据库文件
# 解决:检查文件类型
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/control01.ctl
DBV-00102: file is not a database file
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
DBVERIFY – Verification complete
# 4. 错误:DBV-00103: block size mismatch
# 原因:块大小不匹配
# 解决:指定正确的块大小
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf blocksize=4096
DBV-00103: block size mismatch (expected 8192, found 4096)
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf blocksize=8192
DBVERIFY – Verification complete
# 5. 错误:DBV-00104: cannot open file
# 原因:文件权限不足
# 解决:检查文件权限
$ ls -l /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
-rw-r—– 1 oracle oinstall 419430400 Mar 31 10:00 /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
$ chmod 640 /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
DBVERIFY – Verification complete
Part04-生产案例与实战讲解
4.1 DBVerify使用分析案例
在生产环境中使用DBVerify的完整案例:
4.1.1 场景描述
某企业生产数据库需要定期验证数据文件完整性,使用DBVerify工具进行验证。
4.1.2 分析步骤
$ vi /home/oracle/scripts/weekly_dbverify.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 每周DBVerify验证脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
DATE=$(date +%Y%m%d)
LOG_DIR=”/home/oracle/scripts/dbv_logs/$DATE”
mkdir -p $LOG_DIR
echo “$(date): Starting weekly DBVerify check…” > $LOG_DIR/summary.log
# 获取所有数据文件
sqlplus -s / as sysdba <
set heading off
set feedback off
set linesize 200
select file_id || ‘,’ || file_name from dba_data_files order by file_id;
exit
EOF
# 验证每个数据文件
total_corrupt=0
while IFS=’,’ read -r file_id file_name; do
file_basename=$(basename $file_name)
echo “$(date): Verifying file $file_id: $file_name…” >> $LOG_DIR/summary.log
dbv file=$file_name feedback=1000 > $LOG_DIR/${file_id}_${file_basename}.log 2>&1
# 检查是否有损坏
if grep -q “Total Pages Marked Corrupt” $LOG_DIR/${file_id}_${file_basename}.log; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $LOG_DIR/${file_id}_${file_basename}.log | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
echo “$(date): CORRUPTION in file $file_id: $corrupt_count corrupt pages” >> $LOG_DIR/summary.log
total_corrupt=$((total_corrupt + corrupt_count))
else
echo “$(date): File $file_id: OK” >> $LOG_DIR/summary.log
fi
fi
done < /tmp/datafiles.txt
# 汇总结果
echo "$(date): DBVERIFY completed. Total corrupt pages: $total_corrupt" >> $LOG_DIR/summary.log
if [ “$total_corrupt” -gt 0 ]; then
# 发送告警邮件
mail -s “DBVERIFY Alert: $total_corrupt corrupt pages found” admin@fgedu.net.cn < $LOG_DIR/summary.log
else
# 发送正常报告
mail -s "DBVERIFY Weekly Report: All files OK" admin@fgedu.net.cn < $LOG_DIR/summary.log
fi
echo "$(date): Weekly DBVerify check completed." >> $LOG_DIR/summary.log
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/weekly_dbverify.sh
# 3. 测试脚本
$ /home/oracle/scripts/weekly_dbverify.sh
# 4. 查看验证结果
$ cat /home/oracle/scripts/dbv_logs/20260331/summary.log
Tue Mar 31 10:00:00 CST 2026: Starting weekly DBVerify check…
Tue Mar 31 10:00:05 CST 2026: Verifying file 1: /oracle/app/oracle/oradata/FGEDUDB/system01.dbf…
Tue Mar 31 10:00:10 CST 2026: File 1: OK
Tue Mar 31 10:00:15 CST 2026: Verifying file 2: /oracle/app/oracle/oradata/FGEDUDB/sysaux01.dbf…
Tue Mar 31 10:00:20 CST 2026: File 2: OK
Tue Mar 31 10:00:25 CST 2026: Verifying file 3: /oracle/app/oracle/oradata/FGEDUDB/undotbs01.dbf…
Tue Mar 31 10:00:30 CST 2026: File 3: OK
Tue Mar 31 10:00:35 CST 2026: Verifying file 4: /oracle/app/oracle/oradata/FGEDUDB/users01.dbf…
Tue Mar 31 10:00:40 CST 2026: File 4: OK
Tue Mar 31 10:00:45 CST 2026: DBVERIFY completed. Total corrupt pages: 0
Tue Mar 31 10:00:50 CST 2026: Weekly DBVerify check completed.
4.2 DBVerify使用故障处理
在DBVerify使用故障处理过程中的方法和技巧:
4.2.1 故障处理流程
# 1. 故障识别
# – 运行DBVerify验证
# – 检查验证结果
# – 确认损坏位置
# 2. 故障分析
# – 查看损坏块信息
# – 确定损坏对象
# – 分析损坏原因
# 3. 故障处理
# – 使用RMAN恢复损坏块
# – 使用DBMS_REPAIR修复损坏
# – 重建损坏对象
# 4. 故障预防
# – 定期验证数据文件
# – 保持备份完整
# – 监控硬件状态
# 示例:DBVerify使用故障处理
# 1. 故障识别
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
Page 1024 is marked corrupt
Corrupt block relative dba: 0x01000400, file 4, block 1024
# 2. 故障分析
SQL> select segment_type, owner, segment_name
from dba_extents
where file_id = 4 and 1024 between block_id and block_id + blocks – 1;
SEGMENT_TYPE OWNER SEGMENT_NAME
————– ——- ————
TABLE SCOTT EMP
# 3. 故障处理
RMAN> blockrecover datafile 4 block 1024;
Starting blockrecover at 2026-03-31 10:20:00
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:10
Finished blockrecover at 2026-03-31 10:20:10
# 4. 验证处理结果
$ dbv file=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
DBVERIFY – Verification complete
Total Pages Marked Corrupt : 0
4.3 DBVerify使用优化
优化DBVerify使用配置的最佳实践:
4.3.1 优化DBVerify使用管理
$ vi /home/oracle/scripts/optimize_dbverify.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# DBVerify优化管理脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/scripts/dbv_logs”
mkdir -p $LOG_DIR
# 获取数据文件信息
sqlplus -s / as sysdba <
set heading off
set feedback off
set linesize 200
select file_id || ‘,’ || file_name || ‘,’ || bytes/1024/1024 as size_mb
from dba_data_files
order by file_id;
exit
EOF
# 根据文件大小选择验证策略
while IFS=’,’ read -r file_id file_name size_mb; do
file_basename=$(basename $file_name)
if [ “$size_mb” -gt 10240 ]; then
# 大文件:分批验证
echo “$(date): Large file $file_id ($size_mb MB), verifying in batches…” >> $LOG_DIR/optimize.log
# 获取文件块数
total_blocks=$((size_mb * 1024 * 1024 / 8192))
batch_size=10000
for ((start=1; start<=total_blocks; start+=batch_size)); do end=$((start + batch_size - 1)) if [ $end -gt $total_blocks ]; then end=$total_blocks fi dbv file=$file_name start=$start end=$end feedback=1000 > $LOG_DIR/${file_id}_${start}_${end}.log 2>&1
# 检查损坏
if grep -q “Total Pages Marked Corrupt” $LOG_DIR/${file_id}_${start}_${end}.log; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $LOG_DIR/${file_id}_${start}_${end}.log | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
echo “$(date): CORRUPTION in file $file_id, blocks $start-$end: $corrupt_count corrupt pages” >> $LOG_DIR/optimize.log
fi
fi
done
else
# 小文件:完整验证
echo “$(date): Small file $file_id ($size_mb MB), verifying completely…” >> $LOG_DIR/optimize.log
dbv file=$file_name feedback=1000 > $LOG_DIR/${file_id}_${file_basename}.log 2>&1
# 检查损坏
if grep -q “Total Pages Marked Corrupt” $LOG_DIR/${file_id}_${file_basename}.log; then
corrupt_count=$(grep “Total Pages Marked Corrupt” $LOG_DIR/${file_id}_${file_basename}.log | awk ‘{print $NF}’)
if [ “$corrupt_count” -gt 0 ]; then
echo “$(date): CORRUPTION in file $file_id: $corrupt_count corrupt pages” >> $LOG_DIR/optimize.log
fi
fi
fi
done < /tmp/datafile_info.txt
echo "$(date): DBVerify optimization completed." >> $LOG_DIR/optimize.log
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/optimize_dbverify.sh
# 3. 测试脚本
$ /home/oracle/scripts/optimize_dbverify.sh
# 4. 查看优化结果
$ cat /home/oracle/scripts/dbv_logs/optimize.log
Part05-风哥经验总结与分享
5.1 DBVerify使用总结
Oracle DBVerify是验证数据文件完整性的重要工具,具有以下特点:
- 外部工具:独立于数据库实例运行
- 物理验证:验证数据文件物理结构
- 损坏检测:检测数据文件中的损坏块
- 离线验证:可以在数据库关闭状态下使用
- 快速检查:快速验证数据文件完整性
5.2 DBVerify使用检查清单
Oracle DBVerify使用检查清单:
- 验证频率:定期验证数据文件
- 验证范围:验证所有数据文件
- 验证记录:记录验证结果
- 损坏处理:及时处理发现的损坏
- 预防措施:制定预防措施
- 文档记录:记录验证过程
5.3 DBVerify使用工具推荐
Oracle DBVerify使用工具推荐:
- DBVerify:验证数据文件完整性
- RMAN:恢复损坏块
- DBMS_REPAIR:修复损坏块
- ANALYZE:验证对象结构
- SQL*Plus:执行SQL命令
- Shell脚本:自动化验证过程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
