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. 最佳实践
- 归档模式:必备
- 完整备份:基础
- Flashback 优先:快
- TSPITR 局部:减少影响
- 表恢复 12c+:精准
- 测试环境:验证
- 时间点确定:准确
- RESETLOGS 后备份:保护
- 文档化:流程
- 定期演练:可行
14. 参考资料
[1] Oracle Database Backup and Recovery User’s Guide 19c, “PITR” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/