oracle闪回功能详解(oracle独有的flashback功能)

实际操作有效:

因为实际的底层操作原理是先删除后插入,所以要开启行移动功能,可以先执行闪回语句,不可以的话再开启行移动功能

alter table 表名 enable row movement;

下面才是实际的闪回表的语句(时间为需要恢复到的时间节点)

flashback table 表名 to timestamp to_timestamp('2011-03-04 05:00:00','yyyy-mm-dd HH24:MI:SS');

 

-------------以下是闪回功能详解------------------------------------------------------------------------------------------------------------------------------


Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复。闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行、事务、表和数据库范围。使用闪回特性,您可以查询以前的数据版本,还可以执行更改分析和自助式修复,以便在保持数据库联机的同时从逻辑损坏中恢复。

闪回技术包括以下特性: 
   (1)闪回查询允许用户查询过去某个时间点的数据,以重新构建由于意外删除或更改而丢失的数据。 
   (2)闪回版本查询提供了一种查看行级数据库随时间变化的方法。 
   (3)闪回事务查询提供了一种查看事务级数据库变化的方法。 
   (4)闪回数据库是进行时间点恢复的新策略。它能够快速将Oracle 数据库恢复到以前的时间,正确更正由于逻辑数据损坏或用户错误而引起的任何问题。
   (5)闪回表功能使 DBA 可以非常快速、轻松地将一个表或一组表恢复至过去特定的某一时间点。 
   (6)闪回删除在删除对象时提供了一个安全网,您可以非常快速、轻松地取消对一个表及其相关对象对象的删除。

  

  Flashback技术是以Undo Segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。闪回参数如下:

  Connected to oracle Database 11g Enterprise Edition Release 11.1.0.7.0 
  Connected as system@LOCAL_DB
  SQL> show parameter undo_
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  undo_management                      string      AUTO
  undo_retention                        integer     900    --默认是1440 即24*60,只保留一天的闪回数据,具体值在安装数据库实例时可以设置
  undo_tablespace                        string      UNDOTBS1
  

  

接下来讲讲oracle数据库闪回类型主要有三种:

  (1)闪回数据库(flashback database)

  闪回数据库就是当出现逻辑错误时,能够将整个数据库回退到出错前的那个状态。

  (2)闪回删除(flashback drop)

  Oracle10g之前,一旦删除了一个表,那么该表就会从数据字典里面删除。要恢复该表,需要进行不完全恢复。

  Oracle10g以后,当我们删除表时,默认Oracle只是在数据库字典里面对被删的表的进行了重命名,并没有真正的把表删除。

  (3)闪回表(flashback table)

  

  所谓闪回表,就是将表里的数据会退到历史上的某个时间点,例如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个过程中,数据库仍然可用,而且不需要类似于闪回日志一样的额外空间。闪回表利用的是undo表空间里记录的数据被改变前的值,如果闪回表所需要的undo数据,由于保留的时间超过了初始化参数undo_retention所指定的值,从而导致该undo数据块被其他事务覆盖,就不能恢复到指定的时间点了。

  一、闪回数据库详解

  Flashback Database整个架构包括一个进程Recover Writer(RVWR)后台进程、Flashback Database Log日志和Flash Recovery Area。闪回数据库的实现机理是闪回日志,只要配置了闪回数据库,就会自动创建闪回日志。只要数据库里的数据发生变化,oracle会将数据修改前的旧值保存在闪回日志中。

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

  (1)数据库配置为归档模式

  SQL> select log_mode from v$database; 
    LOG_MODE
    ------------
    NOARCHIVELOG

  SQL> archive log list;
    数据库日志模式             非存档模式
    自动存档             禁用
    存档终点            USE_DB_RECOVERY_FILE_DEST
    最早的联机日志序列     320
    当前日志序列           322
 1、启动归档为归档模式(其与将非归档模式转为归档模式步骤相似):

  (1)保存一致性,先关闭数据库 
   shutdown immediate ;
  (2)启动到mount阶段
   startup mount;
  (3)启动闪回功能
   alter database flashback on; --alter database archivelog;将数据库改为规定模式
  (4)切换到open阶段
   alter database open;
  (5)对数据做一个完整备份
   full backup --可以使用数据泵(expdp)或者使用RMAN
  

  启动闪回功能完善。

 2、配置闪回恢复区(flash recovery area FRA)

  SQL> show parameter db_recovery_file
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  db_recovery_file_dest                string      D:\app\flash_recovery_area
  db_recovery_file_dest_size           big integer 2G

   一般在安装数据库实例时,会让你选择是否开启oracle数据闪回功能,默认是开启的,安装过程中可以配置闪回路径以及闪回空间的大小。

 3、配置闪回保留时间

  SQL> show parameter db_flashback_retention_target
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_flashback_retention_target        integer     1440

    db_flashback_retention_target参数用来控制flashback log 数据保留的时间,默认值是1440,单位是minute,即24小时。

  4、启动数据库实例即可

  5、获取当前时间点和SCN

    SQL> select dbms_flashback.get_system_change_number from dual;
 
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
                    13081009
 
    SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt from dual;
 
    SYSDT
    -------------------
    2013-08-25 21:12:46
 
    SQL> truncate table dept;
    Table truncated

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

  

  SQL> shutdown immediate;

    数据库已经关闭。

   已经卸载数据库。

   ORACLE 例程已经关闭。

  SQL> startup mount;

  ORACLE 例程已经启动。

  Total System Global Area 1071333376 bytes

  Fixed Size                  1348508 bytes

  Variable Size             385879140 bytes

  Database Buffers          679477248

  bytes Redo Buffers                4628480 bytes

  数据库装载完毕。

  SQL> flashback database to timestamp to_timestamp('2013-08-25 21:12:46','yyyy-mm-dd HH24:MI:SS');

闪回完成。

 或者使用 SQL> flashback database to scn 13081009;

 在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库: 
  1)直接alter database open resetlogs打开数据库,当然,指定scn或者timestamp时间点之后产生的数据统统丢失。
  2)先执行alter database open read only命令以read-only模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

  SQL>alter database open read only;

  

查询被truncate的表,是否已经闪回数据。
  SQL> select deptno from dept;
  deptno
  ----------------------------------------
  0105206000001
  0105108040001
  0105304000001
  0105304010001
  010560001
  0105600010001
  0105601000001
  0105602000001

  证明闪回成功。

二、闪回删除
  Oracle10g以后,当我们删除表时,默认Oracle只是在数据库字典里面对被删的表的进行了重命名,并没有真正的把表删除。
  回收站(recyclebin):用来维护表被删除前的名字与删除后系统生成的名字之间的对应关系的数据字典,表上的相关对象(索引、触发器等)也会一并进入回收站。

  SQL> show parameter recycle
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  buffer_pool_recycle                  string      
  db_recycle_cache_size                big integer 0
  recyclebin                                                  on

你可能感兴趣的:(ORACLE)