1. 首页 > Oracle教程 > 正文

Oracle教程FG437-RMAN损坏检查

本文档风哥主要介绍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

Oracle RMAN损坏检查的特点:

  • 全面检查:检查数据文件、控制文件、归档日志
  • 备份验证:验证备份集的完整性
  • 损坏记录:记录损坏块信息到V$DATABASE_BLOCK_CORRUPTION
  • 在线检查:数据库可以保持运行状态
  • 快速检查:快速检测数据块损坏

1.2 RMAN损坏检查方法

Oracle RMAN损坏检查方法:

  • VALIDATE DATABASE:验证整个数据库
  • VALIDATE DATAFILE:验证指定数据文件
  • VALIDATE TABLESPACE:验证指定表空间
  • VALIDATE BACKUPSET:验证指定备份集
  • VALIDATE ARCHIVELOG:验证归档日志
  • VALIDATE CONTROLFILECOPY:验证控制文件副本
# RMAN VALIDATE命令说明

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损坏检查使用:

  • 定期检查:定期检查数据库完整性
  • 备份验证:验证备份的可用性
  • 故障诊断:诊断数据损坏问题
  • 迁移验证:验证数据迁移后完整性
  • 健康检查:数据库健康检查
风哥提示:RMAN损坏检查是数据库健康检查的重要组成部分,建议定期进行RMAN损坏检查。

Part02-生产环境规划与建议

2.1 RMAN损坏检查规划

Oracle RMAN损坏检查规划要点:

# RMAN损坏检查规划
– 检查频率:定期进行RMAN损坏检查
– 检查范围:检查所有数据文件和备份
– 检查时间:在低峰期进行检查
– 检查记录:记录检查结果

# 检查频率规划
– 每日检查:检查关键数据文件
– 每周检查:检查所有数据文件
– 每月检查:检查所有备份集

# 检查范围规划
– 数据文件:检查所有数据文件
– 控制文件:检查控制文件
– 归档日志:检查归档日志
– 备份集:检查备份集完整性

# 检查时间规划
– 低峰期:在业务低峰期进行检查
– 维护窗口:在维护窗口进行检查
– 备份后:在备份后进行检查
– 迁移后:在数据迁移后进行检查

# 检查记录规划
– 记录方式:选择记录方式
– 记录格式:定义记录格式
– 记录保留:设置记录保留时间
– 记录备份:备份检查记录

2.2 RMAN损坏检查场景

Oracle RMAN损坏检查场景:

  • 定期检查:定期检查数据库完整性
  • 备份验证:验证备份的可用性
  • 故障诊断:诊断数据损坏问题
  • 迁移验证:验证数据迁移后完整性
  • 恢复验证:验证恢复后数据完整性
# RMAN损坏检查场景

1. 定期检查
– 每周检查所有数据文件
– 每月检查所有备份集
– 发现损坏及时修复

2. 备份验证
– 验证备份集完整性
– 确保备份可用
– 验证恢复能力

3. 故障诊断
– 诊断数据损坏问题
– 定位损坏块位置
– 确定损坏范围

4. 迁移验证
– 验证数据迁移后完整性
– 确保数据一致
– 验证应用功能

5. 恢复验证
– 验证恢复后数据完整性
– 确保数据一致
– 验证应用功能

2.3 RMAN损坏检查最佳实践

Oracle RMAN损坏检查最佳实践:

  • 定期检查:定期进行RMAN损坏检查
  • 记录结果:记录检查结果和发现的问题
  • 及时处理:及时处理发现的损坏
  • 结合备份:结合备份策略进行检查
  • 自动化:自动化检查过程
生产环境建议:RMAN损坏检查需要建立完善的检查流程,建议定期检查、记录结果、及时处理。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 RMAN损坏检查配置

3.1.1 配置RMAN数据库验证

# 1. 验证整个数据库
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备份验证

# 1. 验证所有备份集
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损坏检查监控脚本

# 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 / <> $LOG_DIR/rman_validate.log
run {
allocate channel ch1 type disk;
validate database check logical;
release channel ch1;
}
exit
EOF

# 检查损坏块
sqlplus -s / as sysdba <> $LOG_DIR/rman_validate.log
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 < exit
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损坏检查报告

# 1. 创建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 <> $REPORT_FILE
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

风哥提示:RMAN损坏检查是数据库健康检查的重要组成部分,建议定期进行RMAN损坏检查。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 RMAN损坏检查分析案例

在生产环境中使用RMAN损坏检查的完整案例:

4.1.1 场景描述

某企业生产数据库需要定期进行RMAN损坏检查,确保数据库完整性。

4.1.2 分析步骤

# 1. 创建RMAN损坏检查自动化脚本
$ 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 / <> $LOG_DIR/summary.log
run {
allocate channel ch1 type disk;
validate database check logical;
release channel ch1;
}
exit
EOF

# 检查损坏块
sqlplus -s / as sysdba <> $LOG_DIR/summary.log
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 故障处理流程

# RMAN损坏检查故障处理流程

# 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损坏检查管理

# 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

生产环境建议:RMAN损坏检查优化需要建立完善的检查流程,建议定期检查、记录结果、及时处理。更多学习教程公众号风哥教程itpux_com

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脚本:自动化检查过程
风哥提示:RMAN损坏检查是数据库健康检查的重要组成部分,建议定期进行RMAN损坏检查。from:www.itpux.com www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息