Oracle 11g如何恢复至备份后新增数据前的状态?
问题分析与解决方案
你的恢复操作核心错误
你遇到的问题本质是没有执行「不完全恢复」,而是默认让RMAN做了「完全恢复」:
- 归档模式下,RMAN的默认逻辑是把备份之后产生的所有归档日志全部应用到数据库中——哪怕你修改了数据、甚至手动删除了dbf文件,恢复时RMAN依然会从归档日志里重新执行你新增客户的操作,最终数据库还是回到了最新状态,而非备份后的初始状态。
- 你删除dbf文件的操作只是触发了RMAN重新恢复数据文件,但恢复完成后它还是会自动应用所有后续归档日志,所以新增的数据又被还原回来了。
正确恢复到备份后状态的步骤
要回到备份完成时的状态,你需要指定恢复的时间点/SCN/日志序列号,让RMAN只恢复到备份完成的那一刻,不包含之后的操作。具体步骤如下:
1. 确定备份的关键标记(时间点/SCN)
首先得拿到备份完成的时间点或对应的SCN(系统变更号):
- 如果你记得备份完成的精确时间,直接使用该时间即可;
- 也可以在RMAN中执行
LIST BACKUP SUMMARY;,查看备份记录里的COMPLETION TIME(完成时间)或SCN字段,获取对应的标记值。
2. 启动数据库到MOUNT状态
先关闭数据库,再启动到挂载模式:
SHUTDOWN IMMEDIATE; STARTUP MOUNT;
3. 在RMAN中执行指定标记的不完全恢复
根据你拿到的标记,选择以下一种方式执行:
方式一:按时间点恢复
把时间替换成你的备份完成时间:
RUN { SET UNTIL TIME "TO_DATE('2024-05-20 14:30:00', 'YYYY-MM-DD HH24:MI:SS')"; RESTORE DATABASE; RECOVER DATABASE; }
方式二:按SCN恢复
把SCN值替换成备份对应的SCN:
RUN { SET UNTIL SCN 1234567; RESTORE DATABASE; RECOVER DATABASE; }
4. 打开数据库并重置日志
恢复完成后,必须用RESETLOGS打开数据库(因为不完全恢复会重置日志序列):
ALTER DATABASE OPEN RESETLOGS;
5. 重要后续操作
执行不完全恢复后,之前的备份和归档日志无法再用于后续的完全恢复,所以一定要立即做一次新的全库备份,避免后续出现恢复风险。
内容的提问来源于stack exchange,提问作者NCNecros




