flashback 恢复数据
准备工作:
1.创建表空间
create tablespace zxq datafile 'd:\zxq.dbf' size 2m;
2.创建用户
create user zxq identified by zxq default tablespace zxq ;
3.创建测试表
create table zxq.zxq as select * from scott.emp;
修改数据库不闪回
alter database flashback off
当前scn
select current_scn from v$database ;
1426285
删除表
drop table zxq.zxq ;
闪回被删除的表
flashback table zxq.zxq to before drop ;
ok
查询数据
select count(*) from zxq.zxq
count(*)
-------------------------------
14
删除表
drop table zxq.zxq ;
关闭数据库在打开
shutdown immediate ;
startup ;
查询数据表
select count(*) from zxq.zxq as of scn 1426285
表不存错误
恢复被删除的表zxq
flashback table zxq.zxq to before drop ;
select count(*) from zxq.zxq
count(*)
-------------------------------
14
表数据删除
delete from zxq.zxq ;
查询数据表
select count(*) from zxq.zxq ;
count(*)
-------------------------------
0
通过SCN查询被删除表的数据(数据来自UNDO)
select count(*) from zxq.zxq as of scn 1426285
count(*)
-------------------------------
14
尝试恢复
flashback table zxq.zxq to scn 1426285 ;
错误,表不支持移动
开打行移动
alter table zxq.zxq enable row movement
再次恢复到指定的SCN
flashback table zxq.zxq to scn 1426285 ;
OK
查询被恢复的数据
select count(*) from zxq.zxq ;
count(*)
-------------------------------
14
结论
表级别的恢复和alter database flashback off /of 没有关系
测试2 恢复数据库
删除表
drop table zxq.zxq ;
恢复数据库到指定的SCN
flashback database zxq.zxq to scn 1426285 ;
错误,数据库没有打开flashback
关闭再启动到mount 状态
shutdown immediate ;
startup mount ;
打开数据库闪回支持
alter database flashback on;
恢复数据库到指定的SCN
flashback database zxq.zxq to scn 1426285 ;
报错误
日志不全。
恢复失败。
结论,没有日志,不可以恢复。
打开数据库
alter database open ;
插入数据
insert into zxq.zxq (empno) values (1);
insert into zxq.zxq (empno) values (2);
查询当前SCN
select current_scn from v$database ;
1429091
删除数据
delete from zxq.zxq ;
16行被删除
尝试恢复数据
flashback database to scn 1429091 ;
报错,open 状态的数据库不能闪回。
关闭数据库在打开
shutdown immediate ;
startup mount ;
再次恢复数据
flashback database to scn 1429091 ;
ok
Completed: flashback database to scn 1429091
数据库打开
alter database open ;
报错,需要用resetlogs 方式打开数据库。
resetlogs方式打开数据
alter database open resetlogs;
查看恢复的数据
select count(*) from zxq.zxq ;
count(*)
-------------------------------
16
恢复完成。
resetlogs的作用
防止陈旧的数据进入数据库(保证数据库的一致性),这也就是为什么在用resetlogs打开数据库,一定要立即对数据库做个全备。
在控制文件,data file header,redo log header里存储”resetlogs data“,当open resetlogs被执行时,可以通过这些内容检查一致性。
什么时候用resetlogs
1. 不完全恢复
2. 用备份的控制文件恢复
3. 新创建的控制文件来恢复
注意:
使用resetlogs选项,会把当前的日志序号(log sequence number)重设为1,并抛弃所有日志信息。在以下条件时需要使用resetlogs选项:
在不完全恢复(介质恢复);
使用备份控制文件。
使用resetlogs打开数据库后,务必要完整地进行一次数据库备份。