欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

Oracle不完全恢复的实战指南

2025年07月29日 Oracle
一、不完全恢复核心概念1. 核心特点必须关闭数据库:在mount状态下执行重做日志恢复权限要求:以sysdba身份连接操作数据回溯:整个数据库回滚到指定时间点,后续数据永久丢失2. 适用场景重要数据被

一、不完全恢复核心概念

1. 核心特点

  • 必须关闭数据库:在mount状态下执行重做日志恢复
  • 权限要求:以sysdba身份连接操作
  • 数据回溯:整个数据库回滚到指定时间点,后续数据永久丢失

2. 适用场景

  1. 重要数据被破坏(如误删表)
  2. 最小化备份测试验证
  3. 完全恢复时丢失归档日志或当前在线日志(重要考点)
  4. 误删除表空间(需使用备份控制文件)

3. 恢复类型

类型应用场景
基于时间点恢复到指定时间点前的状态
基于scn恢复到特定scn号前的状态
基于cancel恢复到归档日志/当前日志断点
使用备份控制文件误删表空间等控制文件损坏场景

二、不完全恢复通用步骤

  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  2022-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 '2022-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;

五、关键技术总结

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);

控制文件恢复核心命令

recover database using backup controlfile;  # 必须配合resetlogs

数据文件重建技巧

alter database create datafile '损坏文件路径' as '新路径'; 
-- 同时完成物理文件创建和控制文件更新

重要警示:不完全恢复后务必用resetlogs方式打开数据库,此时会重置日志序列(可通过select * from v$log验证)。此操作不可逆,需立即执行全量备份!

到此这篇关于oracle不完全恢复的实战指南的文章就介绍到这了,更多相关oracle不完全恢复内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!