Oracle 数据库 PITR 时间点恢复

Oracle 数据库 PITR 时间点恢复

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


1. 概述

PITR(Point-in-Time Recovery)时间点恢复[1]:

场景

  • 误删除数据
  • 误 DROP 表
  • 误 TRUNCATE

详细见:Oracle RMAN 备份恢复


2. 数据库级 PITR

2.1 关闭

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

2.2 恢复到时间

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

SQL> ALTER DATABASE OPEN RESETLOGS;

2.3 恢复到 SCN

RMAN> RUN {
  SET UNTIL SCN 1234567;
  RESTORE DATABASE;
  RECOVER DATABASE;
}

SQL> ALTER DATABASE OPEN RESETLOGS;

2.4 恢复到 Sequence

RMAN> RUN {
  SET UNTIL SEQUENCE 100 THREAD 1;
  RESTORE DATABASE;
  RECOVER DATABASE;
}

SQL> ALTER DATABASE OPEN RESETLOGS;

3. 表空间级 PITR (TSPITR)

3.1 概述

  • 仅恢复表空间
  • 不影响其他

3.2 RMAN TSPITR

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

3.3 验证

ALTER TABLESPACE users ONLINE;

4. 表级恢复 (12c+)

4.1 概述

  • 单表恢复
  • 不影响数据库

4.2 恢复到时间

RMAN> RECOVER TABLE scott.employees 
  UNTIL TIME "TO_DATE('2026-07-21 15:00:00', 'YYYY-MM-DD HH24:MI:SS')"
  AUXILIARY DESTINATION '/u01/aux'
  REMAP TABLE scott.employees:employees_recovered;

4.3 恢复到 SCN

RMAN> RECOVER TABLE scott.employees 
  UNTIL SCN 1234567
  AUXILIARY DESTINATION '/u01/aux';

5. Flashback 替代

5.1 Flashback Database

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
ALTER DATABASE OPEN RESETLOGS;

详细见:Oracle 闪回技术

5.2 Flashback Table

ALTER TABLE employees ENABLE ROW MOVEMENT;
FLASHBACK TABLE employees TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);

5.3 Flashback Query

SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR)
WHERE id = 100;

详细见:Oracle 闪回性能优化


6. RESETLOGS

6.1 概述

  • 重置 Redo 日志
  • 创建新 INCARNATION

6.2 执行

ALTER DATABASE OPEN RESETLOGS;

6.3 验证

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

7. 恢复到旧 Incarnation

7.1 查看历史

SELECT * FROM v$database_incarnation;

7.2 切换

RMAN> RESET DATABASE TO INCARNATION 2;
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
RMAN> ALTER DATABASE MOUNT;
RMAN> RUN {
  SET UNTIL TIME "...";
  RESTORE DATABASE;
  RECOVER DATABASE;
}
SQL> ALTER DATABASE OPEN RESETLOGS;

8. 实战案例

8.1 案例:误 DELETE

1. 13:00 用户误 DELETE FROM employees;
2. 14:00 发现
3. PITR 恢复到 12:59
4. RESETLOGS
5. 数据恢复

8.2 案例:误 DROP TABLE

1. DROP TABLE important_table;
2. Flashback Table
3. FLASHBACK TABLE important_table TO BEFORE DROP;

详细见:Oracle 闪回技术


9. 准备

9.1 归档模式

ARCHIVE LOG LIST;

9.2 备份完整

RMAN> LIST BACKUP SUMMARY;

9.3 时间点确定

-- 查找正确时间
SELECT * FROM v$log_history ORDER BY first_time DESC;

10. 注意事项

10.1 RESETLOGS 影响

  • 重置 Redo
  • 旧备份无效
  • 需立即新备份

10.2 辅助空间

  • TSPITR / 表恢复
  • 需要 AUXILIARY DESTINATION

10.3 测试

- 测试环境先验证
- 确认时间点
- 备份当前

11. 验证

11.1 数据

SELECT COUNT(*) FROM employees;
SELECT * FROM employees WHERE id = ...;

11.2 日志

SELECT * FROM v$log;
SELECT * FROM v$database_incarnation;

12. 常见坑与排错

12.1 恢复失败

-- 1. 备份完整
-- 2. 归档完整
-- 3. 时间点正确

12.2 ORA-01589

-- 必须 RESETLOGS
ALTER DATABASE OPEN RESETLOGS;

12.3 数据丢失

- 时间点不准
- 归档缺失
- 测试环境先

13. 最佳实践

  1. 归档模式:必备
  2. 完整备份:基础
  3. Flashback 优先:快
  4. TSPITR 局部:减少影响
  5. 表恢复 12c+:精准
  6. 测试环境:验证
  7. 时间点确定:准确
  8. RESETLOGS 后备份:保护
  9. 文档化:流程
  10. 定期演练:可行

14. 参考资料

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