首先要明确闪回是一类技术,有非常多种类型。

 

一、闪回数据库:

闪回数据库应用场景:

  数据库做压力测试,测试完毕闪回无用数据。
  应用上线,前灰度测试,如果出现大问题直接闪回。

闪回数据库:

  开启归档:

  

mkdir /home/oracle/arch
    SQL> alter system set log_archive_dest_1='location=/home/oracle/arch';
    SQL> startup mount force  
    SQL> alter database archivelog;
    SQL> archive log list;
    SQL> alter database open;

 

  设置闪回区:

 

SQL> show parameter recover;
    SQL> show parameter db_flash;   
    SQL> alter system set db_recovery_file_dest_size=2G;
    mkdir /home/oracle/flash
    SQL> alter system set db_recovery_file_dest='/home/oracle/flash';

  数据库开启闪回功能:

  

SQL> alter database flashback on;

  闪回数据库:

    闪回数据库需要在mount阶段:

    1、基于scn号闪回:

      需要删除之前有记录scn号:

SQL> select current_scn from v$database;
      SQL> flashback database to scn 322232;

    2、基于时间点:
      

FLASHBACK DATABASE TO TIMESTAMP(TO_DATE('2017-06-8 22:30:00', 'YYYY-MM-DD HH24:MI:SS'));

    3、普通还原点:
   

SQL> create restore point app03_20170617;
      SQL> flashback database to restore point app03_20170617;


    4、可靠还原点:
  

SQL> create restore point app03 guarantee flashback database;
      SQL> FLASHBACK DATABASE TO RESTORE point app03;

关闭闪回:
 

SQL>alter database flashback off;

 

二、闪回表(基于回收站的)

    回收站是基于用户的
    回收站使用的空间是:用户默认使用的表空间
    当用户表空间不足的时候,创建表(等)会删除回收站的内容(将段的使用从永久变成可调整)
    删除表,其实是把表改名放入回收站
    sys对象不进入回收站

  

  闪回表: 

    查看回收站:
   

SQL> show recyclebin;
      ORIGINAL NAME	 RECYCLEBIN NAME		OBJECT TYPE  DROP TIME
      ---------------- ------------------------------ ------------ -------------------
      TEST1		 BIN$UXTqW8AoJeTgUKjAb2QnEg==$0 TABLE	     2017-06-08:22:46:18

    执行闪回表:
  

SQL> flashback table "BIN$UXTqW8AoJeTgUKjAb2QnEg==$0" to before drop;
      #.....to before drop rename to new_test; 可以闪回时更改名字

    查看回收站:
     

SQL> show recyclebin;

 

三、闪回表(闪回查询)

  闪回查询:
    

select * from emp AS OF timestamp to_date('2017-06-08 22:56:20','yyyy-mm-dd hh24:mi:ss') where department_id=100;

  闪回:
   

flashback table emp to timestamp  to_date('2017-06-08 22:56:20','yyyy-mm-dd hh24:mi:ss');

  闪回表稳妥做法:
    利用闪回查询  查询删除前的状态,然后insert回原来表里

    对于truncate的表,除了flashback database之外,其它的flashback功能可能帮不了你)

 

四、闪回版本查询:

  flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录。
  比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,
  但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。

  如果我们利用flash table或者是flash query,我们也只能是看到过去的某一个快照而已,利用flashback version query,我们将找到其中的任何变化:

 

select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAME
  from t1 versions between timestamp minvalue and maxvalue
  order by VERSIONS_STARTTIME;

  

  当然,除了分析以上所有的变更之外,我们可以指定时间段,如
 

select ID,NAME
    from test versions between timestamp
    to_date('20014-04-07 24:34:04','yyyy-mm-dd hh24:mi:ss')
    and to_date('20014-04-27 04:34:50','yyyy-mm-dd hh24:mi:ss');

  还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:

select versions_starttime, versions_endtime
    from test versions
    between scn 1000 and 1001

五、闪回事务查询:
  Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog。
  示例:
    a、打开数据库补充日志:
      

sql>alter database add supplemental log data;


    b、打开主键补充日志:
     

sql>alter database add supplemental log data (primary key) columns;

    c、直接使用sqlplus执行命令比较复杂,使用oem操作吧:
     

打开em----Availability----->Perform Recovery---->