闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等  Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间 在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashback Version Query, Flashback Transaction Query 三种) 和Flashback Table。 

 

  

一. Flashback Database 

 

Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到过去的某个时点的状态, 这个功能依赖于Flashback log 日志。 比RMAN更快速和高效。 因此Flashback Database 可以看作是不完全恢复的替代技术。 但它也有某些限制:  

 

  •  Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择 
  • 2如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来, 然后利用Flashback Database 执行剩下的Flashback Datbase。 
  • 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。 
  • 使用Flashback Database锁能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN。  

 

1.Flashback Database 架构  

    Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志 和Flash Recovery Area。一旦数据库启用了Flashback Database, 则RVWR进程会启动,该进程会向Flash Recovery Area中写入Flashback Database Log, 这些日志包括的是数据块的 " 前镜像(before image)", 这也是Flashback Database 技术不完全恢复块的原因。      

A、flashback database特性

       闪回到过去的某一时刻 闪回点之后的工作全部丢失 使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashbackresetlogs之前     的时间点)。  常用的场景:truncate table、多表发生意外错误等。 使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失    

B、flashback database的组成    

      闪回缓冲区:当启用flashback database,sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配 启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之 上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。

2.   Flashback Database语法

        Oracle Flashback技术总结(一)—— Flashback Database_闪回

FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] SCN <system_change_number>   --基于SCN闪回            
FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回           
FLASHBACK [STANDBY] DATABASE [<database_name>]  TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回
下面的示例:
            SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');           
            SQL> flashback database to scn 918987;
            SQL> flashback database ro restore point b1_load;
          备注:创建闪回点语法:create restore point 闪回点名称;

3.启用Flashback Database 

数据库的Flashback Database功能缺省是关闭的,要想启用这个功能,就需要做如下配置。 

1. 配置Flash Recovery Area 

  要想使用Flashback Database, 必须使用Flash Recovery Area,因为Flashback Database Log只能保存在这里。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.  

启用Flash Recovery Area: 

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH; 

         SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='  /home/oracle/app/oracle/路径 ' SCOPE=BOTH;  

禁用Flash Recovery Area: 

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ;  

      对于Flash Recovery Area,Oracle 是这样建议的,flash recovery area 设置的越大,flashback database 的恢复能力就越强,因此建议flash recovery area 能够放的下所有的数据文件,增量备份,以及所有尚未备份的归档文件,当然还有它自己产生的flashback logs。 

在数据库运行过程中,oracle 自动向该区域写入文件,当剩余空间不足15%的时候,它就会在alert 中增加警告,提示你空间不足。但此时不会影响数据库的正常运转,直到所有空间统统被用掉之后,oracle 首先尝试删除寻些过期的文件,冗余文件或备份过的文件,如果这些做完了,还是没有空闲空间的话,数据库就被hang 住了。 

  

2. 启用数据库Flashback 功能  

数据库启动到mount状态 

SQL> startup mount;(oracle 11g,可以在open状态下启用flashback)

 

检查Flashback 功能, 缺省时功能是关闭的。 

SQL> select name, current_scn, flashback_on from v$database; 

NAME    CURRENT_SCN  FLASHBACK_ON 

--------    -----------          ------------------ 

DBA      945715                NO 

  

 启动Flashback功能 

SQL>  alter database flashback on; 

数据库已更改。 

 

SQL>  select name, current_scn, flashback_on from v$database; 

NAME      CURRENT_SCN FLASHBACK_ON 

--------- ----------- ------------------ 

DBA                 0 YES 

 

设置初始化参数:DB_FLASHBACK_RETENTION_TARGET:  

SQL>alter system set db_flashback_retention_target=1440 scope=both; 

 

该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。 

  

3.Flashback Database操作示例  

做操作前先备份数据库 

RMAN> backup database; 

 

检查是否启动了flash recovery area、启用了日志归档、启动flashback database

SQL> show parameter db_recovery_file 

NAME                    TYPE        VALUE 

------------------------------------  ----------- ------------------------------ 

db_recovery_file_dest       tring       /home/oracle/app/oracle/路径 

db_recovery_file_dest_size  big integer 1G 


 

SQL> select log_mode,current_scn,flashback_on from v$database;

 

 

LOG_MODE     CURRENT_SCN   FLASHBACK_ON

 

 

------------ ----------- -----------   -------

 

 

ARCHIVELOG 1818035           YES 

 


 

查询当前的时间 

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual; 

 

TIME 

----------------- 

2013-5-14 14:37:05 

 

 删除表A 

SQL> drop table test014; 

表已删除。 

SQL> commit; 

 

Flashback Database 实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。 

SQL> shutdown immediate  

SQL> startup mount 

 

执行恢复:分timestamp 或者SCN两种  

SQL> Flashback database to timestamp to_timestamp(‘ 2013-5-14 14:37:05 ','yy-mm-dd hh24:mi:ss');  

或者: 

SQL> Flashback database to scn 947921; 

闪回完成。 

 

打开数据库

在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库: 

1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。 

2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。 

 

这里演示,就以resetlogs方式打开: 

SQL> alter database open resetlogs; 

数据库已更改。 

 

验证数据: 

SQL> select * from test014; 

 

4.和Flashback Database 相关的3个视图: 

V$database 

 这个视图可以查看是否启用了Flashback database功能 

SQL> select flashback_on from v$database; 

FLASHBACK_ON 

------------------ 

YES 

 

V$flashback_database_log 

 Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少, 该视图就可以查看许多有用的信息。 

Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点 

Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小 

Retention_target: 系统定义的策略 

Estimated_flashback_size: 根据策略对需要的空间大小的估计值 


SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh2 

4:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es 

 from v$flashback_database_log; 

 

OS       OT             RT      FS        ES 

----------  -----------------     ----------  ----------    ---------- 

946088  09-10-14 13:49:59  1440     16384000  350920704 

 

V$flashback_database_stat 

这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量,Flashback_Data 代表Flashbacklog产生数量,DB_Date代表数据改变数量,Redo_Date代表日志数量,通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求  

 

SQL> select *from v$flashback_database_stat; 

 

BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE 

-------- -------- -------------- ---------- ---------- ------------------------ 

14:43:10 15:15:28        6455296   29310976    3898368              0