Oracle RMAN 不完全恢复详解

Oracle RMAN 不完全恢复详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

RMAN 不完全恢复将数据库恢复到过去某点[1]:

详细见:Oracle 数据库 PITR 时间点恢复


2. 类型

2.1 时间点

RUN {
  SET UNTIL TIME "TO_DATE('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

2.2 SCN

RUN {
  SET UNTIL SCN 1234567;
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

2.3 SEQUENCE

RUN {
  SET UNTIL SEQUENCE 123 THREAD 1;
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

2.4 RESTORE POINT

RUN {
  SET UNTIL RESTORE POINT 'before_upgrade';
  RESTORE DATABASE;
  RECOVER DATABASE;
  ALTER DATABASE OPEN RESETLOGS;
}

3. RESETLOGS

3.1 必要性

- 不完全恢复后
- 重置 Redo 日志
- 新的 Incarnation

3.2 操作

ALTER DATABASE OPEN RESETLOGS;

3.3 验证

SELECT resetlogs_change#, resetlogs_time, incarnation#
FROM v$database;

4. Incarnation

4.1 概念

- RESETLOGS 创建新 Incarnation
- 数据库版本

4.2 查看

SELECT incarnation#, resetlogs_change#, status 
FROM v$database_incarnation;

4.3 切换

-- 重置到旧 Incarnation
STARTUP MOUNT;
RESET DATABASE TO INCARNATION 2;
RESTORE DATABASE;
RECOVER DATABASE UNTIL ...;
ALTER DATABASE OPEN RESETLOGS;

5. 表空间 TSPITR

5.1 概念

- 表空间级时间点恢复
- 不影响其他表空间

5.2 命令

RMAN> RECOVER TABLESPACE users 
  UNTIL TIME "TO_DATE('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS')"
  AUXILIARY DESTINATION '/tmp/aux';

详细见:Oracle TTS 传输表空间详解


6. 表级恢复

6.1 RMAN Table Recovery(12c+)

RMAN> RECOVER TABLE scott.emp 
  UNTIL TIME "SYSDATE-1"
  AUXILIARY DESTINATION '/tmp/aux'
  REMAP TABLE scott.emp:scott.emp_rec;

6.2 优势

- 不影响全库
- 单表恢复
- 重映射

7. 应用场景

7.1 误操作

- 误 DROP TABLE
- 误 TRUNCATE
- 误 UPDATE/DELETE
- 恢复到误操作前

7.2 大事务错误

- 错误的大批量更新
- 恢复到事务前

7.3 升级失败

- 升级前 RESTORE POINT
- 升级失败回退

7.4 块损坏

- 恢复到损坏前

8. 完整流程

8.1 准备

-- 关闭
SHUTDOWN IMMEDIATE;

-- 启动 MOUNT
STARTUP MOUNT;

8.2 恢复

RUN {
  SET UNTIL TIME "TO_DATE('2026-07-21 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
  RESTORE DATABASE;
  RECOVER DATABASE;
}

8.3 打开

ALTER DATABASE OPEN RESETLOGS;

8.4 验证

SELECT open_mode, log_mode, resetlogs_time 
FROM v$database;

8.5 备份

RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

9. 限制

9.1 数据丢失

- RESETLOGS 后点之后数据丢失
- 需要重新同步

9.2 备份依赖

- 需要恢复点之前的备份
- 归档日志完整

9.3 时间

- 恢复时间长
- 全库

10. 与 Flashback 对比

10.1 Flashback Database

- 快(分钟级)
- 需启用 Flashback
- FRA 空间
- 时间范围内

10.2 RMAN PITR

- 慢(小时级)
- 需备份
- 任意时间
- RESETLOGS

详细见:Oracle Flashback Database 详解


11. 常见坑与排错

11.1 ORA-01547

- RESETLOGS 警告
- 检查恢复

11.2 ORA-19809

- FRA 满
- 增大 FRA

11.3 备份不足

- 没有恢复点前备份
- 检查 LIST BACKUP

12. 最佳实践

  1. RESTORE POINT:关键操作前
  2. 归档完整:保留
  3. 备份充足:定期
  4. 测试:演练
  5. RESETLOGS 后:立即备份
  6. Incarnation:管理
  7. 时间精确:避免数据丢失
  8. 监控:归档
  9. 文档:流程
  10. 回退:预案

13. 参考资料

[1] Oracle Database Backup and Recovery User’s Guide 19c, “Performing Incomplete Recovery” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/