首页 > 代码库 > 测试2 ORACLE flashback 恢复数据

测试2 ORACLE flashback 恢复数据

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打开数据库后,务必要完整地进行一次数据库备份。

测试2 ORACLE flashback 恢复数据