RMAN 恢复是 Oracle 数据库灾难恢复的核心能力,它通过RESTORE(还原备份文件)+ RECOVER(应用日志恢复数据)两个核心步骤,将数据库从备份状态恢复到一致状态。根据故障类型和恢复粒度,RMAN 支持从单个数据块损坏 到整库完全损毁的全场景恢复。
1、RMAN 恢复核心基础
1.1、两个核心命令的区别
| 命令 | 作用 | 执行时机 |
|---|---|---|
RESTORE |
从备份集中将数据文件、控制文件、参数文件等复制到原始位置或新位置 | 恢复第一步,先还原文件 |
RECOVER |
应用归档日志和在线重做日志,将数据文件恢复到一致状态 | 还原文件后执行,完成数据同步 |
1.2、恢复类型
- 完全恢复:将数据库恢复到故障发生时刻,数据零丢失
- 不完全恢复:将数据库恢复到故障发生前的某个时间点 / SCN / 日志序列号,会丢失该时间点之后的数据
2、核心恢复场景
2.1、整库完全恢复
适用场景:
- 所有数据文件损坏或丢失
- 存储设备故障导致整库数据丢失
- 服务器硬件故障需要迁移到新服务器
前提条件:
- 有完整的全量 / 增量备份
- 有从备份时刻到故障时刻的所有归档日志
- 有可用的控制文件和参数文件
操作步骤:
bash
# 1. 关闭数据库并启动到mount状态
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
# 2. 还原整库
RESTORE DATABASE;
# 3. 恢复整库(应用所有归档日志和在线重做日志)
RECOVER DATABASE;
# 4. 打开数据库
ALTER DATABASE OPEN;
注意事项:
- 如果数据文件需要恢复到新位置,使用
SET NEWNAME命令 - 如果使用恢复目录,连接时需要加上
catalog参数
2.2、整库不完全恢复(时间点 / SCN / 日志序列号)
适用场景:
- 误执行
DROP TABLE、TRUNCATE TABLE等逻辑错误 - 误删除重要数据且无法通过闪回恢复
- 数据库被病毒或恶意程序破坏
前提条件:
- 有目标时间点之前的完整备份
- 有从备份时刻到目标时间点的所有归档日志
三种恢复方式:
bash
# 方式1:恢复到指定时间点(最常用)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RUN {
SET UNTIL TIME "TO_DATE('2026-05-25 10:30:00', 'YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
}
ALTER DATABASE OPEN RESETLOGS;
# 方式2:恢复到指定SCN
RUN {
SET UNTIL SCN 1234567;
RESTORE DATABASE;
RECOVER DATABASE;
}
ALTER DATABASE OPEN RESETLOGS;
# 方式3:恢复到指定日志序列号
RUN {
SET UNTIL SEQUENCE 1234 THREAD 1;
RESTORE DATABASE;
RECOVER DATABASE;
}
ALTER DATABASE OPEN RESETLOGS;
关键注意事项:
- 不完全恢复后必须使用
ALTER DATABASE OPEN RESETLOGS打开数据库 - 打开后会重置日志序列号,建议立即执行一次全量备份
- 12c + 版本支持
OPEN RESETLOGS后继续使用之前的增量备份链
2.3、单个表空间恢复
适用场景:
- 单个表空间的数据文件损坏
- 误删除表空间的数据文件
- 表空间级别的逻辑错误
前提条件:
- 有该表空间的完整备份
- 有从备份时刻到当前的所有归档日志
- 数据库可以正常打开(系统表空间除外)
操作步骤:
bash
# 1. 将损坏的表空间离线
ALTER TABLESPACE users OFFLINE IMMEDIATE;
# 2. 还原表空间
RESTORE TABLESPACE users;
# 3. 恢复表空间
RECOVER TABLESPACE users;
# 4. 将表空间上线
ALTER TABLESPACE users ONLINE;
注意事项:
- 系统表空间(SYSTEM、SYSAUX)不能在数据库打开状态下离线恢复
- 如果是临时表空间损坏,直接删除重建即可,不需要恢复
2.4、单个数据文件恢复
适用场景:
- 单个数据文件损坏或丢失
- 数据文件所在磁盘故障
操作步骤:
bash
# 1. 将损坏的数据文件离线
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/proddb/users01.dbf' OFFLINE;
# 2. 还原数据文件
RESTORE DATAFILE '/u01/app/oracle/oradata/proddb/users01.dbf';
# 3. 恢复数据文件
RECOVER DATAFILE '/u01/app/oracle/oradata/proddb/users01.dbf';
# 4. 将数据文件上线
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/proddb/users01.dbf' ONLINE;
简化写法:
bash
# 使用数据文件编号恢复(从v$datafile视图查询编号)
RESTORE DATAFILE 4;
RECOVER DATAFILE 4;
2.5、控制文件恢复
适用场景:
- 所有控制文件损坏或丢失
- 控制文件所在磁盘故障
操作步骤:
**注:**有控制文件自动备份
bash
# 1. 启动数据库到nomount状态
STARTUP NOMOUNT;
# 2. 从自动备份还原控制文件
RESTORE CONTROLFILE FROM AUTOBACKUP;
# 3. 启动到mount状态
ALTER DATABASE MOUNT;
# 4. 恢复数据库
RECOVER DATABASE;
# 5. 打开数据库
ALTER DATABASE OPEN RESETLOGS;
注意事项:
- 控制文件恢复后必须执行
RECOVER DATABASE同步数据文件 - 打开数据库时必须使用
RESETLOGS选项 - 这就是为什么必须开启控制文件自动备份的原因
2.6、参数文件(SPFILE)恢复
适用场景:
- SPFILE 损坏或丢失
- 参数修改错误导致数据库无法启动
操作步骤:
bash
# 1. 启动到nomount状态(如果无法启动,先创建一个临时pfile)
STARTUP NOMOUNT;
# 2. 从自动备份还原SPFILE
RESTORE SPFILE FROM AUTOBACKUP;
# 3. 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;
恢复到指定位置:恢复SPFILE到pfile格式
RESTORE SPFILE TO PFILE '/tmp/initproddb.ora' FROM AUTOBACKUP;
2.7、归档日志恢复
适用场景:
- 本地归档日志丢失或损坏
- 需要恢复归档日志用于备库同步或 LogMiner 分析
操作步骤:
bash
# 恢复所有归档日志
RESTORE ARCHIVELOG ALL;
# 恢复指定时间范围内的归档日志
RESTORE ARCHIVELOG FROM TIME 'SYSDATE-7' UNTIL TIME 'SYSDATE';
# 恢复指定SCN范围内的归档日志
RESTORE ARCHIVELOG FROM SCN 123456 UNTIL SCN 789012;
# 恢复指定序列号的归档日志
RESTORE ARCHIVELOG SEQUENCE BETWEEN 1234 AND 1240 THREAD 1;
3、恢复最佳实践
- 恢复前备份:在执行任何恢复操作前,先备份当前的控制文件和参数文件
- 先验证备份 :使用
VALIDATE命令验证备份集的完整性 - 先测试恢复:在测试环境中先进行恢复测试,确保恢复流程正确
- 记录恢复过程:详细记录恢复的每一步操作和结果
- 恢复后验证:恢复完成后,验证数据库的完整性和一致性
- 立即备份:不完全恢复或控制文件恢复后,立即执行一次全量备份