热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。
正文开始
核心提示:当误删表、日志损坏或控制文件丢失时,Oracle的不完全恢复是DBA最后的救命稻草。掌握关键恢复技术,可在数据灾难中力挽狂澜。
一、不完全恢复核心概念
1. 核心特点
• 必须关闭数据库:在 MOUNT
状态下执行重做日志恢复• 权限要求:以 SYSDBA
身份连接操作• 数据回溯:整个数据库回滚到指定时间点,后续数据永久丢失
2. 适用场景
1. 重要数据被破坏(如误删表) 2. 最小化备份测试验证 3. 完全恢复时丢失归档日志或当前在线日志(重要考点) 4. 误删除表空间(需使用备份控制文件)
3. 恢复类型
| 类型 | 应用场景 |
二、不完全恢复通用步骤
1. 定位错误点:使用LogMiner分析DDL/DML误操作(时间点/SCN/SQL) 2. 备份当前库:立即执行数据库全量备份 3. 还原旧备份:恢复错误发生前的数据文件备份 4. 前滚恢复:应用日志至目标时间点/SCN 5. 重置日志: ALTER DATABASE OPEN RESETLOGS
三、实战案例解析
▶ 案例1:恢复误删表(基于时间点)
场景:scott.t1
表被误删且PURGE
-- 1. 定位删除操作
SELECT username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') time,sql_redo
FROM v$logmnr_contents
WHERE lower(sql_redo) LIKE 'drop table%';
-- 输出结果
USERNAME SCN TIME SQL_REDO
SCOTT 1918000 2024-10-01 17:28:29 drop table t1 purge;
-- 2. 关闭库并还原备份
SHUTDOWN ABORT;
rm *.dbf # 删除所有数据文件
cp /u01/back1/*.dbf ./ # 还原备份
-- 3. 执行时间点恢复
STARTUP MOUNT;
RECOVER DATABASE UNTIL TIME '2024-10-01 17:28:29';
AUTO # 自动应用日志
-- 4. 重置日志打开
ALTER DATABASE OPEN RESETLOGS;
▶ 案例2:当前日志损坏恢复
场景:redo01.log
被删除导致崩溃
-- 1. 尝试完全恢复(失败)
RECOVER DATABASE;
-- 2. 执行不完全恢复
RECOVER DATABASE UNTIL CANCEL;
CANCEL # 手动终止恢复
-- 3. 重置日志打开
ALTER DATABASE OPEN RESETLOGS;
四、备份控制文件恢复(核心难点)
▶ 案例1:控制文件+数据文件损坏
场景:表空间abcd
数据文件丢失且控制文件损坏
-- 1. 还原备份文件
cp /u01/back/*.dbf ./ # 数据文件
cp con.bak1 control*.ctl # 控制文件
-- 2. 重建丢失的数据文件
STARTUP;
ALTER DATABASE CREATE DATAFILE '/u01/oradata/prod/abcd01.dbf';
-- 3. 使用备份控制文件恢复
RECOVER DATABASE USING BACKUP CONTROLFILE;
输入日志路径:/u01/oradata/prod/redo03.log # 手动指定当前日志
-- 4. 重置打开
ALTER DATABASE OPEN RESETLOGS;
▶ 案例2:新增表空间后的控制文件恢复
场景:备份控制文件后新建表空间ceshi
-- 1. 启动时发现文件不匹配
STARTUP;
ORA-01589: 必须使用RESETLOGS或NORESETLOGS打开
-- 2. 恢复时出现未命名文件
RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-01244: 未命名数据文件被添加到控制文件
-- 3. 重建并重命名数据文件
ALTER DATABASE CREATE DATAFILE '/u01/oracle/dbs/UNNAMED00003'
AS '/u01/oradata/prod/ceshi01.dbf'; # 关键命令!
-- 4. 完成恢复并打开
RECOVER DATABASE USING BACKUP CONTROLFILE;
ALTER DATABASE OPEN RESETLOGS;
五、关键技术总结
1. LogMiner精准定位: EXECUTE dbms_logmnr_d.build('dict.ora','/logmnr_dir',dbms_logmnr_d.store_in_flat_file);
EXECUTE dbms_logmnr.add_logfile('/arch/arch_1_111.log',options=>dbms_logmnr.NEW);2. 控制文件恢复核心命令: RECOVER DATABASE USING BACKUP CONTROLFILE; # 必须配合RESETLOGS3. 数据文件重建技巧: ALTER DATABASE CREATE DATAFILE '损坏文件路径' AS '新路径';
-- 同时完成物理文件创建和控制文件更新
重要警示:不完全恢复后务必用
RESETLOGS
方式打开数据库,此时会重置日志序列(可通过SELECT * FROM v$log
验证)。此操作不可逆,需立即执行全量备份!
文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。
文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




