一、使用Oracle10gFlashback Query进行数据闪回
   Oracle10g对于闪回查询进行了增强,支持更简单的SQL操作,允许对误删除、误更新等DML操作进行闪回。
 
 看一下以下测试:
 1.原表记录
 SQL> select count(*) from test;
 
 COUNT(*)
----------
         5
 
 2.误删除所有记录,并且提交更改。
SQL> delete test;
 
5 rows deleted.
 
SQL> commit;
 
Commit complete.
 
SQL> select count(*) from test;
 
 COUNT(*)
----------
         0
 
 3.获得当前SCN
   如果能够确切知道删除之前SCN最好,如果不知道,可以进行闪回查询尝试.
 
SQL> select dbms_flashback.get_system_change_number from dual;
 
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1338692
 
 
 
SQL> select count(*) from test as of scn 1338660;
 
 COUNT(*)
----------
        5
我们看到在SCN=1338760时,数据都在。
4.恢复数据.
 
SQL> insert into emp3 select * from emp3 as of scn 1338660;
 
14 rows created.
 
SQL> commit;
 
Commit complete.
 
总结:如果回滚段被覆盖,则无法进行闪回查询恢复。
 
=======================================================
 
二、Oracle10g flashback database
 
 以下的例子演示了命令行配置。这也可以用企业治理器来完成。
 在我们配置重现数据库之前,我们需要照顾以下一些先决条件。
 Flash Recovery Area  
  
 首先,我们需要配置一个Flash Recovery Area (FRA)。在Oracle10g中,这是个新东西,FRA只不过是一个恢复相关文件的磁盘定位。对于重现数据库,一个新的后台进程,名为Recovery Writer (RVWR),在来自SGA的数据库重现缓存的映像之前,阶段性地写入磁盘,作为FRA中的重现日志。重现日志是在FRA中由Oracle数据库自动治理的。
 重现日志的成本是以空间和性能来衡量的。空间是数据库写密度的一个因素。一个24小时运行的,以5%的数据块写入作为重现日志的方式必然会导致磁盘整体空间的5%的增长。因为块是以规律的间隔写入的,而不是事务的一部分,所以对性能的影响是可以忽略不计的。
 
 1、要配置FRA,需要设置如下的初始化参数:
  alter system set db_recovery_file_dest='/oracle/flash_recovery_area' scope=both;
  alter system set db_recovery_file_dest_size = 10G scope=both;
 
 2、接下来,我们需要配置归档。再一次,我们需要使用FRA作为我们的归档日志目的地。与传统恢复类似,重现数据库需要归档以向前恢复提交的事务,在重现日志重新存储了希望时间之前的时点之后。
  要最小化配置归档,执行如下的命令,按照顺序:
  
  SQL> startup mount
  ORACLE instance started.
  Database mounted.
  SQL> alter database archivelog;
  Database altered.
  SQL> alter database open;
  Database altered.
  SQL> archive log list
  Database log mode Archive Mode
  Automatic archival Enabled
  Archive destination USE_DB_RECOVERY_FILE_DEST
  Oldest online log sequence 2
  Next log sequence to archive 4
  Current log sequence 4
 
 3、启用重现数据库
  配置了这些先决条件之后,我们预备好配置重现数据库了。
  首先,我们需要设置重现保持目标。这个初始化参数,以分钟来计算,代表我们可以把数据库返回到多长时间之前。它的值决定了FRA中重现日志的数量和时间段。下面我们的例子将其设置为24小时。要理解这个保持时间段并不是保证是非常重要的。假如FRA需要空间,重现日志将会自动删除目标保持时间点之前的记录。稍后我们会看到,我们保证重现日志的方式在FRA中进行维护。有了保持时间段设置,重现数据库可以激活。
  
  在mount状态下执行如下命令,设置重现保持目标为24小时:
  SQL> alter system set db_flashback_retention_target = 1440 scope=both;
  System altered.
  SQL> alter database flashback on;
  Database altered.
  SQL> alter database open;
  Database altered.
  SQL> select flashback_on from v$database;
  FLASHBACK_ON
  ------------------
  YES
 
 4、监控FRA
  SQL>select name,space_limit,space_used, space_reclaimable from v$recovery_file_dest;
 
 5、判定数据库的可重现的时间点
  
   在Oracle10g R1中,你有两种选择来捕捉你的数据库的PIT:时间戳和系统修改号码(SCN)。这个信息是作为重现操作的一部分要求的。 捕捉到提交的SCN或者稍后的非常重要,而不是数据治理语言操作。Oracle提供了一种比较笨拙的方式来捕捉提交的SCN,通过userenv('commitscn')函数。我们的示例在发生损坏的数据治理语言操作之前捕捉到了这个信息。
  
  select current_scn from v$database;
  CURRENT_SCN
  -----------
   1321065
  or
  select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')
   "Recover Time" from v$database;
  Recover Time
  -------------------
  2006-09-23:20:13:48
  在1Oracle10g R2中,Oracle通过重新存储点简化了这个过程。一个重新存储点就是一个用户定义的与数据库PIT相关连的名字,可以在时间戳或者SCN中使用。可以认为重新存储点是一个redo历史的参考标记。重新存储点保留在控制文件中,直到重新存储点被删除或者重现日志被删除。第二个例子保证了重现数据库对于恢复是可用的。
  
  create restore point my_restore_point;
  Operation 206 succeeded.
    guarantee flsashback database;(可选)
   注意:重新存储点并不会保证所有的事务都在那个时间点上提交
 
 6、模拟数据库损坏
   模拟数据库损坏
   insert into my_table values (2);
  
   1 row created.
  
   commit;
  
   提交完成
   判定数据库是否由于人为错误导致逻辑损坏。
   select c1, ora_rowscn from my_table;
  
   C1 ORA_ROWSCN
   ---------- ----------
   1 1320954
   2 1321231
  注意:在默认情况下,Oracle在时钟级别上检索SCN。当然,时钟当中的所有行都有一样的SCN。激活行级别的SCN检索,可以在CREATE TABLE命令中使用ROWDEPENDENCIES要害字。
    比如:CREATE TABLE MY_TABLE (C1 NUMBER) ROWDEPENDENCIES;
   
 7、检验重现数据库是可能的。  
  判定你可以重现的最早的时间。
  SELECT OLDEST_FLASHBACK_SCN
   ,to_char(OLDEST_FLASHBACK_TIME,'YYYY-MM-DD:HH24:MI:SS')
   "OLDEST_FLASHBACK_TIME"
   FROM V$FLASHBACK_DATABASE_LOG;
  OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
  -------------------- -------------------
   1319629 2006-09-23:19:51:56
  判定你是否有重新存储点。
  select name, scn, time from v$restore_point;
  NAME SCN TIME
  ---------------- ---------- ----------------------------
  MY_RESTORE_POINT 1321136 23-SEP-06 08.16.24.000000000 PM
 
 8、使用先前创建的重新存储点来重现数据库。
  
  SQL> shutdown immediate;
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  SQL> startup mount
  ORACLE instance started.
  Database mounted.
  SQL> flashback database to restore point my_restore_point;   #flashback database to timestamp sysdate-15/1440; (当前的系统时间之前的15分钟)
  Flashback complete.
  在警告日志中检查重现数据库消息
  .
  .
  .
  Sat Sep 23 20:38:11 2006
  flashback database to restore point my_restore_point
  Sat Sep 23 20:38:12 2006
  Flashback Restore Start
  Flashback Restore Complete
  Flashback Media Recovery Start
  parallel recovery started with 2 processes
  Sat Sep 23 20:38:14 2006
  Recovery of Online Redo Log: Thread 1 Group 2 Seq 33 Reading mem 0
   Mem# 0 errs 0:
  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
  Sat Sep 23 20:38:16 2006
  Incomplete Recovery applied until change 1321137
  Flashback Media Recovery Complete
  Completed: flashback database to restore point my_restore_point
  
   验证你的数据库恢复到你想要的状态
  假如你不满足,你可以再次重现,把数据库向前恢复,直到或者执行了完全恢复:recover database.
 
 9、只读方式打开数据库(如果以resetlogs打开数据库,那么就无法进行完全恢复了),检查数据是否正确。
 SQL> alter database open read only;
  Database altered.
  SQL> select c1, ora_rowscn from my_table;
   C1 ORA_ROWSCN
  ---------- ----------
   1 1321002
 
       10、可以重新完全恢复后打开数据库。进行正常的应用:
       SQL>SHUTDOWN IMMEDIATE
       SQL>STARTUP MOUNT;
       SQL>RECOVER DATABASE;
       SQL>ALTER DATABASE OPEN;
       注意:这时候的数据库还是原来正常的数据库。
      
       结论:
  重现数据库将会成为DBA最喜欢的Oracle10g特性之一。无论你是否纠正了用户的错误,只是看看先前的数据库状态,或者在衰退测试之后回到测试环境中,这个特性都是减少恢复时间的最好策略。我们看到这项技术很轻易使用,比传统的恢复更快,并且最好的是,它是免费的!我希望你也会认为重现数据库是可用性体系结构中的一项主要组件。
   
 注意:为了不丢失数据,可以先用flashback恢复到以前的某个restore点(类似于时间点恢复),然后只读方式打开数据库,把表给导出来,然后再回到mount状态,重新做完全恢复,正常打开数据库,把表导入。
 
 ===================================
三、10gflashback recyclebin特性
 
       对被drop表的管理
 1、查看当前回收站被删除的表
 Show recyclebin
 2、查看被删除表的内容:
 Select * from “RECYCLEBIN NAME”;
 3、恢复被drop的表
  Flashback table table_name to before drop;
 Flashback table table_name to before drop rename to new_name;
 4、清空回收站
 Purge table “RECYCLEBIN NAME”;
 Purge tablespace tablespace_name;
 清空所有的回收站(需要sysdba权限)