第12章 不完全数据库恢复

不完全数据库恢复是指介质恢复阶段不需要应用所有的重做记录,而只需一部份即可,恢复终点可以是之后的任意一条重做记录。也被称为指定时间目标恢复(Point In Time)

不完全恢复就是要告知recover命令到哪条重做记录为止就停止恢复,该记录成为PIT点,有以下四种:

  1. 基于日志序列号的:recover database until sequence 100
  2. 基于交互式手动叫停的:recover database until cancel
  3. 基于时间点的:recover database until time 'sysdate-1'
  4. 基于SCN的:recover database until scn 10000

被动恢复(文件损坏)

场景1:数据库运行时某个普通数据文件丢失,该文件最后一次备份后有归档日志丢失

数据库运行时某个普通数据文件丢失,该文件最后一次备份后有归档日志丢失

# 从rman中恢复数据文件,提示找不到某些归档日志       13号丢失
run{
sql 'alter database datafile 5 offline';
restore datafile 5;
recover datafile 5;
sql 'alter database datafile 5 online';
}

# 检查在线日志状态        current是18号
select group#,sequence#,status from v$log;

# 检查被还原的5号文件头部SCN号           SCN:998624
select file#,change# from v$recover_file;

# 用上一步查询到的SCN检查被还原的5号文件的起点在哪个日志中         结果为7 
select sequence# from v$log_history where 998624 between first_change# and next_change#-1;

# 在rman中检查日志文件路径
list archivelog low sequence 7 high sequence 18;

结论:5号文件需要从7号日志文件恢复到18号,其中16,17,18号为在线日志,7-15号为归档日志,其中13号日志文件丢失。
如果归档日志有备份,应从备份中找回13号日志文件。
如果没有备份,则只能恢复7-12号日志文件。

# 将5号文件恢复到12号日志的最后一条重做记录,注意最后一个参数是13而不是12
recover datafile 5 until sequence 13;

此时有两种方案:
1、将5号文件下线,不再访问
2、将整个数据库还原至13号日志文件之前的状态

# restore命令执行后必须执行以下查询,如果没有返回,说明restore还原的数据文件不合格
select 'restore check ok' "RESTORE_CHECK"
FROM
(select max(next_change#-1) tail,min(first_change#) head
from v$log_history
where
sequence# between 7 and 12) log_range
where 
(select max(change#) from v$recover_file) <= log_range.tail
and
(select min(change#) from v$recover_file) >= log_range.head;

# 在rman中恢复整个数据库,还原的数据文件头部SCN必须小于13号日志的第一条重做记录的SCN
run {
startup force mount;
set until sequence 13;
restore database;
recover database;
alter database open resetlogs;
}

场景2:数据库有备份,数据文件没有丢失,current状态日志丢失

# 检查在线日志状态      16为current,其余全是inactive
select type,member,IS_RECOVERY_DEST_FILE,SEQUENCE#,MEMBERS,v$log.STATUS,ARCHIVED from v$log,v$logfile where v$logfile.GROUP#=v$log.GROUP#;

# 恢复数据库
startup mount;
run{
set until sequence 16;
restore database;
recover database;
alter database open resetlogs;
}

主动恢复(误操作)

需要判断PIT(point in time)的时间或SCN,步骤如下:

  1. startup mount;
  2. restore或switch将所有数据文件还原至PIT之前
  3. recover将数据库恢复至PIT点
  4. alter database open resetlogs;
# 将数据库恢复至10分钟之前(非精确,注意3秒定位问题   212页)
startup mount;
run{
set until time "sysdate-interval '10' minute";
restore database;
recover database;
alter database open resetlogs;
}

# 恢复数据库到指定时间
recover database until time "to_date('2024-05-20 16:00:00','yyyy-mm-dd hh24:mi:ss')";
# 首先检查当前SCN
select dbms_flashback.get_system_change_number from dual;

# 将数据库恢复至之前某个scn
startup mount;
run{
set until scn 1009540;
restore database;
recover database;
alter database open resetlogs;
}

# 查询时间点对应的SCN
SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2024-05-20 14:59:00', 'YYYY-MM-DD HH24:MI:SS')) AS scn_time FROM dual;
# 创建还原点
create restore point before_batch;

# 将数据库恢复至创建的还原点
startup mount;
run{
set until restore point before_batch;
restore database;
recover database;
alter database open resetlogs;
}

# 删除还原点
drop restore point before_batch;

数据库的化身-Incarnation

当数据库以resetlogs的方式打开后就创建了一个化身

1、sqlplus
select * from v$database_incarnation;

2、rman(Inc Key)
list incarnation;
rman target /

# 查询SCN对应的化身编号(Inc Key)
list incarnation;

# 进入之前的化身(Inc Key)
reset database to incarnation xx;

# 恢复数据库
run{
set until scn 1009540;
restore database;
recover database;
alter database open resetlogs;
}

小范围不完全恢复

在另一台服务器上将整个数据库恢复至某个时间点,找回数据后再使用数据泵将数据导入至生产环境中。


第1章 重做日志(Redo Log)

第2章 控制文件(Control File)

第3章 补充日志(Supplemental Logging)

第4章 恢复管理器(RMAN)

第5章 恢复编录(Recovery Catalog)

第6章 数据泵(Data Pump)

第7章 参数文件的备份与还原

第8章 控制文件的备份与恢复

第9章 关键数据文件备份与恢复

第10章 普通数据文件备份与恢复

第11章 只读数据文件备份与恢复

第12章 不完全数据库恢复

第13章 无备份情况下的恢复

第14章 闪回技术(Flashback)

第15章 恢复受损的数据块