本文档风哥主要介绍Oracle RMAN损坏检查相关知识,包括RMAN损坏检查的概念、RMAN损坏检查方法、RMAN损坏检查使用、RMAN损坏检查配置、RMAN损坏检查监控、RMAN损坏检查故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 RMAN损坏检查的概念
Oracle RMAN损坏检查是使用RMAN工具检测数据库中数据块损坏的过程。RMAN提供了VALIDATE命令来检查数据文件、控制文件、归档日志和备份集的完整性。RMAN损坏检查可以发现物理损坏和逻辑损坏,是数据库健康检查的重要组成部分。更多视频教程www.fgedu.net.cn
- 全面检查:检查数据文件、控制文件、归档日志
- 备份验证:验证备份集的完整性
- 损坏记录:记录损坏块信息到V$DATABASE_BLOCK_CORRUPTION
- 在线检查:数据库可以保持运行状态
- 快速检查:快速检测数据块损坏
1.2 RMAN损坏检查方法
Oracle RMAN损坏检查方法:
- VALIDATE DATABASE:验证整个数据库
- VALIDATE DATAFILE:验证指定数据文件
- VALIDATE TABLESPACE:验证指定表空间
- VALIDATE BACKUPSET:验证指定备份集
- VALIDATE ARCHIVELOG:验证归档日志
- VALIDATE CONTROLFILECOPY:验证控制文件副本
VALIDATE DATABASE
验证整个数据库
示例:VALIDATE DATABASE;
VALIDATE DATAFILE file#
验证指定数据文件
示例:VALIDATE DATAFILE 1;
VALIDATE DATAFILE file# BLOCK block# TO block#
验证数据文件的指定块范围
示例:VALIDATE DATAFILE 4 BLOCK 1000 TO 2000;
VALIDATE TABLESPACE tablespace_name
验证指定表空间
示例:VALIDATE TABLESPACE users;
VALIDATE BACKUPSET backupset_key
验证指定备份集
示例:VALIDATE BACKUPSET 12345;
VALIDATE ARCHIVELOG sequence#
验证指定归档日志
示例:VALIDATE ARCHIVELOG SEQUENCE 12345;
VALIDATE CONTROLFILECOPY ‘filename’
验证控制文件副本
示例:VALIDATE CONTROLFILECOPY ‘/backup/control01.ctl’;
VALIDATE SPFILE
验证SPFILE
示例:VALIDATE SPFILE;
VALIDATE RECOVERY AREA
验证恢复区
示例:VALIDATE RECOVERY AREA;
VALIDATE CHECK LOGICAL
验证并检查逻辑损坏
示例:VALIDATE DATABASE CHECK LOGICAL;
1.3 RMAN损坏检查使用
Oracle RMAN损坏检查使用:
- 定期检查:定期检查数据库完整性
- 备份验证:验证备份的可用性
- 故障诊断:诊断数据损坏问题
- 迁移验证:验证数据迁移后完整性
- 健康检查:数据库健康检查
Part02-生产环境规划与建议
2.1 RMAN损坏检查规划
Oracle RMAN损坏检查规划要点:
– 检查频率:定期进行RMAN损坏检查
– 检查范围:检查所有数据文件和备份
– 检查时间:在低峰期进行检查
– 检查记录:记录检查结果
# 检查频率规划
– 每日检查:检查关键数据文件
– 每周检查:检查所有数据文件
– 每月检查:检查所有备份集
# 检查范围规划
– 数据文件:检查所有数据文件
– 控制文件:检查控制文件
– 归档日志:检查归档日志
– 备份集:检查备份集完整性
# 检查时间规划
– 低峰期:在业务低峰期进行检查
– 维护窗口:在维护窗口进行检查
– 备份后:在备份后进行检查
– 迁移后:在数据迁移后进行检查
# 检查记录规划
– 记录方式:选择记录方式
– 记录格式:定义记录格式
– 记录保留:设置记录保留时间
– 记录备份:备份检查记录
2.2 RMAN损坏检查场景
Oracle RMAN损坏检查场景:
- 定期检查:定期检查数据库完整性
- 备份验证:验证备份的可用性
- 故障诊断:诊断数据损坏问题
- 迁移验证:验证数据迁移后完整性
- 恢复验证:验证恢复后数据完整性
1. 定期检查
– 每周检查所有数据文件
– 每月检查所有备份集
– 发现损坏及时修复
2. 备份验证
– 验证备份集完整性
– 确保备份可用
– 验证恢复能力
3. 故障诊断
– 诊断数据损坏问题
– 定位损坏块位置
– 确定损坏范围
4. 迁移验证
– 验证数据迁移后完整性
– 确保数据一致
– 验证应用功能
5. 恢复验证
– 验证恢复后数据完整性
– 确保数据一致
– 验证应用功能
2.3 RMAN损坏检查最佳实践
Oracle RMAN损坏检查最佳实践:
- 定期检查:定期进行RMAN损坏检查
- 记录结果:记录检查结果和发现的问题
- 及时处理:及时处理发现的损坏
- 结合备份:结合备份策略进行检查
- 自动化:自动化检查过程
Part03-生产环境项目实施方案
3.1 RMAN损坏检查配置
3.1.1 配置RMAN数据库验证
RMAN> validate database;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00001 name=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
input datafile file number=00002 name=/oracle/app/oracle/oradata/FGEDUDB/sysaux01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/FGEDUDB/undotbs01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:30
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
1 OK 0 10240 51200 12345678
File Name: /oracle/app/oracle/oradata/FGEDUDB/system01.dbf
Block Type Blocks Failing Blocks Processed
———- ————– —————-
Data 0 32768
Index 0 8192
Other 0 10240
2 OK 0 8192 40960 12345678
File Name: /oracle/app/oracle/oradata/FGEDUDB/sysaux01.dbf
Block Type Blocks Failing Blocks Processed
———- ————– —————-
Data 0 20480
Index 0 12288
Other 0 20480
3 OK 0 2048 25600 12345678
File Name: /oracle/app/oracle/oradata/FGEDUDB/undotbs01.dbf
Block Type Blocks Failing Blocks Processed
———- ————– —————-
Data 0 20480
Index 0 0
Other 0 5120
4 OK 0 2559 12800 12345678
File Name: /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
Block Type Blocks Failing Blocks Processed
———- ————– —————-
Data 0 8192
Index 0 2048
Other 0 2559
Finished validate at 2026-03-31 10:00:30
# 2. 验证数据库并检查逻辑损坏
RMAN> validate database check logical;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00001 name=/oracle/app/oracle/oradata/FGEDUDB/system01.dbf
input datafile file number=00002 name=/oracle/app/oracle/oradata/FGEDUDB/sysaux01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/FGEDUDB/undotbs01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:45
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
1 OK 0 10240 51200 12345678
2 OK 0 8192 40960 12345678
3 OK 0 2048 25600 12345678
4 OK 0 2559 12800 12345678
Finished validate at 2026-03-31 10:00:45
# 3. 验证指定数据文件
RMAN> validate datafile 4;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 OK 0 2559 12800 12345678
File Name: /oracle/app/oracle/oradata/FGEDUDB/users01.dbf
Block Type Blocks Failing Blocks Processed
———- ————– —————-
Data 0 8192
Index 0 2048
Other 0 2559
Finished validate at 2026-03-31 10:00:10
# 4. 验证指定数据文件的块范围
RMAN> validate datafile 4 block 1000 to 2000;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:05
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 OK 0 0 1001 12345678
Finished validate at 2026-03-31 10:00:05
# 5. 验证指定表空间
RMAN> validate tablespace users;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 OK 0 2559 12800 12345678
Finished validate at 2026-03-31 10:00:10
# 6. 查看损坏块信息
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION_TYPE
———- ———- ———- —————— —————
4 1024 1 0.00 ALL ZERO
# 7. 验证控制文件
RMAN> validate current controlfile;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
including current control file in validation
channel ORA_DISK_1: validation complete, elapsed time: 00:00:02
List of Control File Copies
===========================
Key S Completion Time Ckp SCN Ckp Time
——- – ————— ———- ———
1 A 2026-03-31 10:00:00 12345678 2026-03-31 10:00:00
File Name: /oracle/app/oracle/oradata/FGEDUDB/control01.ctl
Finished validate at 2026-03-31 10:00:02
# 8. 验证SPFILE
RMAN> validate spfile;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
including current SPFILE in validation
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
Finished validate at 2026-03-31 10:00:01
3.1.2 配置RMAN备份验证
RMAN> validate backupset all;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile backup set
channel ORA_DISK_1: specifying backup set(s) for validation
validating backup set 12345
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
validating backup set 12346
channel ORA_DISK_1: validation complete, elapsed time: 00:00:05
Finished validate at 2026-03-31 10:00:15
# 2. 验证指定备份集
RMAN> validate backupset 12345;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile backup set
channel ORA_DISK_1: specifying backup set(s) for validation
validating backup set 12345
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
Finished validate at 2026-03-31 10:00:10
# 3. 验证归档日志
RMAN> validate archivelog all;
Starting validate at 2026-03-31 10:00: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: starting validation of archived log
channel ORA_DISK_1: specifying archived log(s) for validation
validating archived log file name=/oracle/app/oracle/arch/1_100_1234567890.arc
validating archived log file name=/oracle/app/oracle/arch/1_101_1234567890.arc
validating archived log file name=/oracle/app/oracle/arch/1_102_1234567890.arc
channel ORA_DISK_1: validation complete, elapsed time: 00:00:05
Finished validate at 2026-03-31 10:00:05
# 4. 验证指定归档日志
RMAN> validate archivelog sequence 100;
Starting validate at 2026-03-31 10:00: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: starting validation of archived log
channel ORA_DISK_1: specifying archived log(s) for validation
validating archived log file name=/oracle/app/oracle/arch/1_100_1234567890.arc
channel ORA_DISK_1: validation complete, elapsed time: 00:00:02
Finished validate at 2026-03-31 10:00:02
# 5. 验证恢复区
RMAN> validate recovery area;
Starting validate at 2026-03-31 10:00: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
including current control file in validation
including current SPFILE in validation
channel ORA_DISK_1: starting validation of archived log
channel ORA_DISK_1: specifying archived log(s) for validation
validating archived log file name=/oracle/app/oracle/arch/1_100_1234567890.arc
validating archived log file name=/oracle/app/oracle/arch/1_101_1234567890.arc
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
Finished validate at 2026-03-31 10:00:10
# 6. 使用RESTORE…VALIDATE验证备份
RMAN> restore database validate;
Starting restore at 2026-03-31 10:00: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: starting validation of datafile backup set
channel ORA_DISK_1: specifying datafile backup set(s) for validation
validating backup set 12345
channel ORA_DISK_1: validation complete, elapsed time: 00:00:30
Finished restore at 2026-03-31 10:00:30
# 7. 验证数据文件恢复
RMAN> restore datafile 4 validate;
Starting restore at 2026-03-31 10:00: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: starting validation of datafile backup set
channel ORA_DISK_1: specifying datafile backup set(s) for validation
validating backup set 12345
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
Finished restore at 2026-03-31 10:00:10
# 8. 验证控制文件恢复
RMAN> restore controlfile validate;
Starting restore at 2026-03-31 10:00: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: starting validation of datafile backup set
channel ORA_DISK_1: specifying datafile backup set(s) for validation
validating backup set 12345
channel ORA_DISK_1: validation complete, elapsed time: 00:00:02
Finished restore at 2026-03-31 10:00:02
3.2 RMAN损坏检查监控
3.2.1 配置RMAN损坏检查监控脚本
$ vi /home/oracle/scripts/monitor_rman_validate.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
# RMAN损坏检查监控脚本
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/rman_validate_logs”
mkdir -p $LOG_DIR
echo “$(date): Starting RMAN validation…” > $LOG_DIR/rman_validate.log
# 验证数据库
rman target / <
run {
allocate channel ch1 type disk;
validate database check logical;
release channel ch1;
}
exit
EOF
# 检查损坏块
sqlplus -s / as sysdba <
set heading on
set feedback on
column corruption_type format a20
prompt
prompt Corrupt Blocks:
prompt —————
select file#, block#, blocks, corruption_type
from v\$database_block_corruption
order by file#, block#;
exit
EOF
# 检查是否有损坏
CORRUPT_COUNT=$(sqlplus -s / as sysdba <
EOF
)
if [ “$CORRUPT_COUNT” -gt 0 ]; then
echo “$(date): CORRUPTION DETECTED: $CORRUPT_COUNT corrupt blocks found” >> $LOG_DIR/rman_validate.log
# 发送告警邮件
mail -s “RMAN Validation Alert: $CORRUPT_COUNT corrupt blocks found” admin@fgedu.net.cn < $LOG_DIR/rman_validate.log
else
echo "$(date): No corruption detected." >> $LOG_DIR/rman_validate.log
fi
echo “$(date): RMAN validation completed.” >> $LOG_DIR/rman_validate.log
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/monitor_rman_validate.sh
# 3. 测试脚本
$ /home/oracle/scripts/monitor_rman_validate.sh
# 4. 设置定期监控
$ crontab -e
# 每周日凌晨2点验证数据库
0 2 * * 0 /home/oracle/scripts/monitor_rman_validate.sh >> /home/oracle/scripts/rman_validate.log 2>&1
3.2.2 配置RMAN损坏检查报告
$ vi /home/oracle/scripts/rman_validate_report.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
# RMAN损坏检查报告脚本
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/rman_validate_logs”
REPORT_FILE=”$LOG_DIR/rman_validate_report.txt”
echo “RMAN Validation Report” > $REPORT_FILE
echo “Generated: $(date)” >> $REPORT_FILE
echo “========================================” >> $REPORT_FILE
# 获取损坏块信息
sqlplus -s / as sysdba <
set heading on
set feedback on
set linesize 200
column file_name format a50
column corruption_type format a20
column owner format a10
column segment_name format a30
prompt
prompt Corrupt Blocks Summary:
prompt ———————-
select
d.file_name,
c.file#,
c.block#,
c.blocks,
c.corruption_type
from v\$database_block_corruption c, dba_data_files d
where c.file# = d.file_id
order by c.file#, c.block#;
prompt
prompt Corrupt Blocks Details:
prompt ———————–
select
e.owner,
e.segment_name,
e.segment_type,
c.file#,
c.block#,
c.corruption_type
from v\$database_block_corruption c, dba_extents e
where c.file# = e.file_id
and c.block# between e.block_id and e.block_id + e.blocks – 1
order by c.file#, c.block#;
prompt
prompt Backup Validation Status:
prompt ————————-
select
bs_key,
completion_time,
status
from v\$backup_set
order by completion_time desc
fetch first 10 rows only;
exit
EOF
# 发送报告
mail -s “RMAN Validation Report” admin@fgedu.net.cn < $REPORT_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/rman_validate_report.sh
# 3. 测试脚本
$ /home/oracle/scripts/rman_validate_report.sh
# 4. 查看报告
$ cat /home/oracle/scripts/rman_validate_logs/rman_validate_report.txt
RMAN Validation Report
Generated: Tue Mar 31 10:00:00 CST 2026
========================================
Corrupt Blocks Summary:
----------------------
FILE_NAME FILE# BLOCK# BLOCKS CORRUPTION_TYPE
-------------------------------------------------- ---------- ---------- ---------- --------------------
/oracle/app/oracle/oradata/FGEDUDB/users01.dbf 4 1024 1 ALL ZERO
Corrupt Blocks Details:
-----------------------
OWNER SEGMENT_NAME SEGMENT_TYPE FILE# BLOCK# CORRUPTION_TYPE
---------- ------------------------------ ---------------- ---------- ---------- --------------------
SCOTT EMP TABLE 4 1024 ALL ZERO
Backup Validation Status:
-------------------------
BS_KEY COMPLETION_TIME STATUS
---------- ------------------- ----------
12345 2026-03-31 10:00:00 AVAILABLE
12346 2026-03-30 10:00:00 AVAILABLE
3.3 RMAN损坏检查故障处理
3.3.1 RMAN损坏检查故障处理
RMAN> validate database;
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 FAILED 1 2559 12800 12345678
# 分析步骤
# 1. 查看损坏块信息
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION_TYPE
———- ———- ———- —————— —————
4 1024 1 0.00 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
——- —- — ———- ———– ———— —————
12345 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. 验证修复结果
RMAN> validate datafile 4;
Starting validate at 2026-03-31 10:15: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: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00004 name=/oracle/app/oracle/oradata/FGEDUDB/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:10
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 OK 0 2559 12800 12345678
Finished validate at 2026-03-31 10:15:10
# 6. 验证数据完整性
SQL> select * from v$database_block_corruption;
no rows selected
SQL> select count(*) from scott.emp;
COUNT(*)
———-
14
Part04-生产案例与实战讲解
4.1 RMAN损坏检查分析案例
在生产环境中使用RMAN损坏检查的完整案例:
4.1.1 场景描述
某企业生产数据库需要定期进行RMAN损坏检查,确保数据库完整性。
4.1.2 分析步骤
$ vi /home/oracle/scripts/weekly_rman_validate.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
# 每周RMAN损坏检查脚本
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/rman_validate_logs/$DATE”
mkdir -p $LOG_DIR
echo “$(date): Starting weekly RMAN validation…” > $LOG_DIR/summary.log
# 验证数据库
rman target / <
run {
allocate channel ch1 type disk;
validate database check logical;
release channel ch1;
}
exit
EOF
# 检查损坏块
sqlplus -s / as sysdba <
set serveroutput on
declare
v_corrupt_count number;
begin
select count(*) into v_corrupt_count from v\$database_block_corruption;
if v_corrupt_count > 0 then
dbms_output.put_line(‘WARNING: Found ‘ || v_corrupt_count || ‘ corrupt blocks’);
for rec in (
select file#, block#, blocks, corruption_type
from v\$database_block_corruption
order by file#, block#
) loop
dbms_output.put_line(‘ File ‘ || rec.file# ||
‘, Block ‘ || rec.block# ||
‘, Type: ‘ || rec.corruption_type);
end loop;
else
dbms_output.put_line(‘No corrupt blocks found’);
end if;
end;
/
exit
EOF
echo “$(date): Weekly RMAN validation completed.” >> $LOG_DIR/summary.log
# 发送报告
mail -s “Weekly RMAN Validation Report” admin@fgedu.net.cn < $LOG_DIR/summary.log
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/weekly_rman_validate.sh
# 3. 测试脚本
$ /home/oracle/scripts/weekly_rman_validate.sh
# 4. 查看验证结果
$ cat /home/oracle/scripts/rman_validate_logs/20260331/summary.log
Tue Mar 31 10:00:00 CST 2026: Starting weekly RMAN validation...
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
1 OK 0 10240 51200 12345678
2 OK 0 8192 40960 12345678
3 OK 0 2048 25600 12345678
4 OK 0 2559 12800 12345678
No corrupt blocks found
Tue Mar 31 10:00:30 CST 2026: Weekly RMAN validation completed.
4.2 RMAN损坏检查故障处理
在RMAN损坏检查故障处理过程中的方法和技巧:
4.2.1 故障处理流程
# 1. 故障识别
# – 运行RMAN验证
# – 检查验证结果
# – 确认损坏位置
# 2. 故障分析
# – 查看损坏块信息
# – 确定损坏对象
# – 分析损坏原因
# 3. 故障处理
# – 使用RMAN块级恢复
# – 使用DBMS_REPAIR修复
# – 重建损坏对象
# 4. 故障预防
# – 定期验证数据库
# – 保持备份完整
# – 监控硬件状态
# 示例:RMAN损坏检查故障处理
# 1. 故障识别
RMAN> validate database;
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 FAILED 1 2559 12800 12345678
# 2. 故障分析
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_TYPE
———- ———- ———- —————
4 1024 1 ALL ZERO
# 3. 故障处理
RMAN> blockrecover datafile 4 block 1024;
Starting blockrecover at 2026-03-31 10:10:00
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:10
Finished blockrecover at 2026-03-31 10:10:15
# 4. 验证处理结果
RMAN> validate datafile 4;
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
—- —— ————– ———— ————— ———-
4 OK 0 2559 12800 12345678
4.3 RMAN损坏检查优化
优化RMAN损坏检查配置的最佳实践:
4.3.1 优化RMAN损坏检查管理
SQL> create or replace procedure auto_rman_validate as
v_corrupt_count number;
begin
dbms_output.put_line(‘— Auto RMAN Validation —‘);
— 检查损坏块
select count(*) into v_corrupt_count from v$database_block_corruption;
if v_corrupt_count > 0 then
dbms_output.put_line(‘WARNING: Found ‘ || v_corrupt_count || ‘ corrupt blocks’);
for rec in (
select file#, block#, blocks, corruption_type
from v$database_block_corruption
order by file#, block#
) loop
dbms_output.put_line(‘ File ‘ || rec.file# ||
‘, Block ‘ || rec.block# ||
‘, Type: ‘ || rec.corruption_type);
end loop;
dbms_output.put_line(‘Please run RMAN BLOCKRECOVER to fix corrupt blocks’);
else
dbms_output.put_line(‘No corrupt blocks found’);
end if;
end auto_rman_validate;
/
Procedure created.
# 2. 执行自动化存储过程
SQL> set serveroutput on
SQL> exec auto_rman_validate;
— Auto RMAN Validation —
No corrupt blocks found
PL/SQL procedure successfully completed.
# 3. 创建RMAN损坏检查历史表
SQL> create table rman_validate_history (
id number primary key,
validate_time date,
file# number,
block# number,
corruption_type varchar2(20),
status varchar2(20)
);
Table created.
SQL> create sequence rman_validate_seq;
Sequence created.
# 4. 创建RMAN损坏记录存储过程
SQL> create or replace procedure record_rman_corruption(
p_file# in number,
p_block# in number,
p_corruption_type in varchar2
) as
begin
insert into rman_validate_history (
id, validate_time, file#, block#, corruption_type, status
) values (
rman_validate_seq.nextval, sysdate, p_file#, p_block#, p_corruption_type, ‘DETECTED’
);
commit;
end record_rman_corruption;
/
Procedure created.
# 5. 查看RMAN损坏检查历史
SQL> column validate_time format a20
SQL> select * from rman_validate_history order by validate_time desc;
ID VALIDATE_TIME FILE# BLOCK# CORRUPTION_TYPE STATUS
———- ——————– ———- ———- ——————– ——————–
1 2026-03-31 10:00:00 4 1024 ALL ZERO DETECTED
Part05-风哥经验总结与分享
5.1 RMAN损坏检查总结
Oracle RMAN损坏检查是数据库健康检查的重要组成部分,具有以下特点:
- 全面检查:检查数据文件、控制文件、归档日志
- 备份验证:验证备份集的完整性
- 损坏记录:记录损坏块信息
- 在线检查:数据库可以保持运行状态
- 快速检查:快速检测数据块损坏
5.2 RMAN损坏检查检查清单
Oracle RMAN损坏检查检查清单:
- 检查频率:定期进行RMAN损坏检查
- 检查范围:检查所有数据文件和备份
- 检查记录:记录检查结果
- 问题处理:及时处理发现的问题
- 预防措施:制定预防措施
- 文档记录:记录检查过程
5.3 RMAN损坏检查工具推荐
Oracle RMAN损坏检查工具推荐:
- RMAN VALIDATE:验证数据库完整性
- DBVERIFY:验证数据文件完整性
- ANALYZE:验证对象结构
- DBMS_REPAIR:修复损坏块
- SQL*Plus:执行SQL命令
- Shell脚本:自动化检查过程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
