第12章 不完全数据库恢复
不完全数据库恢复是指介质恢复阶段不需要应用所有的重做记录,而只需一部份即可,恢复终点可以是之后的任意一条重做记录。也被称为指定时间目标恢复(Point In Time)
不完全恢复就是要告知recover命令到哪条重做记录为止就停止恢复,该记录成为PIT点,有以下四种:
- 基于日志序列号的:recover database until sequence 100
- 基于交互式手动叫停的:recover database until cancel
- 基于时间点的:recover database until time 'sysdate-1'
- 基于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,步骤如下:
- startup mount;
- restore或switch将所有数据文件还原至PIT之前
- recover将数据库恢复至PIT点
- 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;
}
小范围不完全恢复
在另一台服务器上将整个数据库恢复至某个时间点,找回数据后再使用数据泵将数据导入至生产环境中。